Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.
(This day shall henceforth be known as the Eighty Column Massacre of '07)
3 * =============================================================================
5 * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
6 * =============================================================================
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License, version 3.0, as published by the
10 * Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License along with
18 * this program. If not, see <http://www.gnu.org/licenses/>.
20 * As a special exception, AlliedModders LLC gives you permission to link the
21 * code of this program (as well as its derivative works) to "Half-Life 2," the
22 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
23 * by the Valve Corporation. You must obey the GNU General Public License in
24 * all respects for all other code used. Additionally, AlliedModders LLC grants
25 * this exception to all derivative works. AlliedModders LLC defines further
26 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
27 * or <http://www.sourcemod.net/license.php>.
32 #include "PlayerManager.h"
33 #include "ForwardSys.h"
35 #include "AdminCache.h"
36 #include "ConCmdManager.h"
37 #include "MenuStyle_Valve.h"
38 #include "MenuStyle_Radio.h"
39 #include "sm_stringutil.h"
40 #include "CoreConfig.h"
41 #include <inetchannel.h>
45 PlayerManager g_Players;
46 bool g_OnMapStarted = false;
47 IForward *PreAdminCheck = NULL;
48 IForward *PostAdminCheck = NULL;
50 SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char *, const char *, char *, int);
51 SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, const char *);
52 SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *);
53 SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *);
54 SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *);
55 SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int);
57 class KickPlayerTimer : public ITimedEvent
60 ResultType OnTimer(ITimer *pTimer, void *pData)
62 int userid = (int)pData;
63 int client = g_Players.GetClientOfUserId(userid);
66 CPlayer *player = g_Players.GetPlayerByIndex(client);
67 player->Kick("Your name is reserved by SourceMod; set your password to use it.");
71 void OnTimerEnd(ITimer *pTimer, void *pData)
76 PlayerManager::PlayerManager()
81 m_UserIdLookUp = new int[USHRT_MAX];
82 memset(m_UserIdLookUp, 0, sizeof(int) * USHRT_MAX);
85 PlayerManager::~PlayerManager()
87 delete [] m_AuthQueue;
88 delete [] m_UserIdLookUp;
91 void PlayerManager::OnSourceModAllInitialized()
93 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect, false);
94 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect_Post, true);
95 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &PlayerManager::OnClientPutInServer, true);
96 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect, false);
97 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect_Post, true);
98 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &PlayerManager::OnClientCommand, false);
99 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &PlayerManager::OnClientSettingsChanged, true);
100 SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &PlayerManager::OnServerActivate, true);
102 g_ShareSys.AddInterface(NULL, this);
104 ParamType p1[] = {Param_Cell, Param_String, Param_Cell};
105 ParamType p2[] = {Param_Cell};
107 m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_Event, 3, p1);
108 m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2);
109 m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2);
110 m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2);
111 m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 2, NULL, Param_Cell, Param_Cell);
112 m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2);
113 m_clauth = g_Forwards.CreateForward("OnClientAuthorized", ET_Ignore, 2, NULL, Param_Cell, Param_String);
114 m_onActivate = g_Forwards.CreateForward("OnServerLoad", ET_Ignore, 0, NULL);
115 m_onActivate2 = g_Forwards.CreateForward("OnMapStart", ET_Ignore, 0, NULL);
117 PreAdminCheck = g_Forwards.CreateForward("OnClientPreAdminCheck", ET_Event, 1, p1);
118 PostAdminCheck = g_Forwards.CreateForward("OnClientPostAdminCheck", ET_Ignore, 1, p1);
121 void PlayerManager::OnSourceModShutdown()
123 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &PlayerManager::OnClientConnect, false);
124 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &PlayerManager::OnClientPutInServer, true);
125 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect, false);
126 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &PlayerManager::OnClientDisconnect_Post, true);
127 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &PlayerManager::OnClientCommand, false);
128 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &PlayerManager::OnClientSettingsChanged, true);
129 SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &PlayerManager::OnServerActivate, true);
131 /* Release forwards */
132 g_Forwards.ReleaseForward(m_clconnect);
133 g_Forwards.ReleaseForward(m_clputinserver);
134 g_Forwards.ReleaseForward(m_cldisconnect);
135 g_Forwards.ReleaseForward(m_cldisconnect_post);
136 g_Forwards.ReleaseForward(m_clcommand);
137 g_Forwards.ReleaseForward(m_clinfochanged);
138 g_Forwards.ReleaseForward(m_clauth);
139 g_Forwards.ReleaseForward(m_onActivate);
140 g_Forwards.ReleaseForward(m_onActivate2);
142 g_Forwards.ReleaseForward(PreAdminCheck);
143 g_Forwards.ReleaseForward(PostAdminCheck);
148 ConfigResult PlayerManager::OnSourceModConfigChanged(const char *key,
154 if (strcmp(key, "PassInfoVar") == 0)
156 if (strcmp(value, "_password") != 0)
158 m_PassInfoVar.assign(value);
160 return ConfigResult_Accept;
162 return ConfigResult_Ignore;
165 void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
169 /* Initialize all players */
170 m_maxClients = clientMax;
172 m_Players = new CPlayer[m_maxClients + 1];
173 m_AuthQueue = new unsigned int[m_maxClients + 1];
176 memset(m_AuthQueue, 0, sizeof(unsigned int) * (m_maxClients + 1));
178 m_onActivate->Execute(NULL);
179 m_onActivate2->Execute(NULL);
181 g_OnMapStarted = true;
183 SM_ExecuteAllConfigs();
186 bool PlayerManager::CheckSetAdmin(int index, CPlayer *pPlayer, AdminId id)
188 const char *password = g_Admins.GetAdminPassword(id);
189 if (password != NULL)
191 if (m_PassInfoVar.size() < 1)
196 /* Whoa... the user needs a password! */
197 const char *given = engine->GetClientConVarValue(index, m_PassInfoVar.c_str());
198 if (!given || strcmp(given, password) != 0)
204 pPlayer->SetAdminId(id, false);
209 bool PlayerManager::CheckSetAdminName(int index, CPlayer *pPlayer, AdminId id)
211 const char *password = g_Admins.GetAdminPassword(id);
212 if (password == NULL)
217 if (m_PassInfoVar.size() < 1)
222 /* Whoa... the user needs a password! */
223 const char *given = engine->GetClientConVarValue(index, m_PassInfoVar.c_str());
224 if (!given || strcmp(given, password) != 0)
229 pPlayer->SetAdminId(id, false);
234 void PlayerManager::RunAuthChecks()
238 unsigned int removed = 0;
239 for (unsigned int i=1; i<=m_AuthQueue[0]; i++)
241 pPlayer = GetPlayerByIndex(m_AuthQueue[i]);
242 authstr = engine->GetPlayerNetworkIDString(pPlayer->m_pEdict);
243 if (authstr && authstr[0] != '\0'
244 && (strcmp(authstr, "STEAM_ID_PENDING") != 0))
246 /* Set authorization */
247 pPlayer->Authorize(authstr);
249 /* Mark as removed from queue */
250 unsigned int client = m_AuthQueue[i];
254 /* Send to extensions */
255 List<IClientListener *>::iterator iter;
256 IClientListener *pListener;
257 for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
260 pListener->OnClientAuthorized(client, authstr);
261 if (!pPlayer->IsConnected())
267 /* Send to plugins if player is still connected */
268 if (pPlayer->IsConnected() && m_clauth->GetFunctionCount())
270 /* :TODO: handle the case of a player disconnecting in the middle */
271 m_clauth->PushCell(client);
272 m_clauth->PushString(authstr);
273 m_clauth->Execute(NULL);
276 if (pPlayer->IsConnected())
278 pPlayer->Authorize_Post();
283 /* Clean up the queue */
286 /* We don't have to compact the list if it's empty */
287 if (removed != m_AuthQueue[0])
289 unsigned int diff = 0;
290 for (unsigned int i=1; i<=m_AuthQueue[0]; i++)
292 /* If this member is removed... */
293 if (m_AuthQueue[i] == 0)
295 /* Increase the differential */
298 /* diff cannot increase faster than i+1 */
300 assert(i - diff >= 1);
301 /* move this index down */
302 m_AuthQueue[i - diff] = m_AuthQueue[i];
305 m_AuthQueue[0] -= removed;
308 g_SourceMod.SetAuthChecking(false);
313 bool PlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen)
315 int client = engine->IndexOfEdict(pEntity);
317 List<IClientListener *>::iterator iter;
318 IClientListener *pListener = NULL;
319 for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
322 if (!pListener->InterceptClientConnect(client, reject, maxrejectlen))
330 m_Players[client].Initialize(pszName, pszAddress, pEntity);
331 m_clconnect->PushCell(client);
332 m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8, SM_PARAM_COPYBACK);
333 m_clconnect->PushCell(maxrejectlen);
334 m_clconnect->Execute(&res, NULL);
338 if (!m_Players[client].IsAuthorized())
340 m_AuthQueue[++m_AuthQueue[0]] = client;
341 g_SourceMod.SetAuthChecking(true);
344 RETURN_META_VALUE(MRES_SUPERCEDE, false);
347 m_UserIdLookUp[engine->GetPlayerUserId(pEntity)] = client;
352 bool PlayerManager::OnClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen)
354 int client = engine->IndexOfEdict(pEntity);
355 bool orig_value = META_RESULT_ORIG_RET(bool);
356 CPlayer *pPlayer = GetPlayerByIndex(client);
359 List<IClientListener *>::iterator iter;
360 IClientListener *pListener = NULL;
361 for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
364 pListener->OnClientConnected(client);
365 if (!pPlayer->IsConnected())
375 void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername)
378 int client = engine->IndexOfEdict(pEntity);
380 CPlayer *pPlayer = GetPlayerByIndex(client);
381 /* If they're not connected, they're a bot */
382 if (!pPlayer->IsConnected())
384 /* Run manual connection routines */
386 const char *authid = engine->GetPlayerNetworkIDString(pEntity);
387 pPlayer->Authorize(authid);
388 if (!OnClientConnect(pEntity, playername, "127.0.0.1", error, sizeof(error)))
390 /* :TODO: kick the bot if it's rejected */
393 List<IClientListener *>::iterator iter;
394 IClientListener *pListener = NULL;
395 for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
398 pListener->OnClientConnected(client);
399 /* See if bot was kicked */
400 if (!pPlayer->IsConnected())
405 /* Now do authorization */
406 for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
409 pListener->OnClientAuthorized(client, authid);
410 /* See if bot was kicked */
411 if (!pPlayer->IsConnected())
416 /* Finally, tell plugins */
417 if (m_clauth->GetFunctionCount())
419 m_clauth->PushCell(client);
420 m_clauth->PushString(authid);
421 m_clauth->Execute(NULL);
422 if (!pPlayer->IsConnected())
427 pPlayer->Authorize_Post();
428 if (!pPlayer->IsConnected())
436 pPlayer->m_Info = playerinfo->GetPlayerInfo(pEntity);
439 List<IClientListener *>::iterator iter;
440 IClientListener *pListener = NULL;
441 for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
444 pListener->OnClientPutInServer(client);
445 /* See if player was kicked */
446 if (!pPlayer->IsConnected())
452 m_Players[client].Connect();
454 m_clputinserver->PushCell(client);
455 m_clputinserver->Execute(&res, NULL);
458 void PlayerManager::OnSourceModLevelEnd()
460 /* Disconnect all bots still in game */
461 for (int i=1; i<=m_maxClients; i++)
463 if (m_Players[i].IsConnected() && m_Players[i].IsFakeClient())
465 OnClientDisconnect(m_Players[i].GetEdict());
470 void PlayerManager::OnClientDisconnect(edict_t *pEntity)
473 int client = engine->IndexOfEdict(pEntity);
475 if (m_Players[client].IsConnected())
477 m_cldisconnect->PushCell(client);
478 m_cldisconnect->Execute(&res, NULL);
481 if (m_Players[client].IsInGame())
486 List<IClientListener *>::iterator iter;
487 IClientListener *pListener = NULL;
488 for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
491 pListener->OnClientDisconnecting(client);
495 * Remove client from auth queue if necessary
497 if (!m_Players[client].IsAuthorized())
499 for (unsigned int i=1; i<=m_AuthQueue[0]; i++)
501 if (m_AuthQueue[i] == (unsigned)client)
503 /* Move everything ahead of us back by one */
504 for (unsigned int j=i+1; j<=m_AuthQueue[0]; j++)
506 m_AuthQueue[j-1] = m_AuthQueue[j];
508 /* Remove us and break */
515 m_Players[client].Disconnect();
516 m_UserIdLookUp[engine->GetPlayerUserId(pEntity)] = 0;
519 void PlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
522 int client = engine->IndexOfEdict(pEntity);
524 m_cldisconnect_post->PushCell(client);
525 m_cldisconnect_post->Execute(&res, NULL);
527 List<IClientListener *>::iterator iter;
528 IClientListener *pListener = NULL;
529 for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
532 pListener->OnClientDisconnected(client);
536 void PlayerManager::OnClientCommand(edict_t *pEntity)
538 int client = engine->IndexOfEdict(pEntity);
539 cell_t res = Pl_Continue;
541 bool result = g_ValveMenuStyle.OnClientCommand(client);
546 result = g_RadioMenuStyle.OnClientCommand(client);
553 int args = engine->Cmd_Argc() - 1;
555 cell_t res2 = Pl_Continue;
556 m_clcommand->PushCell(client);
557 m_clcommand->PushCell(args);
558 m_clcommand->Execute(&res2, NULL);
567 RETURN_META(MRES_SUPERCEDE);
570 res = g_ConCmds.DispatchClientCommand(client, (ResultType)res);
572 if (res >= Pl_Handled)
574 RETURN_META(MRES_SUPERCEDE);
578 void PlayerManager::OnClientSettingsChanged(edict_t *pEntity)
581 int client = engine->IndexOfEdict(pEntity);
583 m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity));
584 m_clinfochanged->Execute(&res, NULL);
586 IPlayerInfo *info = m_Players[client].GetPlayerInfo();
587 const char *new_name = info ? info->GetName() : engine->GetClientConVarValue(client, "name");
588 const char *old_name = m_Players[client].m_Name.c_str();
590 if (strcmp(old_name, new_name) != 0)
592 AdminId id = g_Admins.FindAdminByIdentity("name", new_name);
593 if (id != INVALID_ADMIN_ID && m_Players[client].GetAdminId() != id)
595 if (!CheckSetAdminName(client, &m_Players[client], id))
597 m_Players[client].Kick("Your name is reserved by SourceMod; set your password to use it.");
598 RETURN_META(MRES_IGNORED);
600 } else if ((id = g_Admins.FindAdminByIdentity("name", old_name)) != INVALID_ADMIN_ID) {
601 if (id == m_Players[client].GetAdminId())
603 /* This player is changing their name; force them to drop admin privileges! */
604 m_Players[client].SetAdminId(INVALID_ADMIN_ID, false);
607 m_Players[client].SetName(new_name);
610 if (m_PassInfoVar.size() > 0)
612 /* Try for a password change */
613 const char *old_pass = m_Players[client].m_LastPassword.c_str();
614 const char *new_pass = engine->GetClientConVarValue(client, m_PassInfoVar.c_str());
615 if (strcmp(old_pass, new_pass) != 0)
617 m_Players[client].m_LastPassword.assign(new_pass);
618 if (m_Players[client].IsInGame() && m_Players[client].IsAuthorized())
620 /* If there is already an admin id assigned, this will just bail out. */
621 m_Players[client].DoBasicAdminChecks();
627 int PlayerManager::GetMaxClients()
632 CPlayer *PlayerManager::GetPlayerByIndex(int client) const
634 if (client > m_maxClients || client < 1)
638 return &m_Players[client];
641 int PlayerManager::GetNumPlayers()
643 return m_PlayerCount;
646 int PlayerManager::GetClientOfUserId(int userid)
648 if (userid < 0 || userid > USHRT_MAX)
653 int client = m_UserIdLookUp[userid];
655 /* Verify the userid. The cache can get messed up with older
656 * Valve engines. :TODO: If this gets fixed, do an old engine
657 * check before invoking this backwards compat code.
661 CPlayer *player = GetPlayerByIndex(client);
662 if (player && player->IsConnected())
664 int realUserId = engine->GetPlayerUserId(player->GetEdict());
665 if (realUserId == userid)
672 /* If we can't verify the userid, we have to do a manual loop */
674 for (int i = 1; i <= m_maxClients; i++)
676 player = GetPlayerByIndex(i);
677 if (!player || !player->IsConnected())
681 if (engine->GetPlayerUserId(player->GetEdict()) == userid)
683 m_UserIdLookUp[userid] = i;
691 void PlayerManager::AddClientListener(IClientListener *listener)
693 m_hooks.push_back(listener);
696 void PlayerManager::RemoveClientListener(IClientListener *listener)
698 m_hooks.remove(listener);
701 IGamePlayer *PlayerManager::GetGamePlayer(edict_t *pEdict)
703 int index = engine->IndexOfEdict(pEdict);
704 return GetGamePlayer(index);
707 IGamePlayer *PlayerManager::GetGamePlayer(int client)
709 return GetPlayerByIndex(client);
712 void PlayerManager::ClearAdminId(AdminId id)
714 for (int i=1; i<=m_maxClients; i++)
716 if (m_Players[i].m_Admin == id)
718 m_Players[i].DumpAdmin(true);
723 void PlayerManager::ClearAllAdmins()
725 for (int i=1; i<=m_maxClients; i++)
727 m_Players[i].DumpAdmin(true);
731 const char *PlayerManager::GetPassInfoVar()
733 return m_PassInfoVar.c_str();
736 void PlayerManager::RecheckAnyAdmins()
738 for (int i=1; i<=m_maxClients; i++)
740 if (m_Players[i].IsInGame() && m_Players[i].IsAuthorized())
742 m_Players[i].DoBasicAdminChecks();
754 m_IsConnected = false;
756 m_IsAuthorized = false;
758 m_Admin = INVALID_ADMIN_ID;
761 m_bAdminCheckSignalled = false;
762 m_LastPassword.clear();
765 void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
767 m_IsConnected = true;
771 m_iIndex = engine->IndexOfEdict(pEntity);
774 strncopy(ip2, ip, sizeof(ip2));
775 if ((ptr = strchr(ip2, ':')) != NULL)
779 m_IpNoPort.assign(ip2);
782 void CPlayer::Connect()
791 const char *var = g_Players.GetPassInfoVar();
792 int client = engine->IndexOfEdict(m_pEdict);
795 const char *pass = engine->GetClientConVarValue(client, var);
796 m_LastPassword.assign(pass ? pass : "");
798 m_LastPassword.assign("");
803 DoPostConnectAuthorization();
807 void CPlayer::Authorize(const char *steamid)
814 m_IsAuthorized = true;
815 m_AuthID.assign(steamid);
818 void CPlayer::Disconnect()
821 m_IsConnected = false;
823 m_IsAuthorized = false;
829 m_bAdminCheckSignalled = false;
832 void CPlayer::SetName(const char *name)
837 const char *CPlayer::GetName()
839 return (m_Info) ? m_Info->GetName(): m_Name.c_str();
842 const char *CPlayer::GetIPAddress()
847 const char *CPlayer::GetAuthString()
849 return m_AuthID.c_str();
852 edict_t *CPlayer::GetEdict()
857 bool CPlayer::IsInGame()
862 bool CPlayer::IsConnected()
864 return m_IsConnected;
867 bool CPlayer::IsAuthorized()
869 return m_IsAuthorized;
872 IPlayerInfo *CPlayer::GetPlayerInfo()
877 bool CPlayer::IsFakeClient()
879 return (strcmp(m_AuthID.c_str(), "BOT") == 0);
882 void CPlayer::SetAdminId(AdminId id, bool temporary)
892 m_TempAdmin = temporary;
895 AdminId CPlayer::GetAdminId()
900 void CPlayer::DumpAdmin(bool deleting)
902 if (m_Admin != INVALID_ADMIN_ID)
904 if (m_TempAdmin && !deleting)
906 g_Admins.InvalidateAdmin(m_Admin);
908 m_Admin = INVALID_ADMIN_ID;
913 void CPlayer::Kick(const char *str)
915 INetChannel *pNetChan = static_cast<INetChannel *>(engine->GetPlayerNetInfo(m_iIndex));
916 IClient *pClient = static_cast<IClient *>(pNetChan->GetMsgHandler());
917 pClient->Disconnect("%s", str);
920 void CPlayer::Authorize_Post()
924 DoPostConnectAuthorization();
928 void CPlayer::DoPostConnectAuthorization()
931 PreAdminCheck->PushCell(m_iIndex);
932 PreAdminCheck->Execute(&result);
934 /* Defer, for better or worse */
935 if ((ResultType)result >= Pl_Handled)
946 /* Otherwise, go ahead and do admin checks */
947 DoBasicAdminChecks();
949 /* Send the notification out */
950 NotifyPostAdminChecks();
953 void CPlayer::NotifyPostAdminChecks()
955 if (m_bAdminCheckSignalled)
960 /* Block beforehand so they can't double-call */
961 m_bAdminCheckSignalled = true;
963 PostAdminCheck->PushCell(m_iIndex);
964 PostAdminCheck->Execute(NULL);
967 void CPlayer::DoBasicAdminChecks()
969 if (GetAdminId() != INVALID_ADMIN_ID)
974 /* First check the name */
976 int client = engine->IndexOfEdict(m_pEdict);
978 if ((id = g_Admins.FindAdminByIdentity("name", GetName())) != INVALID_ADMIN_ID)
980 if (!g_Players.CheckSetAdminName(client, this, id))
982 int userid = engine->GetPlayerUserId(m_pEdict);
983 g_Timers.CreateTimer(&s_KickPlayerTimer, 0.1f, (void *)userid, 0);
989 if ((id = g_Admins.FindAdminByIdentity("ip", m_IpNoPort.c_str())) != INVALID_ADMIN_ID)
991 if (g_Players.CheckSetAdmin(client, this, id))
997 /* Check IP address */
998 if ((id = g_Admins.FindAdminByIdentity("steam", m_AuthID.c_str())) != INVALID_ADMIN_ID)
1000 if (g_Players.CheckSetAdmin(client, this, id))