core/CPlayerManager.cpp
author David Anderson <dvander@alliedmods.net>
Thu Jan 25 22:36:38 2007 +0000 (2007-01-25)
changeset 370 d3a484f98f6d
parent 269 0658b8daeba6
child 435 3097c4ab9f8f
permissions -rw-r--r--
added license headers
     1 /**
     2  * ===============================================================
     3  * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
     4  * ===============================================================
     5  *
     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
    10  *
    11  * Version: $Id$
    12  */
    13 
    14 #include "CPlayerManager.h"
    15 #include "ForwardSys.h"
    16 
    17 CPlayerManager g_PlayerManager;
    18 
    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);
    25 
    26 void CPlayerManager::OnSourceModAllInitialized()
    27 {
    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);
    35 
    36 	/* Register OnClientConnect */
    37 	ParamType p1[] = {Param_Cell, Param_String, Param_Cell};
    38 	m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_Event, 3, p1);
    39 
    40 	/* Register OnClientPutInServer */
    41 	ParamType p2[] = {Param_Cell};
    42 	m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2);
    43 
    44 	/* Register OnClientDisconnect */
    45 	m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2);
    46 
    47 	/* Register OnClientDisconnect_Post */
    48 	m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2);
    49 
    50 	/* Register OnClientCommand */
    51 	m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 1, p2);
    52 
    53 	/* Register OnClientSettingsChanged */
    54 	m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2);
    55 
    56 	/* Register OnClientAuthorized */
    57 	//:TODO:
    58 }
    59 
    60 void CPlayerManager::OnSourceModShutdown()
    61 {
    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);
    69 
    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);
    77 
    78 	delete [] m_Players;
    79 }
    80 
    81 void CPlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
    82 {
    83 	if (m_FirstPass)
    84 	{
    85 		/* Initialize all players */
    86 		m_maxClients = clientMax;
    87 		m_PlayerCount = 0;
    88 		m_Players = new CPlayer[m_maxClients + 1];
    89 		m_FirstPass = false;
    90 	}
    91 }
    92 
    93 bool CPlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen)
    94 {
    95 	cell_t res = 1;
    96 	int client = engine->IndexOfEdict(pEntity);
    97 
    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);
   103 
   104 	return (res) ? true : false;
   105 }
   106 
   107 void CPlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername)
   108 {
   109 	cell_t res;
   110 	int client = engine->IndexOfEdict(pEntity);
   111 
   112 	m_Players[client].Connect();
   113 	m_PlayerCount++;
   114 	m_clputinserver->PushCell(client);
   115 	m_clputinserver->Execute(&res, NULL);
   116 }
   117 
   118 void CPlayerManager::OnClientAuthorized()
   119 {
   120 	//:TODO:
   121 }
   122 
   123 void CPlayerManager::OnClientDisconnect(edict_t *pEntity)
   124 {
   125 	cell_t res;
   126 	int client = engine->IndexOfEdict(pEntity);
   127 
   128 	if (m_Players[client].IsPlayerConnected())
   129 	{
   130 		m_cldisconnect->PushCell(client);
   131 		m_cldisconnect->Execute(&res, NULL);
   132 	}
   133 	if (m_Players[client].IsPlayerInGame())
   134 	{
   135 		m_PlayerCount--;
   136 	}
   137 	m_Players[client].Disconnect();
   138 }
   139 
   140 void CPlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
   141 {
   142 	cell_t res;
   143 
   144 	m_cldisconnect_post->PushCell(engine->IndexOfEdict(pEntity));
   145 	m_cldisconnect_post->Execute(&res, NULL);
   146 }
   147 
   148 void CPlayerManager::OnClientCommand(edict_t *pEntity)
   149 {
   150 	cell_t res;
   151 
   152 	m_clcommand->PushCell(engine->IndexOfEdict(pEntity));
   153 	m_clcommand->Execute(&res, NULL);
   154 
   155 	//:TODO: res should be evaluated here for something, DOCUMENT this in the INC FILE!
   156 }
   157 
   158 void CPlayerManager::OnClientSettingsChanged(edict_t *pEntity)
   159 {
   160 	cell_t res;
   161 	int client = engine->IndexOfEdict(pEntity);
   162 
   163 	m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity));
   164 	m_clinfochanged->Execute(&res, NULL);
   165 	if (m_Players[client].IsPlayerInGame())
   166 	{
   167 		m_Players[client].SetName(engine->GetClientConVarValue(client, "name"));
   168 	}
   169 }