core/CPlayerManager.cpp
changeset 242 9dcd59d9014a
parent 226 4663ea3fc2d3
child 268 d6fed4f05e07
     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 +}