This part of the tutorial will show you how to create the Flag entity for the CTF Gamerules.
NOTE: This code will need modifying to suit your team system,ect so don't take this as a complete C&P (which it basically is).
Ok firstly create a header file called ctf_gameplay.h and put the following in it:
| |
#define FLAG_STOLEN 1 #define FLAG_CAPTURE 2 #define FLAG_DROPPED 3
class CObjectFlag : public CBaseEntity { public: void Spawn( ); void Precache( ); void Touch(CBaseEntity *); bool m_fIsInPlay; };
class CDroppedFlag : public CBaseEntity { public: void Spawn( ); void Precache( ); void Touch(CBaseEntity *); };
|
In player.h, put the following in class CBasePlayer : public CBaseMonster in the publics:
Next make a file called ctf_gameplay.cpp and put the following in it:
| |
#include "extdll.h" #include "decals.h" #include "util.h" #include "cbase.h" #include "monsters.h" #include "weapons.h" #include "nodes.h" #include "player.h" #include "soundent.h" #include "shake.h" #include "gamerules.h" #include "ctf_object.h" #include "teamplay_gamerules.h"
LINK_ENTITY_TO_CLASS( object_flag, CObjectFlag );
void CObjectFlag :: Spawn( ) { Precache( ); SET_MODEL( ENT(pev), "models/flag.mdl" ); UTIL_SetOrigin( pev, pev->origin + Vector(0,0,10) ); UTIL_SetSize( pev, Vector(-16,-16,0), Vector(16,16,16) );
pev->movetype = MOVETYPE_TOSS;
pev->solid = SOLID_TRIGGER;
SetTouch(Touch);
pev->renderfx = kRenderFxGlowShell; pev->rendercolor.x = 255; pev->rendercolor.y = 0; pev->rendercolor.z = 0; pev->renderamt = 10;
m_fIsInPlay = false; }
void CObjectFlag :: Precache( ) { PRECACHE_MODEL( "models/flag.mdl" ); }
void CObjectFlag :: Touch(CBaseEntity *pOther) { if(m_fIsInPlay) return;
if(!pOther) return; if(!pOther->IsPlayer()) return; if(!pOther->IsAlive()) return;
CBasePlayer *pPlayer = (CBasePlayer *)pOther;
UTIL_ClientPrintAll( HUD_PRINTCENTER, UTIL_VarArgs( "%s has the Flag!\n", STRING( pPlayer->pev->netname ))); pPlayer->m_fHasObject = true;
PLAYBACK_EVENT_FULL(0, pPlayer->edict(), g_usObject, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, FLAG_STOLEN, 0, 0, 0);
m_fIsInPlay = true;
pev->effects = EF_NODRAW;
SetTouch(NULL); }
|
| |
LINK_ENTITY_TO_CLASS( dropped_flag, CDroppedFlag );
void CDroppedFlag :: Spawn( ) { Precache( );
SET_MODEL( ENT(pev), "models/flag.mdl" ); UTIL_SetOrigin( pev, pev->origin ); UTIL_SetSize( pev, Vector(-16,-16,0), Vector(16,16,16) );
pev->movetype = MOVETYPE_TOSS;
pev->solid = SOLID_TRIGGER;
SetTouch(Touch);
pev->effects = EF_BRIGHTFIELD; pev->renderfx = kRenderFxGlowShell; pev->rendercolor.x = 255; pev->rendercolor.y = 0; pev->rendercolor.z = 0; pev->renderamt = 10; pev->avelocity.z = 25; }
void CDroppedFlag :: Precache( ) { PRECACHE_MODEL( "models/flag.mdl" ); }
void CDroppedFlag :: Touch(CBaseEntity *pOther) { if(!pOther) return; if(!pOther->IsPlayer()) return; if(!pOther->IsAlive()) return;
CBasePlayer *pPlayer = (CBasePlayer *)pOther;
UTIL_ClientPrintAll( HUD_PRINTCENTER, UTIL_VarArgs( "%s has the Flag!\n", STRING( pPlayer->pev->netname )));
pPlayer->m_fHasObject = true;
PLAYBACK_EVENT_FULL(0, pPlayer->edict(), g_usObject, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, FLAG_STOLEN, 0, 0, 0);
SetThink(SUB_Remove);
pev->nextthink = gpGlobals->time; } |
Now in teamplay_gamerules in, void CHalfLifeTeamplay :: PlayerKilled put the following:
| | if( pVictim->m_fHasObject ) { UTIL_ClientPrintAll( HUD_PRINTNOTIFY, UTIL_VarArgs( "%s has dropped the Flag!\n", STRING( pPlayer->pev->netname )));
CDroppedFlag *pFlag = (CDroppedFlag *)CBaseEntity::Create("dropped_flag", pVictim->pev->origin, pVictim->pev->angles);
pVictim->m_fHasObject = false;
PLAYBACK_EVENT_FULL(0, pVictim->edict(), g_usObject, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, FLAG_DROPPED, 0, 0, 0); } |
Now in multiplay_gamerules.cpp in, void CHalfLifeMultiplay :: ClientDisconnected( edict_t *pClient ) put the following below this part:
| | if ( pClient ) { CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance( pClient ); |
| | if( pPlayer->m_fHasObject ) { UTIL_ClientPrintAll( HUD_PRINTNOTIFY, UTIL_VarArgs( "%s has dropped the Flag!\n", STRING( pPlayer->pev->netname )));
CDroppedFlag *pFlag = (CDroppedFlag *)CBaseEntity::Create("dropped_flag", pPlayer->pev->origin, pPlayer->pev->angles);
pPlayer->m_fHasObject = false;
PLAYBACK_EVENT_FULL(0, pPlayer->edict(), g_usObject, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, FLAG_DROPPED, 0, 0, 0);
} |
Now in weapons.cpp find, DLL_GLOBAL short g_sModelIndexBloodSpray; and put the following after it:
| | DLL_GLOBAL unsigned short g_usObject; |
Now find g_sModelIndexBloodSpray = PRECACHE_MODEL ("sprites/bloodspray.spr"); and put the following after it:
| | g_usObject = PRECACHE_EVENT(1, "events/object.sc"); |
Now in weapons.h fine, extern DLL_GLOBAL short g_sModelIndexBloodSpray; and put the following after it:
| | extern DLL_GLOBAL unsigned short g_usObject; | |