1.1 --- a/core/CPlayerManager.cpp Mon Jan 01 03:23:57 2007 +0000
1.2 +++ b/core/CPlayerManager.cpp Mon Jan 01 03:33:14 2007 +0000
1.3 @@ -1,10 +1,13 @@
1.4 #include "CPlayerManager.h"
1.5 #include "ForwardSys.h"
1.6
1.7 +CPlayerManager g_PlayerManager;
1.8 +
1.9 SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char *, const char *, char *, int);
1.10 SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, const char *);
1.11 SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *);
1.12 SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *);
1.13 +SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *);
1.14
1.15 void CPlayerManager::OnSourceModAllInitialized()
1.16 {
1.17 @@ -13,6 +16,7 @@
1.18 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
1.19 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
1.20 SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
1.21 + SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
1.22
1.23 /* Register OnClientConnect */
1.24 ParamType p1[] = {Param_Cell, Param_String, Param_Cell};
1.25 @@ -31,8 +35,16 @@
1.26 /* Register OnClientCommand */
1.27 m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 1, p2);
1.28
1.29 + /* Register OnClientSettingsChanged */
1.30 + m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2);
1.31 +
1.32 /* Register OnClientAuthorized */
1.33 //:TODO:
1.34 +
1.35 + /* Initialize all players */
1.36 + m_maxClients = g_SMAPI->pGlobals()->maxClients;
1.37 + m_PlayerCount = 0;
1.38 + m_Players = new CPlayer[m_maxClients];
1.39 }
1.40
1.41 void CPlayerManager::OnSourceModShutdown()
1.42 @@ -42,6 +54,7 @@
1.43 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
1.44 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
1.45 SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
1.46 + SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
1.47
1.48 /* Release forwards */
1.49 g_Forwards.ReleaseForward(m_clconnect);
1.50 @@ -49,13 +62,18 @@
1.51 g_Forwards.ReleaseForward(m_cldisconnect);
1.52 g_Forwards.ReleaseForward(m_cldisconnect_post);
1.53 g_Forwards.ReleaseForward(m_clcommand);
1.54 + g_Forwards.ReleaseForward(m_clinfochanged);
1.55 +
1.56 + delete [] m_Players;
1.57 }
1.58
1.59 bool CPlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen)
1.60 {
1.61 cell_t res = 1;
1.62 + int client = engine->IndexOfEdict(pEntity);
1.63
1.64 - m_clconnect->PushCell(engine->IndexOfEdict(pEntity));
1.65 + m_Players[client].Initialize(pszName, pszAddress, pEntity);
1.66 + m_clconnect->PushCell(client);
1.67 m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8, SM_PARAM_COPYBACK);
1.68 m_clconnect->PushCell(maxrejectlen);
1.69 m_clconnect->Execute(&res, NULL);
1.70 @@ -66,8 +84,11 @@
1.71 void CPlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername)
1.72 {
1.73 cell_t res;
1.74 + int client = engine->IndexOfEdict(pEntity);
1.75
1.76 - m_clputinserver->PushCell(engine->IndexOfEdict(pEntity));
1.77 + m_Players[client].Connect();
1.78 + m_PlayerCount++;
1.79 + m_clputinserver->PushCell(client);
1.80 m_clputinserver->Execute(&res, NULL);
1.81 }
1.82
1.83 @@ -79,9 +100,18 @@
1.84 void CPlayerManager::OnClientDisconnect(edict_t *pEntity)
1.85 {
1.86 cell_t res;
1.87 + int client = engine->IndexOfEdict(pEntity);
1.88
1.89 - m_cldisconnect->PushCell(engine->IndexOfEdict(pEntity));
1.90 - m_cldisconnect->Execute(&res, NULL);
1.91 + if (m_Players[client].IsPlayerConnected())
1.92 + {
1.93 + m_cldisconnect->PushCell(client);
1.94 + m_cldisconnect->Execute(&res, NULL);
1.95 + }
1.96 + if (m_Players[client].IsPlayerInGame())
1.97 + {
1.98 + m_PlayerCount--;
1.99 + }
1.100 + m_Players[client].Disconnect();
1.101 }
1.102
1.103 void CPlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
1.104 @@ -98,4 +128,19 @@
1.105
1.106 m_clcommand->PushCell(engine->IndexOfEdict(pEntity));
1.107 m_clcommand->Execute(&res, NULL);
1.108 -}
1.109 \ No newline at end of file
1.110 +
1.111 + //:TODO: res should be evaluated here for something, DOCUMENT this in the INC FILE!
1.112 +}
1.113 +
1.114 +void CPlayerManager::OnClientSettingsChanged(edict_t *pEntity)
1.115 +{
1.116 + cell_t res;
1.117 + int client = engine->IndexOfEdict(pEntity);
1.118 +
1.119 + m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity));
1.120 + m_clinfochanged->Execute(&res, NULL);
1.121 + if (m_Players[client].IsPlayerInGame())
1.122 + {
1.123 + m_Players[client].SetName(engine->GetClientConVarValue(client, "name"));
1.124 + }
1.125 +}