core/CPlayerManager.cpp
author David Anderson <dvander@alliedmods.net>
Tue Jan 16 20:36:09 2007 +0000 (2007-01-16)
changeset 300 186b2f7bf277
parent 269 0658b8daeba6
child 370 d3a484f98f6d
permissions -rw-r--r--
fixed up bad includes
     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 SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int);
    12 
    13 void CPlayerManager::OnSourceModAllInitialized()
    14 {
    15 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false);
    16 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true);
    17 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
    18 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
    19 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
    20 	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
    21 	SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &CPlayerManager::OnServerActivate, true);
    22 
    23 	/* Register OnClientConnect */
    24 	ParamType p1[] = {Param_Cell, Param_String, Param_Cell};
    25 	m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_Event, 3, p1);
    26 
    27 	/* Register OnClientPutInServer */
    28 	ParamType p2[] = {Param_Cell};
    29 	m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2);
    30 
    31 	/* Register OnClientDisconnect */
    32 	m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2);
    33 
    34 	/* Register OnClientDisconnect_Post */
    35 	m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2);
    36 
    37 	/* Register OnClientCommand */
    38 	m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 1, p2);
    39 
    40 	/* Register OnClientSettingsChanged */
    41 	m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2);
    42 
    43 	/* Register OnClientAuthorized */
    44 	//:TODO:
    45 }
    46 
    47 void CPlayerManager::OnSourceModShutdown()
    48 {
    49 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false);
    50 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true);
    51 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
    52 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
    53 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
    54 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
    55 	SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &CPlayerManager::OnServerActivate, true);
    56 
    57 	/* Release forwards */
    58 	g_Forwards.ReleaseForward(m_clconnect);
    59 	g_Forwards.ReleaseForward(m_clputinserver);
    60 	g_Forwards.ReleaseForward(m_cldisconnect);
    61 	g_Forwards.ReleaseForward(m_cldisconnect_post);
    62 	g_Forwards.ReleaseForward(m_clcommand);
    63 	g_Forwards.ReleaseForward(m_clinfochanged);
    64 
    65 	delete [] m_Players;
    66 }
    67 
    68 void CPlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
    69 {
    70 	if (m_FirstPass)
    71 	{
    72 		/* Initialize all players */
    73 		m_maxClients = clientMax;
    74 		m_PlayerCount = 0;
    75 		m_Players = new CPlayer[m_maxClients + 1];
    76 		m_FirstPass = false;
    77 	}
    78 }
    79 
    80 bool CPlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen)
    81 {
    82 	cell_t res = 1;
    83 	int client = engine->IndexOfEdict(pEntity);
    84 
    85 	m_Players[client].Initialize(pszName, pszAddress, pEntity);
    86 	m_clconnect->PushCell(client);
    87 	m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8, SM_PARAM_COPYBACK);
    88 	m_clconnect->PushCell(maxrejectlen);
    89 	m_clconnect->Execute(&res, NULL);
    90 
    91 	return (res) ? true : false;
    92 }
    93 
    94 void CPlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername)
    95 {
    96 	cell_t res;
    97 	int client = engine->IndexOfEdict(pEntity);
    98 
    99 	m_Players[client].Connect();
   100 	m_PlayerCount++;
   101 	m_clputinserver->PushCell(client);
   102 	m_clputinserver->Execute(&res, NULL);
   103 }
   104 
   105 void CPlayerManager::OnClientAuthorized()
   106 {
   107 	//:TODO:
   108 }
   109 
   110 void CPlayerManager::OnClientDisconnect(edict_t *pEntity)
   111 {
   112 	cell_t res;
   113 	int client = engine->IndexOfEdict(pEntity);
   114 
   115 	if (m_Players[client].IsPlayerConnected())
   116 	{
   117 		m_cldisconnect->PushCell(client);
   118 		m_cldisconnect->Execute(&res, NULL);
   119 	}
   120 	if (m_Players[client].IsPlayerInGame())
   121 	{
   122 		m_PlayerCount--;
   123 	}
   124 	m_Players[client].Disconnect();
   125 }
   126 
   127 void CPlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
   128 {
   129 	cell_t res;
   130 
   131 	m_cldisconnect_post->PushCell(engine->IndexOfEdict(pEntity));
   132 	m_cldisconnect_post->Execute(&res, NULL);
   133 }
   134 
   135 void CPlayerManager::OnClientCommand(edict_t *pEntity)
   136 {
   137 	cell_t res;
   138 
   139 	m_clcommand->PushCell(engine->IndexOfEdict(pEntity));
   140 	m_clcommand->Execute(&res, NULL);
   141 
   142 	//:TODO: res should be evaluated here for something, DOCUMENT this in the INC FILE!
   143 }
   144 
   145 void CPlayerManager::OnClientSettingsChanged(edict_t *pEntity)
   146 {
   147 	cell_t res;
   148 	int client = engine->IndexOfEdict(pEntity);
   149 
   150 	m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity));
   151 	m_clinfochanged->Execute(&res, NULL);
   152 	if (m_Players[client].IsPlayerInGame())
   153 	{
   154 		m_Players[client].SetName(engine->GetClientConVarValue(client, "name"));
   155 	}
   156 }