2 * ===============================================================
3 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
4 * ===============================================================
6 * This file is not open source and may not be copied without explicit
7 * written permission of AlliedModders LLC. This file may not be redistributed
8 * in whole or significant part.
9 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
14 #include "CPlayerManager.h"
15 #include "ForwardSys.h"
17 CPlayerManager g_PlayerManager;
19 SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char *, const char *, char *, int);
20 SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, const char *);
21 SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *);
22 SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *);
23 SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *);
24 SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int);
26 void CPlayerManager::OnSourceModAllInitialized()
28 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false);
29 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true);
30 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
31 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
32 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
33 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
34 SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &CPlayerManager::OnServerActivate, true);
36 /* Register OnClientConnect */
37 ParamType p1[] = {Param_Cell, Param_String, Param_Cell};
38 m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_Event, 3, p1);
40 /* Register OnClientPutInServer */
41 ParamType p2[] = {Param_Cell};
42 m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2);
44 /* Register OnClientDisconnect */
45 m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2);
47 /* Register OnClientDisconnect_Post */
48 m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2);
50 /* Register OnClientCommand */
51 m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 1, p2);
53 /* Register OnClientSettingsChanged */
54 m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2);
56 /* Register OnClientAuthorized */
60 void CPlayerManager::OnSourceModShutdown()
62 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false);
63 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true);
64 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
65 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
66 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
67 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
68 SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &CPlayerManager::OnServerActivate, true);
70 /* Release forwards */
71 g_Forwards.ReleaseForward(m_clconnect);
72 g_Forwards.ReleaseForward(m_clputinserver);
73 g_Forwards.ReleaseForward(m_cldisconnect);
74 g_Forwards.ReleaseForward(m_cldisconnect_post);
75 g_Forwards.ReleaseForward(m_clcommand);
76 g_Forwards.ReleaseForward(m_clinfochanged);
81 void CPlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
85 /* Initialize all players */
86 m_maxClients = clientMax;
88 m_Players = new CPlayer[m_maxClients + 1];
93 bool CPlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen)
96 int client = engine->IndexOfEdict(pEntity);
98 m_Players[client].Initialize(pszName, pszAddress, pEntity);
99 m_clconnect->PushCell(client);
100 m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8, SM_PARAM_COPYBACK);
101 m_clconnect->PushCell(maxrejectlen);
102 m_clconnect->Execute(&res, NULL);
104 return (res) ? true : false;
107 void CPlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername)
110 int client = engine->IndexOfEdict(pEntity);
112 m_Players[client].Connect();
114 m_clputinserver->PushCell(client);
115 m_clputinserver->Execute(&res, NULL);
118 void CPlayerManager::OnClientAuthorized()
123 void CPlayerManager::OnClientDisconnect(edict_t *pEntity)
126 int client = engine->IndexOfEdict(pEntity);
128 if (m_Players[client].IsPlayerConnected())
130 m_cldisconnect->PushCell(client);
131 m_cldisconnect->Execute(&res, NULL);
133 if (m_Players[client].IsPlayerInGame())
137 m_Players[client].Disconnect();
140 void CPlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
144 m_cldisconnect_post->PushCell(engine->IndexOfEdict(pEntity));
145 m_cldisconnect_post->Execute(&res, NULL);
148 void CPlayerManager::OnClientCommand(edict_t *pEntity)
152 m_clcommand->PushCell(engine->IndexOfEdict(pEntity));
153 m_clcommand->Execute(&res, NULL);
155 //:TODO: res should be evaluated here for something, DOCUMENT this in the INC FILE!
158 void CPlayerManager::OnClientSettingsChanged(edict_t *pEntity)
161 int client = engine->IndexOfEdict(pEntity);
163 m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity));
164 m_clinfochanged->Execute(&res, NULL);
165 if (m_Players[client].IsPlayerInGame())
167 m_Players[client].SetName(engine->GetClientConVarValue(client, "name"));