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.
 
 
 
 
 
 

553 lines
12 KiB

//++ BulliT
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "player.h"
#include "gamerules.h"
#include "agcommand.h"
#include "agadmincache.h"
#include "agglobal.h"
DLL_GLOBAL AgCommand Command; //The one and only
FILE_GLOBAL CBasePlayer* s_pAdmin = NULL;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
struct COMMANDS
{
char szCommand[18];
void (*pServer)(void);
void (*pClient)(CBasePlayer* pPlayer);
char szDescription[64];
};
void addadmin_client(CBasePlayer* pPlayer)
{
if (3 == CMD_ARGC())
Command.AddAdmin(CMD_ARGV(1),CMD_ARGV(2),pPlayer);
}
void addadmin(void)
{
addadmin_client(NULL);
}
void listadmins_client(CBasePlayer* pPlayer)
{
if (1 == CMD_ARGC())
Command.ListAdmins(pPlayer);
}
void listadmins(void)
{
listadmins_client(NULL);
}
void deladmin_client(CBasePlayer* pPlayer)
{
if (2 == CMD_ARGC())
Command.DelAdmin(CMD_ARGV(1),pPlayer);
}
void deladmin(void)
{
deladmin_client(NULL);
}
void allow_client(CBasePlayer* pPlayer)
{
if (2 == CMD_ARGC())
Command.Allow(CMD_ARGV(1),pPlayer);
else if (1 == CMD_ARGC())
Command.Allow("",pPlayer);
}
void allow(void)
{
allow_client(NULL);
}
void agabort_client(CBasePlayer* pPlayer)
{
Command.Abort(pPlayer);
}
void agabort(void)
{
agabort_client(NULL);
}
void start_client(CBasePlayer* pPlayer)
{
if (1 == CMD_ARGC())
Command.Start("");
if (2 <= CMD_ARGC())
Command.Start(CMD_ARGS());
}
void start(void)
{
start_client(NULL);
}
void pause_client(CBasePlayer* pPlayer)
{
Command.Pause(pPlayer);
}
void agpause(void)
{
pause_client(NULL);
}
void kick_client(CBasePlayer* pPlayer)
{
if (2 == CMD_ARGC())
Command.Kick(CMD_ARGV(1));
}
void map_client(CBasePlayer* pPlayer)
{
if (2 == CMD_ARGC())
Command.Map(CMD_ARGV(1));
}
void help_client(CBasePlayer* pPlayer)
{
if (1 == CMD_ARGC())
Command.Help(pPlayer);
}
void help(void)
{
help_client(NULL);
}
void nextmap_client(CBasePlayer* pPlayer)
{
if (2 == CMD_ARGC())
Command.NextMap(CMD_ARGV(1),pPlayer);
else if (1 == CMD_ARGC())
Command.NextMap("",pPlayer);
}
void nextmap(void)
{
nextmap_client(NULL);
}
void spectator_client(CBasePlayer* pPlayer)
{
if (2 == CMD_ARGC())
Command.Spectator(pPlayer,CMD_ARGV(1));
}
void spectator(void)
{
spectator_client(NULL);
}
void teamup_client(CBasePlayer* pPlayer)
{
if (3 == CMD_ARGC())
Command.TeamUp(pPlayer,CMD_ARGV(1),CMD_ARGV(2));
}
void teamup(void)
{
teamup_client(NULL);
}
void variables_client(CBasePlayer* pPlayer)
{
if (1 == CMD_ARGC())
Command.Variables(pPlayer);
}
void variables(void)
{
variables_client(NULL);
}
void exec_client(CBasePlayer* pPlayer)
{
if (2 == CMD_ARGC())
Command.Exec(CMD_ARGV(1),pPlayer);
}
void exec(void)
{
exec_client(NULL);
}
FILE_GLOBAL COMMANDS s_Commands[]=
{
"agaddadmin",addadmin,NULL,"agaddadmin <admin> <password> - Add new admin.",
"aglistadmins",listadmins,NULL,"aglistadmins - List all admins.",
"agdeladmin",deladmin,NULL,"agdeladmin <admin> - Delete existing admin.",
"agforcespectator",spectator,spectator_client,"agforcespectator <name/#number> Force a player into specmode",
"agforceteamup",teamup,teamup_client,"agforceteamup <name/#number> team - Force a player into a team",
"agkick",NULL,kick_client,"agkick <name/#number> - Kick a player.",
"agmap",NULL,map_client,"agmap <mapname> - Change level.",
"agnextmap",nextmap,nextmap_client,"agnextmap <mapname> - Set next level.",
"agexec",exec,exec_client,"agexec <config> - Executes a server configuration.",
"agstart",start,start_client,"agstart <full/nolock> - Start a match.",
"agabort",agabort,agabort_client,"agabort - Abort a match.",
"agallow",allow,allow_client,"agallow <name> - Allow a player into the match.",
"agpause",agpause,pause_client,"agpause - Pause server.",
"help",help,help_client,"help - List commands.",
"variables",variables,variables_client,"variables - Server variable list.",
};
FILE_GLOBAL const char* s_szVars[] =
{
"sv_ag_max_spectators <0-32> - Max spectators allowed.",
"sv_ag_spec_enable_disable<0/1> - Allow players to disable tracking in spectator.",
"sv_ag_pure <0/1> - 0 spike check and simple variable checks, 1 harder variable check.",
"sv_ag_match_running <0/1> - Tells if a match is running.",
"sv_ag_allow_vote <0/1> - Allow any vote.",
"sv_ag_vote_setting <0/1> - Vote ag_xxx and mp_xxx settings.",
"sv_ag_vote_gamemode <0/1> - Allow gamemode switching.",
"sv_ag_vote_kick <0/1> - Allow voting a kick.",
"sv_ag_vote_admin <0/1> - Allow voting an admin.",
"sv_ag_vote_map <0/1> - Allow map voting.",
"sv_ag_vote_mp_timelimit_low <0-999> - Lowest timelimit to vote on.",
"sv_ag_vote_mp_timelimit_high <0-999> - Highest timelimit to vote on.",
"sv_ag_vote_mp_fraglimit_low <0-999> - Lowest fraglimit to vote on.",
"sv_ag_vote_mp_fraglimit_high <0-999> - Highest fraglimit to vote on.",
"sv_ag_floodmsgs <4> - Flood messages to tolerate. 0 will deactive it.",
"sv_ag_floodpersecond <4> - Flood messages per second.",
"sv_ag_floodwaitdelay <10> - Flood penalty timer.",
"sv_ag_show_gibs <0/1> - Show dead bodies.",
"sv_ag_spawn_volume <0-1> - The spawn sound volume.",
"sv_ag_player_id <5> - Player id show to other players. In seconds.",
"sv_ag_auto_admin <1> - Give auto admin to admins in admin list.",
"sv_ag_lj_timer <0-999> - Countdown seconds for long jump. 0 turns it off.",
"sv_ag_wallgauss <0/1> - Wallgauss on/off. On is for the weak :)",
"sv_ag_headshot <1-3> - Set power of headshot. Normally 3.",
"sv_ag_blastradius <1> - Blast radius for explosions. Normally 1",
"sv_ag_allowed_gamemodes <ffa;tdm> - Allowed gamemodes, could be any off ffa;tdm;arena;arcade;sgbow;instagib",
};
AgCommand::AgCommand()
{
}
AgCommand::~AgCommand()
{
}
void AgCommand::Init()
{
for (int i = 0; i < sizeof(s_Commands)/sizeof(s_Commands[0]); i++)
{
if (s_Commands[i].pServer)
ADD_SERVER_COMMAND(s_Commands[i].szCommand,s_Commands[i].pServer);
}
}
bool AgCommand::HandleCommand(CBasePlayer* pPlayer)
{
ASSERT(NULL != pPlayer);
if (!pPlayer)
return false;
ASSERT(NULL != pPlayer->pev);
if (!pPlayer->pev)
return false;
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules || 0 == CMD_ARGC())
return false;
if (pPlayer->IsAdmin())
{
//Server command
for (int i = 0; i < sizeof(s_Commands)/sizeof(s_Commands[0]); i++)
{
if (s_Commands[i].pClient)
{
if (FStrEq(s_Commands[i].szCommand,CMD_ARGV(0)))
{
s_Commands[i].pClient(pPlayer);
if (FStrEq(s_Commands[i].szCommand,"help"))
return false;
else
return true;
}
}
else if (s_Commands[i].pServer)
{
if (FStrEq(s_Commands[i].szCommand,CMD_ARGV(0)))
{
s_Commands[i].pServer();
return true;
}
}
}
if (1 == CMD_ARGC())
{
if (GameMode.IsGamemode(CMD_ARGV(0)))
{
if (!GameMode.IsAllowedGamemode(CMD_ARGV(0),pPlayer))
{
AgConsole("Gamemode not allowed by server admin.",pPlayer);
return true;
}
GameMode.Gamemode(CMD_ARGV(0));
return true;
}
}
if (0 < CMD_ARGC() &&
(0 == strnicmp(CMD_ARGV(0),"ag_spectalk",11)
||0 == strnicmp(CMD_ARGV(0),"mp_timelimit",12)
||0 == strnicmp(CMD_ARGV(0),"ag_gauss_fix",12)
||0 == strnicmp(CMD_ARGV(0),"ag_rpg_fix",10)
||0 == strnicmp(CMD_ARGV(0),"mp_fraglimit",12)
||0 == strnicmp(CMD_ARGV(0),"mp_friendlyfire",15)
||0 == strnicmp(CMD_ARGV(0),"mp_weaponstay",13)
))
{
if (1 == CMD_ARGC())
Setting(CMD_ARGV(0), "", pPlayer);
else if (2 == CMD_ARGC())
Setting(CMD_ARGV(0), CMD_ARGV(1), pPlayer);
return true;
}
}
return false;
}
void AgCommand::AddAdmin(const AgString& sAdmin, const AgString& sPassword, CBasePlayer* pPlayer)
{
AdminCache.AddAdmin(sAdmin,sPassword,pPlayer);
}
void AgCommand::ListAdmins(CBasePlayer* pPlayer)
{
AdminCache.ListAdmins(pPlayer);
}
void AgCommand::DelAdmin(const AgString& sAdmin,CBasePlayer* pPlayer)
{
AdminCache.DelAdmin(sAdmin,pPlayer);
}
void AgCommand::Allow(const AgString& sPlayerIdOrName,CBasePlayer* pPlayer)
{
if (!g_pGameRules)
return;
if (ARENA == AgGametype() || LMS == AgGametype())
{
AgConsole("Not allowed.",pPlayer);
return;
}
//Get player.
CBasePlayer* pPlayerLoop = AgPlayerByName(sPlayerIdOrName);
if (!pPlayerLoop && pPlayer && 0 == sPlayerIdOrName.size())
pPlayerLoop = pPlayer;
if (pPlayerLoop)
{
g_pGameRules->m_Match.Allow(pPlayerLoop);
}
else
{
AgConsole("No such player exist on server.",pPlayer);
}
}
void AgCommand::Abort(CBasePlayer* pPlayer)
{
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
if (LMS == AgGametype() || ARENA == AgGametype())
{
AgConsole("Abort is not allowed in this gamemode.",pPlayer);
return;
}
g_pGameRules->m_Match.Abort();
}
void AgCommand::Start(const AgString& sSpawn)
{
if (LMS == AgGametype() || ARENA == AgGametype())
{
AgConsole("Start is not allowed in this gamemode.");
return;
}
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
g_pGameRules->Start(sSpawn);
}
void AgCommand::Pause(CBasePlayer* pPlayer)
{
if (LMS == AgGametype() || ARENA == AgGametype())
{
AgConsole("Pause is not allowed in this gamemode.");
return;
}
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
g_pGameRules->m_Timeout.TogglePause();
}
void AgCommand::Kick(const AgString& sPlayerIdOrName)
{
if (32 < sPlayerIdOrName.size())
return;
char szCommand[128];
sprintf(szCommand,"kick %s\n",sPlayerIdOrName.c_str());
SERVER_COMMAND( szCommand );
}
void AgCommand::Map(const AgString& sMap)
{
if (32 < sMap.size() || !g_pGameRules)
return;
g_pGameRules->m_Settings.Changelevel(sMap);
}
void AgCommand::NextMap(const AgString& sMap, CBasePlayer* pPlayer)
{
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
if (sMap.size() && 32 > sMap.size())
{
g_pGameRules->m_Settings.SetNextLevel(sMap);
}
else
{
char szSetting[64];
sprintf(szSetting,"ag_nextmap is \"%s\"",g_pGameRules->m_Settings.GetNextLevel().c_str());
AgConsole(szSetting,pPlayer);
}
}
void AgCommand::Setting(const AgString& sSetting, const AgString& sValue, CBasePlayer* pPlayer)
{
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
if (sValue.size())
{
g_pGameRules->m_Settings.AdminSetting(sSetting,sValue);
}
else
{
char szSetting[64];
sprintf(szSetting,"%s is \"%s\"",sSetting.c_str(),CVAR_GET_STRING(sSetting.c_str()));
AgConsole(szSetting,pPlayer);
}
}
void AgCommand::Help(CBasePlayer* pPlayer)
{
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
for (int i = 0; i < sizeof(s_Commands)/sizeof(s_Commands[0]); i++)
{
if (!pPlayer && s_Commands[i].pServer)
AgConsole(s_Commands[i].szDescription,pPlayer);
else if (pPlayer
&& 0 == strcmp(s_Commands[i].szCommand,"agaddadmin")
&& 0 == strcmp(s_Commands[i].szCommand,"aglistadmins")
&& 0 == strcmp(s_Commands[i].szCommand,"agdeladmin"))
AgConsole(s_Commands[i].szDescription,pPlayer);
}
GameMode.Help(pPlayer);
}
void AgCommand::Variables(CBasePlayer* pPlayer)
{
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
for (int i = 0; i < sizeof(s_szVars)/sizeof(s_szVars[0]); i++)
AgConsole(s_szVars[i],pPlayer);
}
void AgCommand::TeamUp(CBasePlayer* pPlayer, const AgString& sPlayerIdOrName, const AgString& sTeam)
{
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
if (!g_pGameRules->IsTeamplay())
return;
CBasePlayer* pTeamUpPlayer = AgPlayerByName(sPlayerIdOrName);
if (pTeamUpPlayer)
pTeamUpPlayer->ChangeTeam(sTeam.c_str(),true);
}
void AgCommand::Spectator(CBasePlayer* pPlayer, const AgString& sPlayerIdOrName)
{
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
if (!g_pGameRules->IsTeamplay())
return;
CBasePlayer* pSpectatorPlayer = AgPlayerByName(sPlayerIdOrName);
if (pSpectatorPlayer)
pSpectatorPlayer->Spectate_Start();
}
void AgCommand::Exec(const AgString& sExec, CBasePlayer* pPlayer)
{
ASSERT(NULL != g_pGameRules);
if (!g_pGameRules)
return;
char szCommand[128];
sprintf(szCommand,"exec %s\n",sExec.c_str());
SERVER_COMMAND( szCommand );
SERVER_EXECUTE();
}
//-- Martin Webrant