core/CPlayerManager.cpp
author Borja Ferrer <faluco@alliedmods.net>
Mon Jan 01 23:14:20 2007 +0000 (2007-01-01)
changeset 258 2637fcf24c2f
parent 242 9dcd59d9014a
child 268 d6fed4f05e07
permissions -rw-r--r--
more comments
     1 #include "CPlayerManager.h"
     2 #include "ForwardSys.h"
     3 
     4 CPlayerManager g_PlayerManager;
     5 
     6 SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char *, const char *, char *, int);
     7 SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, const char *);
     8 SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *);
     9 SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *);
    10 SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *);
    11 
    12 void CPlayerManager::OnSourceModAllInitialized()
    13 {
    14 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false);
    15 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true);
    16 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
    17 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
    18 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
    19 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
    20 
    21 	/* Register OnClientConnect */
    22 	ParamType p1[] = {Param_Cell, Param_String, Param_Cell};
    23 	m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_Event, 3, p1);
    24 
    25 	/* Register OnClientPutInServer */
    26 	ParamType p2[] = {Param_Cell};
    27 	m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2);
    28 
    29 	/* Register OnClientDisconnect */
    30 	m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2);
    31 
    32 	/* Register OnClientDisconnect_Post */
    33 	m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2);
    34 
    35 	/* Register OnClientCommand */
    36 	m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 1, p2);
    37 
    38 	/* Register OnClientSettingsChanged */
    39 	m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2);
    40 
    41 	/* Register OnClientAuthorized */
    42 	//:TODO:
    43 
    44 	/* Initialize all players */
    45 	m_maxClients = g_SMAPI->pGlobals()->maxClients;
    46 	m_PlayerCount = 0;
    47 	m_Players = new CPlayer[m_maxClients];
    48 }
    49 
    50 void CPlayerManager::OnSourceModShutdown()
    51 {
    52 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false);
    53 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true);
    54 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
    55 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
    56 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
    57 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
    58 
    59 	/* Release forwards */
    60 	g_Forwards.ReleaseForward(m_clconnect);
    61 	g_Forwards.ReleaseForward(m_clputinserver);
    62 	g_Forwards.ReleaseForward(m_cldisconnect);
    63 	g_Forwards.ReleaseForward(m_cldisconnect_post);
    64 	g_Forwards.ReleaseForward(m_clcommand);
    65 	g_Forwards.ReleaseForward(m_clinfochanged);
    66 
    67 	delete [] m_Players;
    68 }
    69 
    70 bool CPlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen)
    71 {
    72 	cell_t res = 1;
    73 	int client = engine->IndexOfEdict(pEntity);
    74 
    75 	m_Players[client].Initialize(pszName, pszAddress, pEntity);
    76 	m_clconnect->PushCell(client);
    77 	m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8, SM_PARAM_COPYBACK);
    78 	m_clconnect->PushCell(maxrejectlen);
    79 	m_clconnect->Execute(&res, NULL);
    80 
    81 	return (res) ? true : false;
    82 }
    83 
    84 void CPlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername)
    85 {
    86 	cell_t res;
    87 	int client = engine->IndexOfEdict(pEntity);
    88 
    89 	m_Players[client].Connect();
    90 	m_PlayerCount++;
    91 	m_clputinserver->PushCell(client);
    92 	m_clputinserver->Execute(&res, NULL);
    93 }
    94 
    95 void CPlayerManager::OnClientAuthorized()
    96 {
    97 	//:TODO:
    98 }
    99 
   100 void CPlayerManager::OnClientDisconnect(edict_t *pEntity)
   101 {
   102 	cell_t res;
   103 	int client = engine->IndexOfEdict(pEntity);
   104 
   105 	if (m_Players[client].IsPlayerConnected())
   106 	{
   107 		m_cldisconnect->PushCell(client);
   108 		m_cldisconnect->Execute(&res, NULL);
   109 	}
   110 	if (m_Players[client].IsPlayerInGame())
   111 	{
   112 		m_PlayerCount--;
   113 	}
   114 	m_Players[client].Disconnect();
   115 }
   116 
   117 void CPlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
   118 {
   119 	cell_t res;
   120 
   121 	m_cldisconnect_post->PushCell(engine->IndexOfEdict(pEntity));
   122 	m_cldisconnect_post->Execute(&res, NULL);
   123 }
   124 
   125 void CPlayerManager::OnClientCommand(edict_t *pEntity)
   126 {
   127 	cell_t res;
   128 
   129 	m_clcommand->PushCell(engine->IndexOfEdict(pEntity));
   130 	m_clcommand->Execute(&res, NULL);
   131 
   132 	//:TODO: res should be evaluated here for something, DOCUMENT this in the INC FILE!
   133 }
   134 
   135 void CPlayerManager::OnClientSettingsChanged(edict_t *pEntity)
   136 {
   137 	cell_t res;
   138 	int client = engine->IndexOfEdict(pEntity);
   139 
   140 	m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity));
   141 	m_clinfochanged->Execute(&res, NULL);
   142 	if (m_Players[client].IsPlayerInGame())
   143 	{
   144 		m_Players[client].SetName(engine->GetClientConVarValue(client, "name"));
   145 	}
   146 }