Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform.
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.

1097 lines
32 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 "agcommand.h"
#include "agwallhack.h"
#include "gamerules.h"
#include <time.h>
#ifndef _WIN32
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#endif
void AgInitTimer();
#ifdef AG_NO_CLIENT_DLL
DLL_GLOBAL cvar_t ag_version = {"sv_ag_version","6.6mini", FCVAR_SERVER };
#else
DLL_GLOBAL cvar_t ag_version = {"sv_ag_version","6.6", FCVAR_SERVER };
#endif
DLL_GLOBAL cvar_t ag_gamemode = {"sv_ag_gamemode","ffa", FCVAR_SERVER }; //The current gamemode
DLL_GLOBAL cvar_t ag_allowed_gamemodes = {"sv_ag_allowed_gamemodes",""};
DLL_GLOBAL cvar_t ag_pure = {"sv_ag_pure","0",FCVAR_SERVER }; //Default off.
DLL_GLOBAL cvar_t ag_match_running = {"sv_ag_match_running","0",FCVAR_SERVER|FCVAR_UNLOGGED}; //Default not match. Protects players from wondering into the server.
DLL_GLOBAL cvar_t ag_oldphysics = {"sv_ag_oldphysics","1"};
DLL_GLOBAL cvar_t ag_allow_timeout = {"sv_ag_allow_timeout","1"}; //Allow timeout.
DLL_GLOBAL cvar_t ag_allow_vote = {"sv_ag_allow_vote","1", FCVAR_SERVER|FCVAR_UNLOGGED}; //Voting is enabled by default.
DLL_GLOBAL cvar_t ag_vote_start = {"sv_ag_vote_start","1", FCVAR_SERVER|FCVAR_UNLOGGED}; //Start voting enabled by default
DLL_GLOBAL cvar_t ag_vote_setting = {"sv_ag_vote_setting","1"}; //Setting voting enabled by default
DLL_GLOBAL cvar_t ag_vote_gamemode = {"sv_ag_vote_gamemode","1", FCVAR_SERVER|FCVAR_UNLOGGED}; //Gamemode voting is enabled by default.
DLL_GLOBAL cvar_t ag_vote_kick = {"sv_ag_vote_kick","0"}; //Kick voting is disabled by default.
DLL_GLOBAL cvar_t ag_vote_allow = {"sv_ag_vote_allow","1"}; //All voting is enabled by default.
DLL_GLOBAL cvar_t ag_vote_admin = {"sv_ag_vote_admin","0"}; //Admin voting is disabled by default.
DLL_GLOBAL cvar_t ag_vote_map = {"sv_ag_vote_map","1", FCVAR_SERVER|FCVAR_UNLOGGED}; //Map voting is enabled by default.
DLL_GLOBAL cvar_t ag_vote_failed_time = {"sv_ag_vote_failed_time","30"};
DLL_GLOBAL cvar_t ag_start_minplayers = {"sv_ag_start_minplayers","2"};
DLL_GLOBAL cvar_t ag_vote_mp_timelimit_low = {"sv_ag_vote_mp_timelimit_low","10"};
DLL_GLOBAL cvar_t ag_vote_mp_timelimit_high = {"sv_ag_vote_mp_timelimit_high","40"};
DLL_GLOBAL cvar_t ag_vote_mp_fraglimit_low = {"sv_ag_vote_mp_fraglimit_low","0"};
DLL_GLOBAL cvar_t ag_vote_mp_fraglimit_high = {"sv_ag_vote_mp_fraglimit_high","100"};
DLL_GLOBAL cvar_t ag_floodmsgs = {"sv_ag_floodmsgs","4"};
DLL_GLOBAL cvar_t ag_floodpersecond = {"sv_ag_floodpersecond","4"};
DLL_GLOBAL cvar_t ag_floodwaitdelay = {"sv_ag_floodwaitdelay","10"};
DLL_GLOBAL cvar_t ag_player_id = {"sv_ag_player_id","5"}; //Default 5 seconds.
DLL_GLOBAL cvar_t ag_auto_admin = {"sv_ag_auto_admin","1"}; //Default 1 = Autoauthenticate admins based on won id.
DLL_GLOBAL cvar_t ag_lj_timer = {"sv_ag_lj_timer","0"}; //Default 0 = turned off.
DLL_GLOBAL cvar_t ag_wallgauss = {"sv_ag_wallgauss","1"}; //Default 1 = Lame wallgauss on.
DLL_GLOBAL cvar_t ag_headshot = {"sv_ag_headshot","3"}; //Default 3 = 3 times damage
DLL_GLOBAL cvar_t ag_blastradius = {"sv_ag_blastradius","1"}; //Default 1 = Standard radius
DLL_GLOBAL cvar_t ag_ban_crowbar = {"sv_ag_ban_crowbar","0"};
DLL_GLOBAL cvar_t ag_ban_glock = {"sv_ag_ban_glock","0"};
DLL_GLOBAL cvar_t ag_ban_357 = {"sv_ag_ban_357","0"};
DLL_GLOBAL cvar_t ag_ban_mp5 = {"sv_ag_ban_mp5","0"};
DLL_GLOBAL cvar_t ag_ban_shotgun = {"sv_ag_ban_shotgun", "0"};
DLL_GLOBAL cvar_t ag_ban_crossbow = {"sv_ag_ban_crossbow", "0"};
DLL_GLOBAL cvar_t ag_ban_rpg = {"sv_ag_ban_rpg","0"};
DLL_GLOBAL cvar_t ag_ban_gauss = {"sv_ag_ban_gauss","0"};
DLL_GLOBAL cvar_t ag_ban_egon = {"sv_ag_ban_egon","0"};
DLL_GLOBAL cvar_t ag_ban_hornet = {"sv_ag_ban_hornet","0"};
DLL_GLOBAL cvar_t ag_ban_hgrenade = {"sv_ag_ban_hgrenade","0"};
DLL_GLOBAL cvar_t ag_ban_satchel = {"sv_ag_ban_satchel","0"};
DLL_GLOBAL cvar_t ag_ban_tripmine = {"sv_ag_ban_tripmine","0"};
DLL_GLOBAL cvar_t ag_ban_snark = {"sv_ag_ban_snark","0"};
DLL_GLOBAL cvar_t ag_ban_longjump = {"sv_ag_ban_longjump","0"};
DLL_GLOBAL cvar_t ag_ban_m203 = {"sv_ag_ban_m203","0"};
DLL_GLOBAL cvar_t ag_ban_9mmar = {"sv_ag_ban_9mmar","0"};
DLL_GLOBAL cvar_t ag_ban_bockshot = {"sv_ag_ban_bockshot","0"};
DLL_GLOBAL cvar_t ag_ban_uranium = {"sv_ag_ban_uranium","0"};
DLL_GLOBAL cvar_t ag_ban_bolts = {"sv_ag_ban_bolts","0"};
DLL_GLOBAL cvar_t ag_ban_rockets = {"sv_ag_ban_rockets","0"};
DLL_GLOBAL cvar_t ag_ban_357ammo = {"sv_ag_ban_357ammo","0"};
DLL_GLOBAL cvar_t ag_ban_armour = {"sv_ag_ban_armour","0"};
DLL_GLOBAL cvar_t ag_ban_health = {"sv_ag_ban_health","0"};
DLL_GLOBAL cvar_t ag_ban_recharg = {"sv_ag_ban_recharg","0"};
DLL_GLOBAL cvar_t ag_start_crowbar = {"sv_ag_start_crowbar","1"};
DLL_GLOBAL cvar_t ag_start_glock = {"sv_ag_start_glock","1"};
DLL_GLOBAL cvar_t ag_start_357 = {"sv_ag_start_357","0"};
DLL_GLOBAL cvar_t ag_start_mp5 = {"sv_ag_start_mp5","0"};
DLL_GLOBAL cvar_t ag_start_shotgun = {"sv_ag_start_shotgun", "0"};
DLL_GLOBAL cvar_t ag_start_crossbow = {"sv_ag_start_crossbow", "0"};
DLL_GLOBAL cvar_t ag_start_rpg = {"sv_ag_start_rpg","0"};
DLL_GLOBAL cvar_t ag_start_gauss = {"sv_ag_start_gauss","0"};
DLL_GLOBAL cvar_t ag_start_egon = {"sv_ag_start_egon","0"};
DLL_GLOBAL cvar_t ag_start_hornet = {"sv_ag_start_hornet","0"};
DLL_GLOBAL cvar_t ag_start_hgrenade = {"sv_ag_start_hgrenade","0"};
DLL_GLOBAL cvar_t ag_start_satchel = {"sv_ag_start_satchel","0"};
DLL_GLOBAL cvar_t ag_start_tripmine = {"sv_ag_start_tripmine","0"};
DLL_GLOBAL cvar_t ag_start_snark = {"sv_ag_start_snark","0"};
DLL_GLOBAL cvar_t ag_start_longjump = {"sv_ag_start_longjump","0"};
DLL_GLOBAL cvar_t ag_start_m203 = {"sv_ag_start_m203","0"};
DLL_GLOBAL cvar_t ag_start_9mmar = {"sv_ag_start_9mmar","68"};
DLL_GLOBAL cvar_t ag_start_bockshot = {"sv_ag_start_bockshot","0"};
DLL_GLOBAL cvar_t ag_start_uranium = {"sv_ag_start_uranium","0"};
DLL_GLOBAL cvar_t ag_start_bolts = {"sv_ag_start_bolts","0"};
DLL_GLOBAL cvar_t ag_start_rockets = {"sv_ag_start_rockets","0"};
DLL_GLOBAL cvar_t ag_start_357ammo = {"sv_ag_start_357ammo","0"};
DLL_GLOBAL cvar_t ag_start_armour = {"sv_ag_start_armour","0"};
DLL_GLOBAL cvar_t ag_start_health = {"sv_ag_start_health","100"};
DLL_GLOBAL cvar_t ag_dmg_crowbar = {"sv_ag_dmg_crowbar","25"};
DLL_GLOBAL cvar_t ag_dmg_glock = {"sv_ag_dmg_glock","12"};
DLL_GLOBAL cvar_t ag_dmg_357 = {"sv_ag_dmg_357","40"};
DLL_GLOBAL cvar_t ag_dmg_mp5 = {"sv_ag_dmg_mp5","12"};
DLL_GLOBAL cvar_t ag_dmg_shotgun = {"sv_ag_dmg_shotgun", "20"};
DLL_GLOBAL cvar_t ag_dmg_crossbow = {"sv_ag_dmg_crossbow", "20"};
DLL_GLOBAL cvar_t ag_dmg_bolts = {"sv_ag_dmg_bolts","50"};
DLL_GLOBAL cvar_t ag_dmg_rpg = {"sv_ag_dmg_rpg","120"};
DLL_GLOBAL cvar_t ag_dmg_gauss = {"sv_ag_dmg_gauss","20"};
DLL_GLOBAL cvar_t ag_dmg_egon_wide = {"sv_ag_dmg_egon_wide","20"};
DLL_GLOBAL cvar_t ag_dmg_egon_narrow= {"sv_ag_dmg_egon_narrow","10"};
DLL_GLOBAL cvar_t ag_dmg_hornet = {"sv_ag_dmg_hornet","10"};
DLL_GLOBAL cvar_t ag_dmg_hgrenade = {"sv_ag_dmg_hgrenade","100"};
DLL_GLOBAL cvar_t ag_dmg_satchel = {"sv_ag_dmg_satchel","120"};
DLL_GLOBAL cvar_t ag_dmg_tripmine = {"sv_ag_dmg_tripmine","150"};
DLL_GLOBAL cvar_t ag_dmg_m203 = {"sv_ag_dmg_m203","100"};
DLL_GLOBAL cvar_t ag_max_spectators = {"sv_ag_max_spectators","5"};
DLL_GLOBAL cvar_t ag_spec_enable_disable = {"sv_ag_spec_enable_disable","0"};
DLL_GLOBAL cvar_t ag_spectalk = {"ag_spectalk","1"};
DLL_GLOBAL cvar_t ag_spawn_volume = {"sv_ag_spawn_volume","1"};
DLL_GLOBAL cvar_t ag_show_gibs = {"sv_ag_show_gibs","1"};
DLL_GLOBAL cvar_t ag_gametype = {"sv_ag_gametype",""};
DLL_GLOBAL cvar_t ag_ctf_flag_resettime = {"sv_ag_ctf_flag_resettime","30"}; //the time that a dropped flag lays in the world before respawning
DLL_GLOBAL cvar_t ag_ctf_capture_limit = {"sv_ag_ctf_capturelimit","10", FCVAR_SERVER}; //the number of captures before map ends.
DLL_GLOBAL cvar_t ag_ctf_teamcapturepoints = {"sv_ag_ctf_teamcapturepoints","1"}; //the ammount of points his teammates get
DLL_GLOBAL cvar_t ag_ctf_capturepoints = {"sv_ag_ctf_capturepoints","4"}; //the amount of points the capturer gets
DLL_GLOBAL cvar_t ag_ctf_returnpoints = {"sv_ag_ctf_returnpoints","1"}; //the amount of points the returner gets.
DLL_GLOBAL cvar_t ag_ctf_carrierkillpoints = {"sv_ag_ctf_carrierkillpoints","1"}; //the amount of points the killer gets.
DLL_GLOBAL cvar_t ag_ctf_stealpoints = {"sv_ag_ctf_stealpoints","1"}; //the amount of points the stealer gets.
DLL_GLOBAL cvar_t ag_ctf_defendpoints = {"sv_ag_ctf_defendpoints","1"}; //the amount of points the defender gets.
DLL_GLOBAL cvar_t ag_ctf_roundbased = {"sv_ag_ctf_roundbased","0"}; //1 for roundbased CTF game.
//++ muphicks
DLL_GLOBAL cvar_t ag_dom_mincontroltime = {"sv_ag_dom_mincontroltime","5"}; // number of seconds team must control point to score
DLL_GLOBAL cvar_t ag_dom_controlpoints = {"sv_ag_dom_controlpoints", "1"}; // number of points scored when under teams control
DLL_GLOBAL cvar_t ag_dom_resetscorelimit = {"sv_ag_dom_resetscorelimit", "6"}; // max time under 1 teams control 5*6 = 30 seconds
DLL_GLOBAL cvar_t ag_dom_scorelimit = {"sv_ag_dom_scorelimit", "200"}; // max points a team needs to get to win the game
//-- muphicks
DLL_GLOBAL cvar_t ag_gauss_fix = {"ag_gauss_fix","0"}; //Default 0 - no fix.
DLL_GLOBAL cvar_t ag_rpg_fix = {"ag_rpg_fix","0"}; //Default 0 - no fix.
DLL_GLOBAL cvar_t mm_agsay = {"mm_agsay","1", FCVAR_SERVER };
DLL_GLOBAL bool g_bLangame = false;
DLL_GLOBAL bool g_bUseTeamColors = false;
extern AgString g_sGamemode;
void LoadGreetingMessages();
void AgInitGame()
{
AgInitTimer();
CVAR_REGISTER ( &ag_version);
CVAR_REGISTER ( &ag_gamemode);
CVAR_REGISTER ( &ag_allowed_gamemodes);
CVAR_REGISTER ( &ag_allow_vote);
CVAR_REGISTER ( &ag_pure);
CVAR_REGISTER ( &ag_match_running);
CVAR_REGISTER ( &ag_oldphysics);
CVAR_REGISTER ( &ag_player_id);
CVAR_REGISTER ( &ag_lj_timer);
CVAR_REGISTER ( &ag_auto_admin);
CVAR_REGISTER ( &ag_wallgauss);
CVAR_REGISTER ( &ag_headshot);
CVAR_REGISTER ( &ag_blastradius);
CVAR_REGISTER ( &ag_ban_crowbar);
CVAR_REGISTER ( &ag_ban_glock);
CVAR_REGISTER ( &ag_ban_357);
CVAR_REGISTER ( &ag_ban_mp5);
CVAR_REGISTER ( &ag_ban_shotgun);
CVAR_REGISTER ( &ag_ban_crossbow);
CVAR_REGISTER ( &ag_ban_rpg);
CVAR_REGISTER ( &ag_ban_gauss);
CVAR_REGISTER ( &ag_ban_egon);
CVAR_REGISTER ( &ag_ban_hornet);
CVAR_REGISTER ( &ag_ban_hgrenade);
CVAR_REGISTER ( &ag_ban_satchel);
CVAR_REGISTER ( &ag_ban_tripmine);
CVAR_REGISTER ( &ag_ban_snark);
CVAR_REGISTER ( &ag_ban_m203);
CVAR_REGISTER ( &ag_ban_longjump);
CVAR_REGISTER ( &ag_ban_9mmar);
CVAR_REGISTER ( &ag_ban_bockshot);
CVAR_REGISTER ( &ag_ban_uranium);
CVAR_REGISTER ( &ag_ban_bolts);
CVAR_REGISTER ( &ag_ban_rockets);
CVAR_REGISTER ( &ag_ban_357ammo);
CVAR_REGISTER ( &ag_ban_armour);
CVAR_REGISTER ( &ag_ban_health);
CVAR_REGISTER ( &ag_ban_recharg);
CVAR_REGISTER ( &ag_start_crowbar);
CVAR_REGISTER ( &ag_start_glock);
CVAR_REGISTER ( &ag_start_357);
CVAR_REGISTER ( &ag_start_mp5);
CVAR_REGISTER ( &ag_start_shotgun);
CVAR_REGISTER ( &ag_start_crossbow);
CVAR_REGISTER ( &ag_start_rpg);
CVAR_REGISTER ( &ag_start_gauss);
CVAR_REGISTER ( &ag_start_egon);
CVAR_REGISTER ( &ag_start_hornet);
CVAR_REGISTER ( &ag_start_hgrenade);
CVAR_REGISTER ( &ag_start_satchel);
CVAR_REGISTER ( &ag_start_tripmine);
CVAR_REGISTER ( &ag_start_snark);
CVAR_REGISTER ( &ag_start_m203);
CVAR_REGISTER ( &ag_start_longjump);
CVAR_REGISTER ( &ag_start_9mmar);
CVAR_REGISTER ( &ag_start_bockshot);
CVAR_REGISTER ( &ag_start_uranium);
CVAR_REGISTER ( &ag_start_bolts);
CVAR_REGISTER ( &ag_start_rockets);
CVAR_REGISTER ( &ag_start_357ammo);
CVAR_REGISTER ( &ag_start_armour);
CVAR_REGISTER ( &ag_start_health);
CVAR_REGISTER ( &ag_dmg_crowbar);
CVAR_REGISTER ( &ag_dmg_glock);
CVAR_REGISTER ( &ag_dmg_357);
CVAR_REGISTER ( &ag_dmg_mp5);
CVAR_REGISTER ( &ag_dmg_shotgun);
CVAR_REGISTER ( &ag_dmg_crossbow);
CVAR_REGISTER ( &ag_dmg_bolts);
CVAR_REGISTER ( &ag_dmg_rpg);
CVAR_REGISTER ( &ag_dmg_gauss);
CVAR_REGISTER ( &ag_dmg_egon_wide);
CVAR_REGISTER ( &ag_dmg_egon_narrow);
CVAR_REGISTER ( &ag_dmg_hornet);
CVAR_REGISTER ( &ag_dmg_hgrenade);
CVAR_REGISTER ( &ag_dmg_satchel);
CVAR_REGISTER ( &ag_dmg_tripmine);
CVAR_REGISTER ( &ag_dmg_m203);
CVAR_REGISTER ( &ag_allow_timeout);
CVAR_REGISTER ( &ag_vote_start);
CVAR_REGISTER ( &ag_vote_setting);
CVAR_REGISTER ( &ag_vote_gamemode);
CVAR_REGISTER ( &ag_vote_kick);
CVAR_REGISTER ( &ag_vote_allow);
CVAR_REGISTER ( &ag_vote_admin);
CVAR_REGISTER ( &ag_vote_map);
CVAR_REGISTER ( &ag_vote_failed_time);
CVAR_REGISTER ( &ag_start_minplayers);
CVAR_REGISTER ( &ag_vote_mp_timelimit_low);
CVAR_REGISTER ( &ag_vote_mp_timelimit_high);
CVAR_REGISTER ( &ag_vote_mp_fraglimit_low);
CVAR_REGISTER ( &ag_vote_mp_fraglimit_high);
CVAR_REGISTER ( &ag_floodmsgs);
CVAR_REGISTER ( &ag_floodpersecond);
CVAR_REGISTER ( &ag_floodwaitdelay);
CVAR_REGISTER ( &ag_max_spectators);
CVAR_REGISTER ( &ag_spec_enable_disable);
CVAR_REGISTER ( &ag_spectalk);
CVAR_REGISTER ( &ag_spawn_volume);
CVAR_REGISTER ( &ag_show_gibs);
CVAR_REGISTER ( &ag_gametype);
CVAR_REGISTER ( &ag_ctf_flag_resettime);
CVAR_REGISTER ( &ag_ctf_capturepoints);
CVAR_REGISTER ( &ag_ctf_teamcapturepoints);
CVAR_REGISTER ( &ag_ctf_capture_limit);
CVAR_REGISTER ( &ag_ctf_returnpoints);
CVAR_REGISTER ( &ag_ctf_carrierkillpoints);
CVAR_REGISTER ( &ag_ctf_stealpoints);
CVAR_REGISTER ( &ag_ctf_defendpoints);
CVAR_REGISTER ( &ag_ctf_roundbased);
//++ muphicks
CVAR_REGISTER ( &ag_dom_mincontroltime);
CVAR_REGISTER ( &ag_dom_controlpoints);
CVAR_REGISTER ( &ag_dom_resetscorelimit);
CVAR_REGISTER ( &ag_dom_scorelimit );
//-- muphicks
CVAR_REGISTER ( &ag_gauss_fix);
CVAR_REGISTER ( &ag_rpg_fix);
CVAR_REGISTER ( &mm_agsay);
Command.Init();
//Set up initial settings. Add "startup_" before
char *servercfgfile = (char *)CVAR_GET_STRING( "servercfgfile" );
if ( servercfgfile && servercfgfile[0] )
{
char szCommand[256];
ALERT( at_console, "Executing dedicated server startup config file\n" );
sprintf( szCommand, "exec startup_%s\n", servercfgfile );
SERVER_COMMAND( szCommand );
SERVER_EXECUTE();
}
g_bLangame = 0 < CVAR_GET_FLOAT("sv_lan");
GameMode.Init();
Wallhack.Init();
LoadGreetingMessages();
}
//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());
}
}
}
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;
}
CBasePlayer* AgPlayerByName(const AgString& sNameOrPlayerNumber)
{
if (0 == sNameOrPlayerNumber.size())
return NULL;
for (int i = 1; i <= gpGlobals->maxClients; i++)
{
CBasePlayer* pPlayerLoop = AgPlayerByIndex(i);
if (pPlayerLoop)
if ( 0 == stricmp(pPlayerLoop->GetName(),sNameOrPlayerNumber.c_str()) ||
"#" == sNameOrPlayerNumber.substr(0,1) &&
GETPLAYERUSERID(pPlayerLoop->edict()) == atoi(sNameOrPlayerNumber.substr(1).c_str())
)
return pPlayerLoop;
}
return NULL;
}
void AgChangelevel(const AgString& sLevelname)
{
if (32 < sLevelname.size() || 0 == sLevelname.size())
return;
char szTemp[64];
strcpy(szTemp,sLevelname.c_str());
//Check if it exists.
if (IS_MAP_VALID(szTemp))
//Change the level
CHANGE_LEVEL(szTemp,NULL);
}
void AgConsole(const AgString& sText, CBasePlayer* pPlayer)
{
if (pPlayer && pPlayer->pev)
{
ClientPrint(pPlayer->pev, HUD_PRINTCONSOLE, UTIL_VarArgs("%s\n", sText.c_str()));
}
else
{
g_engfuncs.pfnServerPrint(UTIL_VarArgs("%s\n", sText.c_str()));
}
}
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, "func_healthcharger" )) != NULL)
((CBaseToggle *)pEntity)->Reset();
pEntity = NULL;
while ((pEntity = UTIL_FindEntityByClassname( pEntity, "func_recharge" )) != NULL)
((CBaseToggle *)pEntity)->Reset();
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;
}
char* AgStringToLower(char* pszString)
{
if (NULL == pszString)
return pszString;
char* pszTemp = pszString;
while ('\0' != pszTemp[0])
{
*pszTemp = tolower(*pszTemp);
pszTemp++;
}
return pszString;
}
void AgToLower(AgString& strLower)
{
size_t i = 0;
while (i < strLower.size())
{
strLower[i] = tolower(strLower[i]);
i++;
}
}
void AgTrim(AgString& sTrim)
{
if (0 == sTrim.size())
return;
int b = sTrim.find_first_not_of(" \t\r\n");
int e = sTrim.find_last_not_of(" \t\r\n");
if(b == -1) // No non-whitespaces
sTrim = "";
else
sTrim = string(sTrim, b, e - b + 1);
}
void AgLog(const char* pszLog)
{
char szFile[MAX_PATH];
sprintf(szFile, "%s/agslog.txt", AgGetDirectory());
FILE* pFile = fopen(szFile,"a+");
if (!pFile)
{
g_engfuncs.pfnServerPrint(UTIL_VarArgs("Couldn't create/save %s.",szFile));
return;
}
time_t clock;
time( &clock );
fprintf(pFile,"%s : %s",pszLog,asctime(localtime(&clock)));
fflush(pFile);
fclose(pFile);
g_engfuncs.pfnServerPrint(pszLog);
}
#ifndef WIN32
#include <sys/times.h>
#endif
/*
float AgTime()
{
#ifdef WIN32
return ((float)clock()) / ((float)CLOCKS_PER_SEC);
#else
static tms t;
return ((float)times(&t)) / 100.0; //Should be CLK_TCK defined in limits.h.
#endif
}
*/
void AgDirList(const AgString& sDir, AgStringSet& setFiles)
{
#ifdef _WIN32
WIN32_FIND_DATA FindData;
char szSearchDirectory[_MAX_PATH];
sprintf(szSearchDirectory,"%s/*.*",sDir.c_str());
HANDLE hFind = FindFirstFile(szSearchDirectory, &FindData);
if (INVALID_HANDLE_VALUE != hFind)
{
do
{
if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
AgString sFile;
sFile = FindData.cFileName;
setFiles.insert(sFile);
}
}
while (FindNextFile(hFind, &FindData));
FindClose(hFind);
}
#else
DIR* pDirectory = opendir(sDir.c_str());
if (pDirectory)
{
struct dirent* pFile = NULL;
while (NULL != (pFile = readdir(pDirectory)))
{
AgString sFile;
sFile = pFile->d_name;
setFiles.insert(sFile);
}
closedir(pDirectory);
}
#endif
}
void AgStripColors(char* pszString)
{
char* pszIt = pszString;
while ('\0' != *pszIt)
{
if ('^' == *pszIt)
{
++pszIt;
if (*pszIt >= '0' && *pszIt <= '9')
{
--pszIt;
memmove(pszIt,pszIt+2,strlen(pszIt+2)+1);
}
}
else
++pszIt;
}
}
void AgGetDetails(char* pszDetails, int iMaxSize, int* piSize)
{
int iBytes = 0;
char* pszBuffer = pszDetails;
//Write Match running
iBytes += sprintf(&pszBuffer[iBytes],"match\\%d",ag_match_running.value > 0);
pszBuffer[iBytes] = '\0';
*piSize = iBytes;
}
void AgGetPlayerInfo(char* pszDetails, int iMaxSize, int* piSize)
{
int iBytes = 0;
char* pszBuffer = pszDetails;
for ( int i = 1; i <= gpGlobals->maxClients; i++ )
{
if (iBytes + 100 > iMaxSize)
break;
CBasePlayer* pPlayerLoop = AgPlayerByIndex(i);
if (pPlayerLoop)
{
if (!pPlayerLoop->IsSpectator())
{
iBytes += sprintf(&pszBuffer[iBytes],"%s ",pPlayerLoop->GetName());
pszBuffer[iBytes] = '\0';
iBytes += sprintf(&pszBuffer[iBytes],"\t%s ",pPlayerLoop->TeamID());
pszBuffer[iBytes] = '\0';
iBytes += sprintf(&pszBuffer[iBytes],"\t%d ",(int)pPlayerLoop->pev->frags);
pszBuffer[iBytes] = '\0';
iBytes += sprintf(&pszBuffer[iBytes],"\t%d ",(int)pPlayerLoop->m_iDeaths);
pszBuffer[iBytes] = '\0';
iBytes += sprintf(&pszBuffer[iBytes],"\t%s ",pPlayerLoop->GetAuthID());
pszBuffer[iBytes] = '\0';
iBytes++;
}
}
}
*piSize = iBytes;
}
#ifndef _WIN32
#include <sys/utsname.h>
#endif
char* AgOSVersion()
{
#ifdef _WIN32
static char verbuf[256];
#else
static char verbuf[4*SYS_NMLN + 4];
#endif
#ifdef _WIN32
OSVERSIONINFO VersionInfo;
VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo);
if(GetVersionEx(&VersionInfo))
{
if(strlen(VersionInfo.szCSDVersion) > 200)
VersionInfo.szCSDVersion[100] = 0;
sprintf(verbuf, "Windows %d.%d build%d PlatformId %d SP=\"%s\"\n",
VersionInfo.dwMajorVersion,
VersionInfo.dwMinorVersion,
VersionInfo.dwBuildNumber,
VersionInfo.dwPlatformId,
VersionInfo.szCSDVersion);
}
else
{
strcpy(verbuf, "WINDOWS UNKNOWN\n");
}
#else
struct utsname ubuf;
if(uname(&ubuf))
{
strcpy(verbuf, "LINUX UNKNOWN\n");
}
else
{
sprintf(verbuf,"%s %s %s %s\n",
ubuf.sysname,
ubuf.release,
ubuf.version,
ubuf.machine);
}
#endif
return verbuf;
}
#ifdef _WIN32
static LARGE_INTEGER liTimerFreq;
void AgInitTimer()
{
QueryPerformanceFrequency(&liTimerFreq);
}
double AgTime()
{
LARGE_INTEGER liTime;
QueryPerformanceCounter(&liTime);
return ((double)liTime.QuadPart) / ((double)liTimerFreq.QuadPart);
}
#else
#include <sys/time.h>
#include <unistd.h>
#include <sys/times.h>
static double dClockTicsPerSecond;
void AgInitTimer()
{
dClockTicsPerSecond = sysconf(_SC_CLK_TCK);
}
double AgTime()
{
tms t;
clock_t time = times(&t);
if (((clock_t)-1) == time)
{
struct timeval tod;
gettimeofday(&tod,NULL);
return tod.tv_sec + tod.tv_usec * 0.000001;
}
return ((double)time) / dClockTicsPerSecond;
}
#endif
AgString AgReadFile(const char* pszFile)
{
AgString sData;
char szFile[MAX_PATH];
char szData[4096];
sprintf(szFile, "%s/%s", AgGetDirectory(),pszFile);
FILE* pFile = fopen(szFile,"r");
if (!pFile)
return "";
int iRead = 0;
while (0 != (iRead = fread(szData,sizeof(char),sizeof(szData)-2,pFile)))
{
szData[iRead] = '\0';
sData += szData;
szData[0] = '\0';
}
fclose(pFile);
return sData;
}
typedef map<AgString, AgString, less<AgString> > AgAuthIDToGreeting;
static AgAuthIDToGreeting s_mapGreeting;
void LoadGreetingMessages()
{
AgString sGreetingMessages = AgReadFile("greeting.txt");
int iPosNewLine = sGreetingMessages.find_first_of("\n");
while (-1 != iPosNewLine)
{
AgString sAuthID, sGreeting;
int iPosGreeting = sGreetingMessages.find_first_of(" \t");
sAuthID = sGreetingMessages.substr(0,iPosGreeting);
sGreeting = sGreetingMessages.substr(iPosGreeting+1,iPosNewLine-iPosGreeting-1);
AgTrim(sGreeting);
AgTrim(sAuthID);
sGreeting += "\n";
s_mapGreeting.insert(AgAuthIDToGreeting::value_type(sAuthID, sGreeting));
sGreetingMessages = sGreetingMessages.substr(iPosNewLine+1);
iPosNewLine = sGreetingMessages.find_first_of("\n");
}
}
void AgDisplayGreetingMessage(const char* pszAuthID)
{
AgAuthIDToGreeting::iterator itrGreeting = s_mapGreeting.find(pszAuthID);
if (itrGreeting != s_mapGreeting.end())
UTIL_ClientPrintAll(HUD_PRINTNOTIFY, (*itrGreeting).second.c_str());
}
bool AgIsCTFMap(const char* pszMap)
{
#define LUMP_ENTITIES 0
#define HEADER_LUMPS 15
#define MAX_MAP_ENTSTRING (128*1024)
typedef struct
{
int fileofs, filelen;
} lump_t;
typedef struct
{
int version;
lump_t lumps[HEADER_LUMPS];
} dheader_t;
if (0 == strncmp(pszMap,"agctf_",6))
return true;
else if (0 == strncmp(pszMap,"hlectf_",6))
return true;
char szMapFile[MAX_PATH];
int iMapLength = 0;
sprintf(szMapFile,"maps/%s.bsp",STRING(gpGlobals->mapname));
byte* pMapData = LOAD_FILE_FOR_ME(szMapFile,&iMapLength);
if (!pMapData)
return false;
AgString sMapEntityData;
dheader_t* pHeader = (dheader_t*)pMapData;
if (pHeader->version == 29 || pHeader->version == 30)
{
int iMapDataLength = pHeader->lumps[LUMP_ENTITIES].filelen;
int iMapDataOffset = pHeader->lumps[LUMP_ENTITIES].fileofs;
pMapData[iMapDataLength] = '\0';
if (NULL != strstr((const char*)&pMapData[iMapDataOffset],"info_hmctfdetect")
|| NULL != strstr((const char*)&pMapData[iMapDataOffset],"info_ctfdetect"))
{
FREE_FILE(pMapData);
return true;
}
}
FREE_FILE(pMapData);
return false;
}
//++ muphicks
// Check to see if we have a DOM map
bool AgIsDOMMap(const char* pszMap)
{
#define LUMP_ENTITIES 0
#define HEADER_LUMPS 15
#define MAX_MAP_ENTSTRING (128*1024)
typedef struct
{
int fileofs, filelen;
} lump_t;
typedef struct
{
int version;
lump_t lumps[HEADER_LUMPS];
} dheader_t;
if (0 == strncmp(pszMap,"agdom_",6))
return true;
char szMapFile[MAX_PATH];
int iMapLength = 0;
sprintf(szMapFile,"maps/%s.bsp",STRING(gpGlobals->mapname));
byte* pMapData = LOAD_FILE_FOR_ME(szMapFile,&iMapLength);
if (!pMapData)
return false;
AgString sMapEntityData;
dheader_t* pHeader = (dheader_t*)pMapData;
if (pHeader->version == 29 || pHeader->version == 30)
{
int iMapDataLength = pHeader->lumps[LUMP_ENTITIES].filelen;
int iMapDataOffset = pHeader->lumps[LUMP_ENTITIES].fileofs;
pMapData[iMapDataLength] = '\0';
if (NULL != strstr((const char*)&pMapData[iMapDataOffset],"info_hmdomdetect")
|| NULL != strstr((const char*)&pMapData[iMapDataOffset],"info_domdetect"))
{
FREE_FILE(pMapData);
return true;
}
}
FREE_FILE(pMapData);
return false;
}
//--muphicks
void AgSound(CBasePlayer* pPlayer, const char* pszWave)
{
ASSERT(NULL != pPlayer);
if (!pPlayer)
return;
ASSERT(NULL != pPlayer->pev);
if (!pPlayer->pev)
return;
if (!pPlayer->edict() || 0 == strlen(pszWave))
return;
CLIENT_COMMAND(pPlayer->edict(), "play %s\n", pszWave);
}
void AgPlayCountdown(CBasePlayer* pPlayer, int iSeconds)
{
ASSERT(NULL != pPlayer);
if (!pPlayer)
return;
ASSERT(NULL != pPlayer->pev);
if (!pPlayer->pev)
return;
if (0 == iSeconds)
{
AgSound(pPlayer,"barney/ba_bring.wav");
}
else
{
if (!g_bLangame)
{
AgSound(pPlayer,"fvox/beep.wav");
}
else
{
if (1 == iSeconds)
AgSound(pPlayer,"fvox/one.wav");
else if (2 == iSeconds)
AgSound(pPlayer,"fvox/two.wav");
else if (3 == iSeconds)
AgSound(pPlayer,"fvox/three.wav");
else if (4 == iSeconds)
AgSound(pPlayer,"fvox/four.wav");
else if (5 == iSeconds)
AgSound(pPlayer,"fvox/five.wav");
else if (6 == iSeconds)
AgSound(pPlayer,"fvox/six.wav");
else if (7 == iSeconds)
AgSound(pPlayer,"fvox/seven.wav");
else if (8 == iSeconds)
AgSound(pPlayer,"fvox/eight.wav");
else if (9 == iSeconds)
AgSound(pPlayer,"fvox/nine.wav");
else if (10 == iSeconds)
AgSound(pPlayer,"fvox/ten.wav");
}
}
}
bool AgIsLocalServer()
{
return !(IS_DEDICATED_SERVER() && 0 == CVAR_GET_FLOAT("sv_lan"));
}
const char* AgGetGame()
{
static char szGame[MAX_PATH];
GET_GAME_DIR(szGame);
char* pszGameDir = strrchr(szGame, '/');
if (pszGameDir)
return pszGameDir + 1;
return szGame;
}
const char* AgGetDirectory()
{
static char szGame[MAX_PATH];
GET_GAME_DIR(szGame);
char* pszGameDir = strrchr(szGame, '/');
if (pszGameDir)
{
return szGame;
}
else
{
static char szDirectory[MAX_PATH] = "";
if (strlen(szDirectory))
return szDirectory;
#ifndef _WIN32
getcwd(szDirectory, MAX_PATH);
#else
::GetCurrentDirectory(MAX_PATH, szDirectory);
#endif
strcat(szDirectory, "/");
strcat(szDirectory, szGame);
return szDirectory;
}
}
const char* AgGetDirectoryValve()
{
static char szDirectory[MAX_PATH] = "";
if (szDirectory[0] != '\0')
return szDirectory;
strcpy(szDirectory, AgGetDirectory());
int iStart = strlen(szDirectory)-1;
while ('/' != szDirectory[iStart])
{
szDirectory[iStart] = '\0';
iStart--;
if (iStart == 0)
{
break;
}
}
szDirectory[iStart] = '\0';
return szDirectory;
}
//-- Martin Webrant