|
|
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  |
|
|
|
MP5A1 Frco [09.08.2004 : 19:18:49] 134 Tutoril 
tan : 3684
Priemern znmka : 1.3 |
Takže si spravíme mp5ku z CS, urèite ju všetci poznáte... Tak zaèneme, treba skopírovat w_mp5.mdl, p_mp5.mdl, v_mp5.mdl a so zvukov mp5_clipin.wav, mp5_clipout.wav, mp5_slideback.wav, mp5-1.wav a mp5-2.wav
to by bolo pre kopírovanie
Ako prve v hl.dsw vytvorme nový súbor ktorý sa bude vola mp5a1.cpp a dáme tam tento TEXT:
// MP5A1 START
// mp5a1.cpp
#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 mp5a1_e
{
MP5A1_IDLE1 = 0,,
MP5A1_RELOAD,
MP5A1_DRAW,
MP5A1_SHOOT1,
MP5A1_SHOOT2,
MP5A1_SHOOT3,
};
LINK_ENTITY_TO_CLASS( weapon_mp5a1, CMP5A1 );
//=========================================================
//=========================================================
void CMP5::Spawn( )
{
pev->classname = MAKE_STRING("weapon_mp5a1"); // hack to allow for old names
Precache( );
SET_MODEL(ENT(pev), "models/w_mp5.mdl");
m_iId = WEAPON_MP5A1;
m_iDefaultAmmo = MP5A1_DEFAULT_GIVE;
FallInit();// get ready to fall down.
}
void CMP5A1::Precache( void )
{
PRECACHE_MODEL("models/v_mp5.mdl");
PRECACHE_MODEL("models/w_mp5.mdl");
PRECACHE_MODEL("models/p_mp5.mdl");
m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shellTE_MODEL
PRECACHE_MODEL("models/w_9mmARclip.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
PRECACHE_SOUND("weapons/mp5_clipin.wav");
PRECACHE_SOUND("weapons/mp5_clipout.wav");
PRECACHE_SOUND("weapons/mp5_slideback.wav");
PRECACHE_SOUND ("weapons/mp5-1.wav");
PRECACHE_SOUND ("weapons/mp5-2.wav");
PRECACHE_SOUND ("weapons/357_cock1.wav");
m_usMP5A1 = PRECACHE_EVENT( 1, "events/mp5a1.sc" );
}
int CMP5A1::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "9mm";
p->iMaxAmmo1 = _9MM_MAX_CARRY;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = MP5A1_MAX_CLIP;
p->iSlot = 2;
p->iPosition = 3; // cize bude za kusou
p->iFlags = 0;
p->iId = m_iId = WEAPON_MP5A1;
p->iWeight = MP5A1_WEIGHT;
return 1;
}
int CMP5A1::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 CMP5A1::Deploy( )
{
return DefaultDeploy( "models/v_mp5.mdl", "models/p_mp5.mdl", MP5A1_DRAW, "mp5a1" );
}
void CMP5A1::PrimaryAttack()
{
// don't fire underwater
if (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD)
{
PlayEmptySound( );
m_flNextPrimaryAttack = 0.15;
return;
}
if (m_iClip <= 0)
{
PlayEmptySound();
m_flNextPrimaryAttack = 0.15;
return;
}
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
m_iClip--;
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
Vector vecSrc = m_pPlayer->GetGunPosition( );
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
Vector vecDir;
#ifdef CLIENT_DLL
if ( !bIsMultiplayer() )
#else
if ( !g_pGameRules->IsMultiplayer() )
#endif
{
// optimized multiplayer. Widened to make it easier to hit a moving player
vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_3DEGREES, 8192, BULLET_PLAYER_MP5, 2, 0, m_pPlayer->pev, m_pPlayer->random_seed );
}
else
{
// single player spread
vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_3DEGREES, 8192, BULLET_PLAYER_MP5, 2, 0, m_pPlayer->pev, m_pPlayer->random_seed );
}
int flags;
#if defined( CLIENT_WEAPONS )
flags = FEV_NOTHOST;
#else
flags = 0;
#endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usMP5A1, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
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 = UTIL_WeaponTimeBase() + 0.1;
if ( m_flNextPrimaryAttack < UTIL_WeaponTimeBase() )
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
}
void CMP5A1::Reload( void )
{
if ( m_pPlayer->ammo_9mm <= 0 )
return;
DefaultReload( MP5A1_MAX_CLIP, MP5A1_RELOAD, 1.5 ); // 1.5 = dlzka animacie reloadu v sekundach
}
void CMP5A1::WeaponIdle( void )
{
ResetEmptySound( );
m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return;
int iAnim;
switch ( RANDOM_LONG( 0, 1 ) )
{
case 0:
iAnim = MP5A1_IDLE1;
break;
default:
case 1:
iAnim = MP5A1_IDLE1;
break;
}
SendWeaponAnim( iAnim );
m_flTimeWeaponIdle = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again.
}
class CMP5A1AmmoClip : 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_MP5A1CLIP_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_mp5a1, CMP5A1AmmoClip );
class CMP5A1Chainammo : public CBasePlayerAmmo
{
void Spawn( void )
{
Precache( );
SET_MODEL(ENT(pev), "models/w_chainammo.mdl");
CBasePlayerAmmo::Spawn( );
}
void Precache( void )
{
PRECACHE_MODEL ("models/w_chainammo.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
}
BOOL AddAmmo( CBaseEntity *pOther )
{
int bResult = (pOther->GiveAmmo( AMMO_CHAINBOX_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_mp5a1box, CMP5A1Chainammo );
// MP5A1 END
|
No teraz do func_break.cpp pridáme :
"weapon_mp5a1"
"ammo_mp5a1" |
teraz weapons.cpp a asi v riadku 340 pridame toto
// MP5A1
UTIL_PrecacheOtherWeapon( "weapon_mp5a1" );
UTIL_PrecacheOther( "ammo_mp5a1" );
UTIL_PrecacheOther( "ammo_mp5a1box" ); |
Otvorime weapons.h a v riadku 81 pridáme :
dalej pridame
potom
#define MP5A1_MAX_CLIP 30
#define MP5A1_DEFAULT_AMMO 30 |
ahh...
#define MP5A1_DEFAULT_GIVE 30
#define MP5A1_DEFAULT_AMMO 30 |
ako posledny define
#define AMMO_MP5A1CLIP_GIVE MP5A1_MAX_CLIP |
To by bolo pre definície, teraz pridáme asi v riadku 590 za mp5 toto:
class CMP5A1 : 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 );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
float m_flNextAnimTime;
int m_iShell;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usMP5A1;
}; |
Ak si chcete zbraò prida do cheatu "impulse 101" tak pridajte toto do súboru player.cpp v riadku 3720
GiveNamedItem( "weapon_mp5a1" );
GiveNamedItem( "ammo_mp5a1" ); |
Tak to by bolo pre server, teraz otvorime cl_dll.dsw a ako prvé pridáme náš súbor mp5a1.cpp do prieèinku HL. No teraz si otvorime ev_hldm.cpp a hneï do riadku 70 pridáme :
void EV_FireMP5A1( struct event_args_s *args ); |
a dole, asi v riadku 770 pridáme toto, je to dôležité aby zbraò strielala. Túto "vec" si niekedy môžete všimnú v *.sc súbore, ale my to dáme sem, tak preto je vždicky súbor prázdny.
//======================
// MP5A1 START
//======================
void EV_FireMP5A1( event_args_t *args )
{
int idx;
vec3_t origin;
vec3_t angles;
vec3_t velocity;
vec3_t ShellVelocity;
vec3_t ShellOrigin;
int shell;
vec3_t vecSrc, vecAiming;
vec3_t up, right, forward;
float flSpread = 0.01;
idx = args->entindex;
VectorCopy( args->origin, origin );
VectorCopy( args->angles, angles );
VectorCopy( args->velocity, velocity );
AngleVectors( angles, forward, right, up );
shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell
if ( EV_IsLocal( idx ) )
{
// Add muzzle flash to current weapon model
EV_MuzzleFlash();
gEngfuncs.pEventAPI->EV_WeaponAnimation( MP5_FIRE1 + gEngfuncs.pfnRandomLong(0,0), 1 );
V_PunchAxis( 0, gEngfuncs.pfnRandomFloat( -2, 2 ) ); // hadzanie obrazovkou pri strelbe
}
EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20, -12, 4 );
EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL );
switch( gEngfuncs.pfnRandomLong( 0, 1 ) )
{
case 0:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/mp5-1.wav", 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong( 0, 0xf ) );
break;
case 1:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/mp5-2.wav", 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong( 0, 0xf ) );
break;
}
EV_GetGunPosition( args, vecSrc, origin );
VectorCopy( forward, vecAiming );
if ( gEngfuncs.GetMaxClients() > 1 )
{
EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_MP5, 2, &tracerCount[idx-1], args->fparam1, args->fparam2 );
}
else
{
EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_MP5, 2, &tracerCount[idx-1], args->fparam1, args->fparam2 );
}
}
//======================
// MP5A1 END
//====================== |
A teraz do ev_hldm.h pridáme v riadku 78 animácie, tak ako v mp5a1.cpp
enum mp5a1_e
{
MP5A1_IDLE1 = 0,,
MP5A1_RELOAD,
MP5A1_DRAW,
MP5A1_SHOOT1,
MP5A1_SHOOT2,
MP5A1_SHOOT3,
}; |
Tieto animácie sa musia zhodova vo mp5a1.cpp a to aj s modelom. No a teraz si ešte dokonèíme tie eventy takže do hl_events.cpp pridáme toto :
void EV_FireMP5A1( struct event_args_s *args ); |
a ešte toto :
gEngfuncs.pfnHookEvent( "events/mp5a1.sc",EV_FireMP5A1 ); |
No a ako posledný subor v kódovani je ešte hl_weapons.cpp v riadku 69 pridáme :
Teraz v riadku 644 toto :
HUD_PrepEntity( &g_Mp5a1 , &player ); |
A ako posledne toto pridáme v riadku 764 :
case WEAPON_MP5A1:
pWeapon = &g_Mp5a1;
break; |
Teraz skompilujte atï... .V prieèinku SPRITES vytvorte nový súbor weapon_mp5a1.txt a vložte doò tento text :
// mp5a1
10
weapon 320 320hud1 0 120 80 20
weapon_s 320 320hud1 0 140 80 20
ammo 320 320hud2 0 16 18 18
crosshair 320 crosshairs 0 48 24 24
autoaim 320 crosshairs 48 72 24 24
weapon 640 640hud1 0 135 170 45
weapon_s 640 640hud4 0 135 170 45
ammo 640 640hud7 0 72 24 24
crosshair 640 crosshairs 0 48 24 24
autoaim 640 crosshairs 48 72 24 24 |
Použil som sprity m4ky z hl. Teraz otvorte hud.txt a úplne navrch kde je "123" zmeòte na "125", to znamená že sú dva nové sprity. Neviem èi je to potrebné, ale pre istotu som to spravil.
A dolu k ostatnim pridajte toto :
d_MP5A1 320 320hud1 48 208 48 16 |
a
d_MP5A1 640 640hud1 192 48 48 16 |
PS : Nezabudnite si spravi prázdny súbor mp5a1.sc v prieèinku events.
A TO JE VSJO! Nemaly by nasta chyby, ale ak hej, tak si ich opravte ale ak by ste potrebovali help tak ma môžte kontaktova. |
BODOVANIE LNKU Boduje sa ako v kole (1- vborn, 5-zl)
Priemern znmka : 1.3 Hlasovalo : 10
|
KOMENTRE KU LNKU Poet komentrov ku lnku : 12
5. Frco  [15.08.2004-11:41] 359 | hmm pre ja som to robil v spirite ale malo by to asi fungovat aj na ostatnich SDKackach. robil som to podla originalnej zbrani MP5I Take The Plane! |
9. ^NK&MH^Jurom@ster ABCD [16.08.2004-03:26] 363 | preboha co vam faka ? sak to je spravena podla ORGINALNEJ MP5 od VALVE cize to nijako nesuvisi so
spiritom, nie su tam ziadne funkcie podmienene spiritom ani
subory... normalna zbran pre HL - zbraniam co robil majacik
chybaju niektore veci, ktore Spirit potrebuje... a FRCO spravil kompletnu zbran z HL so vsetkym co jej patri
tak vyskusajte pod HL SDK |
10. qery  [16.08.2004-09:53] 364 | 2jackar: ja to robym vsetko s klasickimi sdkackami...:P[rmb]qery -=HL4ever=- qery.no-ip.com | Pre pridvanie komentrov muste by prihlsen Pokia ete nieste zaregistrovan, mete tak urobi TU
|
|
|
|
|