|
|
Diskusn boardy |
|
|
|
Najnovie lnky |
|
Automatická textová správa Vocko Tutoril 07.06.2009 : 11:02:12
|
V tomto tutoriále si spravíme automatickú textovú správu, ktorá sa prehraje vždy s nejakým zvukom. |
|
|
|
|
Env_mirror alebo zrkadlenie modelov Vocko Tutoril 24.04.2009 : 18:49:30
|
Tutoriál na zrkadlenie tu už je, ale èo ak chceme odráža i modely? Na tom nám poslúži entita env_mirror, ktorá sa nachádza iba v Spirite 1.4 alebo novšej verzii. |
|
|
HL2 : Obloukový prùchod R4z0r Tutoril 01.05.2008 : 05:48:46
|
Dnes si ukážeme zpùsob, jak vytvoøit elegantní obloukový prùchod, bez nutnosti používat øezání geometrie brushem... |
|
|
|
|
Pridanie mp3 do spiritu NICKSss Tutoril 02.03.2008 : 20:55:09
|
Návod na pridanie mp3 do Half-Life 1 alebo Spirt 1.2,otestované na verzii 1.2.
Asi už mate zbrane add-ons vo Spirite 1.2 a nechcete prejst na ver.1.4 lebo všetko stratite
pre Mp3... Na internete som našiel návody pre HL1 a po anglicky ktoré po skompilovani
fungovali asi takto : Aplikácia HL.EXE Neodpovedá... |
|
|
*locus Deli Tutoril 22.02.2008 : 20:13:47
|
Pre niektorých mapperov neznámy pojem, ale pre niektorých ve¾mi úèinná pomôcka.
Vïaka tomuto príspevku sa vám posnažím priblíži tajomstvá jednej z najväèších zbraní spiritu.
|
|
|
Spirit of Half-Life - Predstavenie Wizz Tutoril 27.10.2007 : 08:52:04
|
Predtým než sa pustíte do èítania, chcel by som Vás upozorni že èlánok už nemusí by 100% aktualny. Èlánok som totiž napísal ešte za svojich mladých èias - 13. júna 2004, èo je viac ako tri roky. Zverejni som sa ho rozhodol po nátlaku a výhražkach ostatných redaktorov |
|
|
|
M4A1 s odnímate¾ným tlmièom Wizz [20.05.2004 : 12:34:15] 114 Tutoril tan : 3088 Priemern znmka : 1.38 |
Teraz si priprogramujeme M4A1 carbine do Half-Life. Aby to ale nebolo také jednoduché, budeme môc nasadzova tlmiè, ktorý bude ovplivnova zvuk. Použijeme vydarený model z Counter-Strike.
Takže zaèneme kopírovaním. Z adresára "cstrike/models/" skopírujte súbory p_m4a1.mdl, v_m4a1.mdl a w_m4a1.mdl do adresára "valve/models". Teraz chodte do adresára "cstrike/sound/weapons/", zoberte a skopírujte všetky zvuky ktoré sa zaèínajú na m4a1 do adresára "valve/sound/weapons". To by bolo.
Otvorte VC++ a HL SDK. Vytvorte nový súbor m4.cpp a vložte do neho nasledujúci kod.Mimochodom, daèo som pokomentoval a princíp je rozpísaný na konci èlánku. Èervený text je dôležitý.
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "soundent.h"
#include "gamerules.h"
enum m4_e
{
// vypis vsetkych animaci M4
// podla poradia ako su v
// subore v_m4a1.mdl
M4_IDLE = 0,
M4_SHOOT1,
M4_SHOOT2,
M4_SHOOT3,
M4_RELOAD,
M4_DRAW,
M4_ADD_SILENCER,
M4_IDLE_UNSIL,
M4_SHOOT1_UNSIL,
M4_SHOOT2_UNSIL,
M4_SHOOT3_UNSIL,
M4_RELOAD_UNSIL,
M4_DRAW_UNSIL,
M4_DETACH_SILENCER,
};
class CM4 : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 3; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void SecondaryAttack( void );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
float m_flNextAnimTime;
int m_iShell;
int tlmic;
// tato premenna bude uchovavat stav tlmica
// 0 - bez tlmica
// 1 - s tlmicom
private:
unsigned short m_usM4;
};
LINK_ENTITY_TO_CLASS( weapon_m4, CM4 );
//=========================================================
//=========================================================
void CM4::Spawn( )
{
pev->classname = MAKE_STRING("weapon_m4"); // hack to allow for old names
Precache( );
SET_MODEL(ENT(pev), "models/w_m4a1.mdl");
m_iId = WEAPON_M4;
m_iDefaultAmmo = M4_DEFAULT_GIVE;
FallInit();// get ready to fall down.
}
void CM4::Precache( void )
{
PRECACHE_MODEL("models/v_m4a1.mdl");
PRECACHE_MODEL("models/w_m4a1.mdl");
PRECACHE_MODEL("models/p_m4a1.mdl");
m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shellTE_MODEL
PRECACHE_MODEL("models/w_9mmARclip.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
PRECACHE_SOUND("items/clipinsert1.wav");
PRECACHE_SOUND("items/cliprelease1.wav");
// PRECACHE_SOUND("items/guncock1.wav");
PRECACHE_SOUND ("weapons/hks1.wav");// H to the K
PRECACHE_SOUND ("weapons/hks2.wav");// H to the K
PRECACHE_SOUND ("weapons/hks3.wav");// H to the K
PRECACHE_SOUND( "weapons/glauncher.wav" );
PRECACHE_SOUND( "weapons/glauncher2.wav" );
PRECACHE_SOUND ("weapons/357_cock1.wav");
PRECACHE_SOUND ("weapons/m4a1_unsil-1.wav");// strelba bez tlmica
PRECACHE_SOUND ("weapons/m4a1-1.wav"); // strelba s tlmicom
}
int CM4::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "9mm";
p->iMaxAmmo1 = _9MM_MAX_CARRY;
p->iMaxClip = M4_MAX_CLIP;
p->iSlot = 2;
p->iPosition = 3;
p->iFlags = 0;
p->iId = m_iId = WEAPON_M4;
p->iWeight = 20;
return 1;
}
int CM4::AddToPlayer( CBasePlayer *pPlayer )
{
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
BOOL CM4::Deploy( )
{
if (tlmic)
{
return DefaultDeploy( "models/v_m4a1.mdl", "models/p_m4a1.mdl", M4_DRAW, "m4" );
}
else
{
return DefaultDeploy( "models/v_m4a1.mdl", "models/p_m4a1.mdl", M4_DRAW_UNSIL, "m4" );
}
}
void CM4::PrimaryAttack()
{
// don't fire underwater
if (m_pPlayer->pev->waterlevel == 3)
{
PlayEmptySound( );
m_flNextPrimaryAttack = gpGlobals->time + 0.15;
return;
}
if (m_iClip <= 0)
{
PlayEmptySound();
m_flNextPrimaryAttack = gpGlobals->time + 0.15;
return;
}
if (tlmic)
{
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/m4a1-1.wav", RANDOM_FLOAT(0.9, 1.0), ATTN_NORM);
SendWeaponAnim( M4_SHOOT1 );
}
else
{
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/m4a1_unsil-1.wav", RANDOM_FLOAT(0.9, 1.0), ATTN_NORM);
SendWeaponAnim( M4_SHOOT1_UNSIL );
}
Vector vecShellVelocity = m_pPlayer->pev->velocity + gpGlobals->v_right * RANDOM_FLOAT(50,70) + gpGlobals->v_up * RANDOM_FLOAT(100,150) + gpGlobals->v_forward * 5 ;
EjectBrass ( pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_up * -8 + gpGlobals->v_forward * 15 + gpGlobals->v_right * 4 , vecShellVelocity, pev->angles.y, m_iShell, TE_BOUNCE_SHELL );
m_pPlayer->pev->punchangle.x -= 0.7;
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
m_iClip--;
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
Vector vecSrc = m_pPlayer->GetGunPosition( );
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
m_pPlayer->FireBullets (1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 16000, BULLET_PLAYER_9MM, 0.5, 4);
if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)
// HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0);
m_flNextPrimaryAttack = m_flNextPrimaryAttack + 0.1;
if (m_flNextPrimaryAttack < gpGlobals->time)
m_flNextPrimaryAttack = gpGlobals->time + 0.1;
m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT ( 10, 15 );
}
void CM4::SecondaryAttack( void )
{
if (tlmic)
{
SendWeaponAnim( M4_DETACH_SILENCER );
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 2;
tlmic = 0;
}
else
{
SendWeaponAnim( M4_ADD_SILENCER );
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 2;
tlmic = 1;
}
pev->nextthink = gpGlobals->time + 0.1;
m_flNextSecondaryAttack = gpGlobals->time + 1.0;
}
void CM4::Reload( void )
{
if (tlmic)
{
DefaultReload( M4_MAX_CLIP, M4_RELOAD, 1.5 );
}
else
{
DefaultReload( M4_MAX_CLIP, M4_RELOAD_UNSIL, 1.5 );
}
}
void CM4::WeaponIdle( void )
{
ResetEmptySound( );
m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
if (m_flTimeWeaponIdle > gpGlobals->time)
return;
if (tlmic)
{
SendWeaponAnim( M4_IDLE );
}
else
{
SendWeaponAnim( M4_IDLE_UNSIL);
}
m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT ( 10, 15 );// how long till we do this again.
}
class CM4AmmoClip : public CBasePlayerAmmo
{
void Spawn( void )
{
Precache( );
SET_MODEL(ENT(pev), "models/w_9mmARclip.mdl");
CBasePlayerAmmo::Spawn( );
}
void Precache( void )
{
PRECACHE_MODEL ("models/w_9mmARclip.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
}
BOOL AddAmmo( CBaseEntity *pOther )
{
int bResult = (pOther->GiveAmmo( AMMO_M4CLIP_GIVE, "9mm", _9MM_MAX_CARRY) != -1);
if (bResult)
{
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
}
return bResult;
}
};
LINK_ENTITY_TO_CLASS( ammo_m4clip, CM4AmmoClip );
LINK_ENTITY_TO_CLASS( ammo_m4, CM4AmmoClip );
|
Ok, teraz chodte do súboru weapons.cpp, nájdite nasledujúci text a podneho vložte rovno ten èervený :
// mp5
UTIL_PrecacheOtherWeapon( "weapon_9mmAR" );
UTIL_PrecacheOther( "ammo_9mmAR" );
UTIL_PrecacheOther( "ammo_ARgrenades" );
// m4
UTIL_PrecacheOtherWeapon( "weapon_m4" );
UTIL_PrecacheOther( "ammo_m4" ); |
teraz
#define WEAPON_SATCHEL 14
#define WEAPON_SNARK 15
#define WEAPON_M4 16 |
a ešte
#define MP5_MAX_CLIP 50
#define MP5_DEFAULT_AMMO 25
#define M4_MAX_CLIP 30
#define M4_DEFAULT_AMMO 30 |
a ešte ...
#define MP5_DEFAULT_GIVE 25
#define MP5_DEFAULT_AMMO 25
#define M4_DEFAULT_GIVE 30
#define M4_DEFAULT_AMMO 30 |
a ešte ......
#define AMMO_357BOX_GIVE PYTHON_MAX_CLIP
#define AMMO_MP5CLIP_GIVE MP5_MAX_CLIP
#define AMMO_M4CLIP_GIVE 30 |
To by bolo z weapons.h všetko, skoème ešte do súboru player.cpp a doplnte :
GiveNamedItem( "weapon_handgrenade" );
GiveNamedItem( "weapon_tripmine" );
GiveNamedItem( "weapon_m4" );
GiveNamedItem( "ammo_m4" ); |
Hurá hurá,A je to hotové :D Skompilujte dll, spustite HL a do konzoly napíšte príkaz "impulse 101" a dajte si do rúk M4A1. Pravým tlaèítkom nasadzujete a zosadzujete tlmiè.
Ako to vlastne funguje ?? Ve¾mi jednoducho, dá sa poveda. Súbor "v_m4a1.mdl" obsahuje všetky animácie s aj bez tlmièa. Tak sme si vytvorili premennú "tlmic" v ktoréj budeme uchováva stav : 0 - tlmiè neni nasadený, 1 - tlmiè je nasadený. Podla toho èi obsahuje premenná "tlmic" 0 alebo 1 budeme spúšta animácie a zvuky buï s tlmièom alebo bez. Funkciu "SecondaryAttack" použijeme pritom na "prepínanie" hodnôt tlmièa a ešte ku tomu spustíme príslušnú animáciu. Ako som vravel, ¾ahké ako facka. Vela zdaru. |
BODOVANIE LNKU Boduje sa ako v kole (1- vborn, 5-zl)
Priemern znmka : 1.38 Hlasovalo : 8
|
|
|
|
|