dvander@591: /** ds@653: * vim: set ts=4 : dvander@591: * =============================================================== dvander@591: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@591: * =============================================================== dvander@591: * dvander@591: * This file is not open source and may not be copied without explicit dvander@591: * written permission of AlliedModders LLC. This file may not be redistributed dvander@591: * in whole or significant part. dvander@591: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@591: * dvander@591: * Version: $Id$ dvander@591: */ dvander@591: dvander@591: #include "PlayerManager.h" dvander@591: #include "ForwardSys.h" dvander@591: #include "ShareSys.h" dvander@591: #include "AdminCache.h" dvander@591: #include "ConCmdManager.h" dvander@769: #include "MenuStyle_Valve.h" dvander@780: #include "MenuStyle_Radio.h" dvander@591: dvander@616: PlayerManager g_Players; dvander@591: dvander@591: SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char *, const char *, char *, int); dvander@591: SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, const char *); dvander@591: SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *); dvander@591: SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); dvander@591: SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *); dvander@591: SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int); dvander@591: dvander@616: PlayerManager::PlayerManager() dvander@591: { dvander@591: m_AuthQueue = NULL; dvander@591: m_FirstPass = true; faluco@682: faluco@682: m_UserIdLookUp = new int[USHRT_MAX]; faluco@682: memset(m_UserIdLookUp, 0, sizeof(int) * USHRT_MAX); dvander@591: } dvander@591: dvander@616: PlayerManager::~PlayerManager() dvander@591: { dvander@591: delete [] m_AuthQueue; faluco@682: delete [] m_UserIdLookUp; dvander@591: } dvander@591: dvander@616: void PlayerManager::OnSourceModAllInitialized() dvander@591: { dvander@616: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect, false); dvander@616: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect_Post, true); dvander@616: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &PlayerManager::OnClientPutInServer, true); dvander@616: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect, false); dvander@616: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect_Post, true); dvander@616: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &PlayerManager::OnClientCommand, false); dvander@616: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &PlayerManager::OnClientSettingsChanged, true); dvander@616: SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &PlayerManager::OnServerActivate, true); dvander@591: dvander@591: g_ShareSys.AddInterface(NULL, this); dvander@591: dvander@591: ParamType p1[] = {Param_Cell, Param_String, Param_Cell}; dvander@591: ParamType p2[] = {Param_Cell}; dvander@591: dvander@591: m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_Event, 3, p1); dvander@591: m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2); dvander@591: m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2); dvander@591: m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2); dvander@591: m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 2, NULL, Param_Cell, Param_Cell); dvander@591: m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2); dvander@591: m_clauth = g_Forwards.CreateForward("OnClientAuthorized", ET_Ignore, 2, NULL, Param_Cell, Param_String); dvander@643: m_onActivate = g_Forwards.CreateForward("OnServerLoad", ET_Ignore, 0, NULL); dvander@717: m_onActivate2 = g_Forwards.CreateForward("OnMapStart", ET_Ignore, 0, NULL); dvander@591: } dvander@591: dvander@616: void PlayerManager::OnSourceModShutdown() dvander@591: { dvander@616: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect, false); dvander@616: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &PlayerManager::OnClientPutInServer, true); dvander@616: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect, false); dvander@616: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect_Post, true); dvander@616: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &PlayerManager::OnClientCommand, false); dvander@616: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &PlayerManager::OnClientSettingsChanged, true); dvander@616: SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &PlayerManager::OnServerActivate, true); dvander@591: dvander@591: /* Release forwards */ dvander@591: g_Forwards.ReleaseForward(m_clconnect); dvander@591: g_Forwards.ReleaseForward(m_clputinserver); dvander@591: g_Forwards.ReleaseForward(m_cldisconnect); dvander@591: g_Forwards.ReleaseForward(m_cldisconnect_post); dvander@591: g_Forwards.ReleaseForward(m_clcommand); dvander@591: g_Forwards.ReleaseForward(m_clinfochanged); dvander@591: g_Forwards.ReleaseForward(m_clauth); dvander@643: g_Forwards.ReleaseForward(m_onActivate); dvander@717: g_Forwards.ReleaseForward(m_onActivate2); dvander@591: dvander@591: delete [] m_Players; dvander@591: } dvander@591: dvander@616: void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax) dvander@591: { dvander@591: if (m_FirstPass) dvander@591: { dvander@591: /* Initialize all players */ dvander@591: m_maxClients = clientMax; dvander@591: m_PlayerCount = 0; dvander@591: m_Players = new CPlayer[m_maxClients + 1]; dvander@591: m_AuthQueue = new unsigned int[m_maxClients + 1]; dvander@591: m_FirstPass = false; dvander@591: dvander@591: memset(m_AuthQueue, 0, sizeof(unsigned int) * (m_maxClients + 1)); dvander@591: } dvander@643: m_onActivate->Execute(NULL); dvander@717: m_onActivate2->Execute(NULL); dvander@591: } dvander@591: dvander@616: void PlayerManager::RunAuthChecks() dvander@591: { dvander@591: CPlayer *pPlayer; dvander@591: const char *authstr; dvander@591: unsigned int removed = 0; dvander@591: for (unsigned int i=1; i<=m_AuthQueue[0]; i++) dvander@591: { dvander@591: pPlayer = GetPlayerByIndex(m_AuthQueue[i]); dvander@591: authstr = engine->GetPlayerNetworkIDString(pPlayer->m_pEdict); dvander@591: if (authstr && authstr[0] != '\0' dvander@591: && (strcmp(authstr, "STEAM_ID_PENDING") != 0)) dvander@591: { dvander@591: /* Set authorization */ dvander@591: pPlayer->m_AuthID.assign(authstr); dvander@591: pPlayer->m_IsAuthorized = true; dvander@591: dvander@647: /* Mark as removed from queue */ dvander@649: unsigned int client = m_AuthQueue[i]; dvander@647: m_AuthQueue[i] = 0; dvander@647: removed++; dvander@647: dvander@591: /* Send to extensions */ dvander@591: List::iterator iter; dvander@591: IClientListener *pListener; dvander@591: for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) dvander@591: { dvander@591: pListener = (*iter); dvander@648: pListener->OnClientAuthorized(client, authstr); dvander@647: if (!pPlayer->IsConnected()) dvander@647: { dvander@647: break; dvander@647: } dvander@591: } dvander@591: dvander@647: /* Send to plugins if player is still connected */ dvander@647: if (pPlayer->IsConnected() && m_clauth->GetFunctionCount()) dvander@591: { dvander@647: /* :TODO: handle the case of a player disconnecting in the middle */ dvander@648: m_clauth->PushCell(client); dvander@591: m_clauth->PushString(authstr); dvander@591: m_clauth->Execute(NULL); dvander@591: } dvander@591: } dvander@591: } dvander@591: dvander@591: /* Clean up the queue */ dvander@591: if (removed) dvander@591: { ds@729: /* We don't have to compact the list if it's empty */ dvander@591: if (removed != m_AuthQueue[0]) dvander@591: { dvander@591: unsigned int diff = 0; dvander@591: for (unsigned int i=1; i<=m_AuthQueue[0]; i++) dvander@591: { dvander@591: /* If this member is removed... */ dvander@591: if (m_AuthQueue[i] == 0) dvander@591: { dvander@591: /* Increase the differential */ dvander@591: diff++; dvander@591: } else { dvander@591: /* diff cannot increase faster than i+1 */ dvander@591: assert(i > diff); dvander@591: assert(i - diff >= 1); dvander@591: /* move this index down */ dvander@591: m_AuthQueue[i - diff] = m_AuthQueue[i]; dvander@591: } dvander@591: } dvander@591: m_AuthQueue[0] -= removed; dvander@591: } else { dvander@591: m_AuthQueue[0] = 0; dvander@591: g_SourceMod.SetAuthChecking(false); dvander@591: } dvander@591: } dvander@591: } dvander@591: dvander@616: bool PlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) dvander@591: { dvander@591: int client = engine->IndexOfEdict(pEntity); dvander@591: dvander@591: List::iterator iter; dvander@591: IClientListener *pListener = NULL; dvander@591: for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) dvander@591: { dvander@591: pListener = (*iter); dvander@591: if (!pListener->InterceptClientConnect(client, reject, maxrejectlen)) dvander@591: { dvander@591: return false; dvander@591: } dvander@591: } dvander@591: dvander@591: cell_t res = 1; dvander@591: dvander@591: m_Players[client].Initialize(pszName, pszAddress, pEntity); dvander@591: m_clconnect->PushCell(client); dvander@591: m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8, SM_PARAM_COPYBACK); dvander@591: m_clconnect->PushCell(maxrejectlen); dvander@591: m_clconnect->Execute(&res, NULL); dvander@591: dvander@591: if (res) dvander@591: { dvander@644: if (!m_Players[client].IsAuthorized()) dvander@644: { dvander@644: m_AuthQueue[++m_AuthQueue[0]] = client; dvander@644: g_SourceMod.SetAuthChecking(true); dvander@644: } dvander@591: } else { dvander@591: RETURN_META_VALUE(MRES_SUPERCEDE, false); dvander@591: } dvander@591: faluco@682: m_UserIdLookUp[engine->GetPlayerUserId(pEntity)] = client; faluco@682: dvander@591: return true; dvander@591: } dvander@591: dvander@616: bool PlayerManager::OnClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) dvander@591: { dvander@591: int client = engine->IndexOfEdict(pEntity); dvander@591: bool orig_value = META_RESULT_ORIG_RET(bool); dvander@591: if (orig_value) dvander@591: { dvander@591: List::iterator iter; dvander@591: IClientListener *pListener = NULL; dvander@591: for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) dvander@591: { dvander@591: pListener = (*iter); dvander@591: pListener->OnClientConnected(client); dvander@591: } dvander@591: } dvander@591: dvander@591: return true; dvander@591: } dvander@591: dvander@616: void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername) dvander@591: { dvander@591: cell_t res; dvander@591: int client = engine->IndexOfEdict(pEntity); dvander@591: dvander@591: CPlayer *pPlayer = GetPlayerByIndex(client); dvander@644: /* If they're not connected, they're a bot */ dvander@591: if (!pPlayer->IsConnected()) dvander@591: { dvander@591: /* Run manual connection routines */ dvander@591: char error[255]; dvander@644: const char *authid = engine->GetPlayerNetworkIDString(pEntity); dvander@644: pPlayer->Authorize(authid); dvander@591: if (!OnClientConnect(pEntity, playername, "127.0.0.1", error, sizeof(error))) dvander@591: { dvander@591: /* :TODO: kick the bot if it's rejected */ dvander@591: return; dvander@591: } dvander@591: List::iterator iter; dvander@591: IClientListener *pListener = NULL; dvander@591: for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) dvander@591: { dvander@591: pListener = (*iter); dvander@591: pListener->OnClientConnected(client); dvander@644: /* See if bot was kicked */ dvander@644: if (!pPlayer->IsConnected()) dvander@644: { dvander@644: return; dvander@644: } dvander@591: } dvander@644: /* Now do authorization */ dvander@644: for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) dvander@644: { dvander@644: pListener = (*iter); dvander@644: pListener->OnClientAuthorized(client, authid); dvander@644: /* See if bot was kicked */ dvander@644: if (!pPlayer->IsConnected()) dvander@644: { dvander@644: return; dvander@644: } dvander@644: } dvander@644: /* Finally, tell plugins */ dvander@644: if (m_clauth->GetFunctionCount()) dvander@644: { dvander@644: m_clauth->PushCell(client); dvander@644: m_clauth->PushString(authid); dvander@644: m_clauth->Execute(NULL); dvander@644: } dvander@644: } dvander@644: dvander@644: if (playerinfo) dvander@644: { dvander@644: pPlayer->m_Info = playerinfo->GetPlayerInfo(pEntity); dvander@591: } dvander@591: dvander@591: List::iterator iter; dvander@591: IClientListener *pListener = NULL; dvander@591: for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) dvander@591: { dvander@591: pListener = (*iter); dvander@591: pListener->OnClientPutInServer(client); dvander@644: /* See if player was kicked */ dvander@644: if (!pPlayer->IsConnected()) dvander@644: { dvander@644: return; dvander@644: } dvander@591: } dvander@591: dvander@591: m_Players[client].Connect(); dvander@591: m_PlayerCount++; dvander@591: m_clputinserver->PushCell(client); dvander@591: m_clputinserver->Execute(&res, NULL); dvander@591: } dvander@591: dvander@616: void PlayerManager::OnClientDisconnect(edict_t *pEntity) dvander@591: { dvander@591: cell_t res; dvander@591: int client = engine->IndexOfEdict(pEntity); dvander@591: dvander@591: if (m_Players[client].IsConnected()) dvander@591: { dvander@591: m_cldisconnect->PushCell(client); dvander@591: m_cldisconnect->Execute(&res, NULL); dvander@591: } dvander@591: dvander@591: if (m_Players[client].IsInGame()) dvander@591: { dvander@591: m_PlayerCount--; dvander@591: } dvander@591: dvander@591: List::iterator iter; dvander@591: IClientListener *pListener = NULL; dvander@591: for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) dvander@591: { dvander@591: pListener = (*iter); dvander@591: pListener->OnClientDisconnecting(client); dvander@591: } dvander@591: dvander@591: /** dvander@591: * Remove client from auth queue if necessary dvander@591: */ dvander@591: if (!m_Players[client].IsAuthorized()) dvander@591: { dvander@591: for (unsigned int i=1; i<=m_AuthQueue[0]; i++) dvander@591: { dvander@591: if (m_AuthQueue[i] == (unsigned)client) dvander@591: { dvander@591: /* Move everything ahead of us back by one */ dvander@591: for (unsigned int j=i+1; j<=m_AuthQueue[0]; j++) dvander@591: { dvander@591: m_AuthQueue[j-1] = m_AuthQueue[j]; dvander@591: } dvander@591: /* Remove us and break */ dvander@591: m_AuthQueue[0]--; dvander@591: break; dvander@591: } dvander@591: } dvander@591: } dvander@591: dvander@591: m_Players[client].Disconnect(); faluco@682: m_UserIdLookUp[engine->GetPlayerUserId(pEntity)] = 0; dvander@591: } dvander@591: dvander@616: void PlayerManager::OnClientDisconnect_Post(edict_t *pEntity) dvander@591: { dvander@591: cell_t res; dvander@591: int client = engine->IndexOfEdict(pEntity); dvander@591: dvander@591: m_cldisconnect_post->PushCell(client); dvander@591: m_cldisconnect_post->Execute(&res, NULL); dvander@591: dvander@591: List::iterator iter; dvander@591: IClientListener *pListener = NULL; dvander@591: for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++) dvander@591: { dvander@591: pListener = (*iter); dvander@591: pListener->OnClientDisconnected(client); dvander@591: } dvander@591: } dvander@591: dvander@616: void PlayerManager::OnClientCommand(edict_t *pEntity) dvander@591: { dvander@780: int client = engine->IndexOfEdict(pEntity); dvander@591: cell_t res = Pl_Continue; dvander@591: dvander@769: bool result = g_ValveMenuStyle.OnClientCommand(client); dvander@769: if (result) dvander@769: { dvander@769: res = Pl_Handled; dvander@780: } else { dvander@780: result = g_RadioMenuStyle.OnClientCommand(client); dvander@780: if (result) dvander@780: { dvander@780: res = Pl_Handled; dvander@780: } dvander@780: } dvander@780: dvander@780: int args = engine->Cmd_Argc() - 1; dvander@780: dvander@780: cell_t res2 = Pl_Continue; dvander@780: m_clcommand->PushCell(client); dvander@780: m_clcommand->PushCell(args); dvander@780: m_clcommand->Execute(&res2, NULL); dvander@780: dvander@780: if (res2 > res) dvander@780: { dvander@780: res = res2; dvander@780: } dvander@780: dvander@780: if (res >= Pl_Stop) dvander@780: { dvander@780: RETURN_META(MRES_SUPERCEDE); dvander@769: } dvander@769: dvander@591: res = g_ConCmds.DispatchClientCommand(client, (ResultType)res); dvander@591: dvander@591: if (res >= Pl_Handled) dvander@591: { dvander@591: RETURN_META(MRES_SUPERCEDE); dvander@591: } dvander@591: } dvander@591: dvander@616: void PlayerManager::OnClientSettingsChanged(edict_t *pEntity) dvander@591: { dvander@591: cell_t res; dvander@591: int client = engine->IndexOfEdict(pEntity); dvander@591: dvander@591: m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity)); dvander@591: m_clinfochanged->Execute(&res, NULL); dvander@591: m_Players[client].SetName(engine->GetClientConVarValue(client, "name")); dvander@591: } dvander@591: dvander@616: int PlayerManager::GetMaxClients() dvander@591: { dvander@591: return m_maxClients; dvander@591: } dvander@591: dvander@616: CPlayer *PlayerManager::GetPlayerByIndex(int client) const dvander@591: { dvander@591: if (client > m_maxClients || client < 1) dvander@591: { dvander@591: return NULL; dvander@591: } dvander@591: return &m_Players[client]; dvander@591: } dvander@591: dvander@616: int PlayerManager::GetNumPlayers() dvander@591: { dvander@591: return m_PlayerCount; dvander@591: } dvander@591: faluco@682: int PlayerManager::GetClientOfUserId(int userid) faluco@682: { dvander@719: if (userid < 0 || userid > USHRT_MAX) dvander@719: { dvander@719: return 0; dvander@719: } dvander@719: dvander@719: int client = m_UserIdLookUp[userid]; dvander@719: dvander@719: /* Verify the userid. The cache can get messed up with older dvander@719: * Valve engines. :TODO: If this gets fixed, do an old engine dvander@719: * check before invoking this backwards compat code. dvander@719: */ dvander@719: if (client) dvander@719: { dvander@719: CPlayer *player = GetPlayerByIndex(client); dvander@719: if (player && player->IsConnected()) dvander@719: { dvander@719: int realUserId = engine->GetPlayerUserId(player->GetEdict()); dvander@719: if (realUserId == userid) dvander@719: { dvander@719: return client; dvander@719: } dvander@719: } dvander@719: } dvander@719: dvander@719: /* If we can't verify the userid, we have to do a manual loop */ dvander@719: CPlayer *player; dvander@719: for (int i = 1; i <= m_maxClients; i++) dvander@719: { dvander@719: player = GetPlayerByIndex(i); dvander@719: if (!player || !player->IsConnected()) dvander@719: { dvander@719: continue; dvander@719: } dvander@719: if (engine->GetPlayerUserId(player->GetEdict()) == userid) dvander@719: { dvander@720: m_UserIdLookUp[userid] = i; dvander@719: return i; dvander@719: } dvander@719: } dvander@719: dvander@719: return 0; faluco@682: } faluco@682: dvander@616: void PlayerManager::AddClientListener(IClientListener *listener) dvander@591: { dvander@591: m_hooks.push_back(listener); dvander@591: } dvander@591: dvander@616: void PlayerManager::RemoveClientListener(IClientListener *listener) dvander@591: { dvander@591: m_hooks.remove(listener); dvander@591: } dvander@591: dvander@616: IGamePlayer *PlayerManager::GetGamePlayer(edict_t *pEdict) dvander@591: { dvander@591: int index = engine->IndexOfEdict(pEdict); dvander@591: return GetGamePlayer(index); dvander@591: } dvander@591: dvander@616: IGamePlayer *PlayerManager::GetGamePlayer(int client) dvander@591: { dvander@591: return GetPlayerByIndex(client); dvander@591: } dvander@591: dvander@616: void PlayerManager::ClearAdminId(AdminId id) dvander@591: { dvander@591: for (int i=1; i<=m_maxClients; i++) dvander@591: { dvander@591: if (m_Players[i].m_Admin == id) dvander@591: { dvander@591: m_Players[i].DumpAdmin(true); dvander@591: } dvander@591: } dvander@591: } dvander@591: dvander@616: void PlayerManager::ClearAllAdmins() dvander@591: { dvander@591: for (int i=1; i<=m_maxClients; i++) dvander@591: { dvander@591: m_Players[i].DumpAdmin(true); dvander@591: } dvander@591: } dvander@591: dvander@591: dvander@591: /******************* dvander@591: *** PLAYER CODE *** dvander@591: *******************/ dvander@591: dvander@591: CPlayer::CPlayer() dvander@591: { dvander@591: m_IsConnected = false; dvander@591: m_IsInGame = false; dvander@591: m_IsAuthorized = false; dvander@591: m_pEdict = NULL; dvander@591: m_Admin = INVALID_ADMIN_ID; dvander@591: m_TempAdmin = false; dvander@644: m_Info = NULL; dvander@591: } dvander@591: dvander@591: void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity) dvander@591: { dvander@591: m_IsConnected = true; dvander@591: m_Name.assign(name); dvander@591: m_Ip.assign(ip); dvander@591: m_pEdict = pEntity; dvander@591: } dvander@591: dvander@591: void CPlayer::Connect() dvander@591: { dvander@591: m_IsInGame = true; dvander@591: } dvander@591: dvander@591: void CPlayer::Authorize(const char *steamid) dvander@591: { dvander@591: m_IsAuthorized = true; dvander@591: m_AuthID.assign(steamid); dvander@591: } dvander@591: dvander@591: void CPlayer::Disconnect() dvander@591: { dvander@591: DumpAdmin(false); dvander@591: m_IsConnected = false; dvander@591: m_IsInGame = false; dvander@591: m_IsAuthorized = false; dvander@591: m_Name.clear(); dvander@591: m_Ip.clear(); dvander@591: m_AuthID.clear(); dvander@591: m_pEdict = NULL; dvander@644: m_Info = NULL; dvander@591: } dvander@591: dvander@591: void CPlayer::SetName(const char *name) dvander@591: { dvander@591: m_Name.assign(name); dvander@591: } dvander@591: dvander@615: const char *CPlayer::GetName() dvander@591: { faluco@658: return (m_Info) ? m_Info->GetName(): m_Name.c_str(); dvander@591: } dvander@591: dvander@615: const char *CPlayer::GetIPAddress() dvander@591: { dvander@591: return m_Ip.c_str(); dvander@591: } dvander@591: dvander@615: const char *CPlayer::GetAuthString() dvander@591: { dvander@591: return m_AuthID.c_str(); dvander@591: } dvander@591: dvander@615: edict_t *CPlayer::GetEdict() dvander@591: { dvander@591: return m_pEdict; dvander@591: } dvander@591: dvander@615: bool CPlayer::IsInGame() dvander@591: { dvander@591: return m_IsInGame; dvander@591: } dvander@591: dvander@615: bool CPlayer::IsConnected() dvander@591: { dvander@591: return m_IsConnected; dvander@591: } dvander@591: dvander@615: bool CPlayer::IsAuthorized() dvander@591: { dvander@591: return m_IsAuthorized; dvander@591: } dvander@591: dvander@644: IPlayerInfo *CPlayer::GetPlayerInfo() dvander@644: { dvander@644: return m_Info; dvander@644: } dvander@644: dvander@615: bool CPlayer::IsFakeClient() dvander@591: { dvander@591: return (strcmp(m_AuthID.c_str(), "BOT") == 0); dvander@591: } dvander@591: dvander@591: void CPlayer::SetAdminId(AdminId id, bool temporary) dvander@591: { dvander@591: if (!m_IsConnected) dvander@591: { dvander@591: return; dvander@591: } dvander@591: dvander@591: DumpAdmin(false); dvander@591: dvander@591: m_Admin = id; dvander@591: m_TempAdmin = temporary; dvander@591: } dvander@591: dvander@615: AdminId CPlayer::GetAdminId() dvander@591: { dvander@591: return m_Admin; dvander@591: } dvander@591: dvander@591: void CPlayer::DumpAdmin(bool deleting) dvander@591: { dvander@591: if (m_Admin != INVALID_ADMIN_ID) dvander@591: { dvander@591: if (m_TempAdmin && !deleting) dvander@591: { dvander@591: g_Admins.InvalidateAdmin(m_Admin); dvander@591: } dvander@591: m_Admin = INVALID_ADMIN_ID; dvander@591: m_TempAdmin = false; dvander@591: } dvander@591: }