You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
5.3 KiB
208 lines
5.3 KiB
//++ BulliT |
|
|
|
#include "extdll.h" |
|
#include "util.h" |
|
#include "cbase.h" |
|
#include "player.h" |
|
#include "trains.h" |
|
#include "nodes.h" |
|
#include "weapons.h" |
|
#include "soundent.h" |
|
#include "monsters.h" |
|
#include "../engine/shake.h" |
|
#include "agglobal.h" |
|
#include "gamerules.h" |
|
|
|
extern DLL_GLOBAL g_fGameOver; |
|
|
|
//TITLES FOR HALF-LIFE |
|
// Position command $position x y |
|
// x & y are from 0 to 1 to be screen resolution independent |
|
// -1 means center in each dimension |
|
// Effect command $effect <effect number> |
|
// effect 0 is fade in/fade out |
|
// effect 1 is flickery credits |
|
// effect 2 is write out (training room) |
|
// Text color r g b command $color |
|
// fadein time fadeout time / hold time |
|
// $fadein (message fade in time - per character in effect 2) |
|
// $fadeout (message fade out time) |
|
// $holdtime (stay on the screen for this long) |
|
void AgSay(CBasePlayer* pPlayer,const AgString& sText, float* pfFloodProtected, float fHoldTime, float x, float y, int iChannel) |
|
{ |
|
if (g_fGameOver) |
|
return; |
|
|
|
if (pfFloodProtected) |
|
{ |
|
if (*pfFloodProtected > gpGlobals->time) |
|
return; |
|
|
|
*pfFloodProtected = gpGlobals->time + fHoldTime; |
|
} |
|
|
|
|
|
hudtextparms_t hText; |
|
memset(&hText, 0, sizeof(hText)); |
|
hText.channel = iChannel; |
|
// These X and Y coordinates are just above |
|
// the health meter. |
|
hText.x = x; |
|
hText.y = y; |
|
|
|
hText.r1 = hText.g1 = hText.b1 = 180; |
|
hText.a1 = 0; |
|
|
|
hText.r2 = hText.g2 = hText.b2 = 0; |
|
hText.a2 = 0; |
|
|
|
hText.holdTime = fHoldTime - 0.30; |
|
|
|
hText.effect = 2; // Fade in/out |
|
hText.fadeinTime = 0.01; |
|
hText.fadeoutTime = fHoldTime/5; |
|
hText.fxTime = 0.25; |
|
|
|
if (pPlayer) |
|
{ |
|
UTIL_HudMessage(pPlayer,hText, sText.c_str()); |
|
} |
|
else |
|
{ |
|
for (int i = 1; i <= gpGlobals->maxClients; i++) |
|
{ |
|
CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); |
|
if (pPlayerLoop) |
|
UTIL_HudMessage(pPlayerLoop,hText, sText.c_str()); |
|
} |
|
} |
|
} |
|
|
|
void AgConsole(const AgString& sText, CBasePlayer* pPlayer) |
|
{ |
|
if (pPlayer && pPlayer->pev) |
|
{ |
|
ClientPrint(pPlayer->pev, HUD_PRINTCONSOLE, UTIL_VarArgs("%s\n", sText.c_str())); |
|
ClientPrint(pPlayer->pev, HUD_PRINTCENTER , UTIL_VarArgs("%s\n", sText.c_str())); |
|
} |
|
else |
|
{ |
|
g_engfuncs.pfnServerPrint(UTIL_VarArgs("%s\n", sText.c_str())); |
|
} |
|
} |
|
|
|
CBasePlayer* AgPlayerByIndex(int iPlayerIndex ) |
|
{ |
|
CBasePlayer* pPlayer = NULL; |
|
|
|
if ( iPlayerIndex > 0 && iPlayerIndex <= gpGlobals->maxClients ) |
|
{ |
|
edict_t *pPlayerEdict = INDEXENT( iPlayerIndex ); |
|
if ( pPlayerEdict && !pPlayerEdict->free && pPlayerEdict->pvPrivateData) |
|
{ |
|
CBaseEntity* pEnt = (CBaseEntity *)CBaseEntity::Instance( pPlayerEdict ); |
|
if (pEnt && pEnt->pev && CLASS_PLAYER == pEnt->Classify()) |
|
{ |
|
if (pEnt->pev->netname && 0 != STRING(pEnt->pev->netname)[0]) |
|
{ |
|
pPlayer = (CBasePlayer*)pEnt; |
|
} |
|
} |
|
} |
|
} |
|
|
|
return pPlayer; |
|
} |
|
|
|
void AgResetMap() |
|
{ |
|
CBaseEntity* pEntity = NULL; |
|
|
|
edict_t* pEdict = g_engfuncs.pfnPEntityOfEntIndex( 1 ); |
|
for ( int i = 1; i < gpGlobals->maxEntities; i++, pEdict++ ) |
|
{ |
|
pEntity = CBaseEntity::Instance( pEdict ); |
|
if (pEntity && pEntity->pev) |
|
{ |
|
const char* pszClass = STRING(pEntity->pev->classname); |
|
|
|
if (pszClass && '\0' != pszClass[0]) |
|
{ |
|
if (0 == strncmp( pszClass, "weapon_", 7 ) || |
|
0 == strncmp( pszClass, "ammo_", 5 ) || |
|
0 == strncmp( pszClass, "item_", 5 ) ) |
|
{ |
|
pEntity->pev->nextthink = gpGlobals->time; |
|
} |
|
} |
|
} |
|
} |
|
|
|
pEntity = NULL; |
|
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "weaponbox" )) != NULL) |
|
UTIL_Remove(pEntity); |
|
|
|
pEntity = NULL; |
|
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "monster_satchel" )) != NULL) |
|
UTIL_Remove(pEntity); |
|
|
|
pEntity = NULL; |
|
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "monster_tripmine" )) != NULL) |
|
UTIL_Remove(pEntity); |
|
|
|
pEntity = NULL; |
|
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "monster_snark" )) != NULL) |
|
UTIL_Remove(pEntity); |
|
|
|
pEntity = NULL; |
|
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "beam" )) != NULL) |
|
UTIL_Remove(pEntity); |
|
|
|
pEntity = NULL; |
|
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "rpg_rocket" )) != NULL) |
|
pEntity->pev->dmg = 0; |
|
|
|
pEntity = NULL; |
|
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "grenade" )) != NULL) |
|
pEntity->pev->dmg = 0; |
|
} |
|
|
|
|
|
#define ADD_SERVER_COMMAND ( *g_engfuncs.pfnAddServerCommand ) |
|
|
|
void AgStart(void) |
|
{ |
|
//Loop through all active players, reset Score and respawn. |
|
for ( int i = 1; i <= gpGlobals->maxClients; i++ ) |
|
{ |
|
CBasePlayer* pPlayerLoop = AgPlayerByIndex(i); |
|
if (pPlayerLoop) |
|
{ |
|
if (pPlayerLoop->IsSpectator()) |
|
{ |
|
//Regular spectators aint spawned when match is restarted. |
|
pPlayerLoop->ResetScore(); //Reset the score. |
|
continue; |
|
} |
|
else |
|
{ |
|
pPlayerLoop->ResetScore(); //Reset the score. |
|
pPlayerLoop->RespawnMatch(); //Now spawn the sucker :-) |
|
} |
|
} |
|
} |
|
g_pGameRules->m_fGameStart = gpGlobals->time; |
|
AgResetMap(); |
|
} |
|
|
|
DLL_GLOBAL cvar_t ag_version = {"ag_version","0.1", FCVAR_SERVER }; |
|
DLL_GLOBAL cvar_t ag_url = {"ag_url","www.planethalflife.com/agmod", FCVAR_SERVER }; |
|
|
|
void AgInitGame() |
|
{ |
|
CVAR_REGISTER(&ag_version); |
|
CVAR_REGISTER(&ag_url); |
|
ADD_SERVER_COMMAND("agstart",AgStart); |
|
} |
|
|
|
//-- Martin Webrant
|
|
|