core/CPlayerManager.cpp
author Borja Ferrer <faluco@alliedmods.net>
Sun Feb 04 22:41:44 2007 +0000 (2007-02-04)
changeset 430 ed37e9767ed4
parent 370 d3a484f98f6d
child 435 3097c4ab9f8f
permissions -rw-r--r--
Optimized forwards, now paused functions are stored in a temp list so we dont have to check if they're runnable on each function execution.
dvander@370
     1
/**
dvander@370
     2
 * ===============================================================
dvander@370
     3
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     4
 * ===============================================================
dvander@370
     5
 *
dvander@370
     6
 * This file is not open source and may not be copied without explicit
dvander@370
     7
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     8
 * in whole or significant part.
dvander@370
     9
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    10
 *
dvander@370
    11
 * Version: $Id$
dvander@370
    12
 */
dvander@370
    13
faluco@226
    14
#include "CPlayerManager.h"
faluco@226
    15
#include "ForwardSys.h"
faluco@226
    16
faluco@242
    17
CPlayerManager g_PlayerManager;
faluco@242
    18
faluco@226
    19
SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char *, const char *, char *, int);
faluco@226
    20
SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, const char *);
faluco@226
    21
SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *);
faluco@226
    22
SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *);
faluco@242
    23
SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *);
faluco@268
    24
SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int);
faluco@226
    25
faluco@226
    26
void CPlayerManager::OnSourceModAllInitialized()
faluco@226
    27
{
faluco@226
    28
	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false);
faluco@226
    29
	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true);
faluco@226
    30
	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
faluco@226
    31
	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
faluco@226
    32
	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
faluco@242
    33
	SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
faluco@268
    34
	SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &CPlayerManager::OnServerActivate, true);
faluco@226
    35
faluco@226
    36
	/* Register OnClientConnect */
faluco@226
    37
	ParamType p1[] = {Param_Cell, Param_String, Param_Cell};
faluco@226
    38
	m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_Event, 3, p1);
faluco@226
    39
faluco@226
    40
	/* Register OnClientPutInServer */
faluco@226
    41
	ParamType p2[] = {Param_Cell};
faluco@226
    42
	m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2);
faluco@226
    43
faluco@226
    44
	/* Register OnClientDisconnect */
faluco@226
    45
	m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2);
faluco@226
    46
faluco@226
    47
	/* Register OnClientDisconnect_Post */
faluco@226
    48
	m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2);
faluco@226
    49
faluco@226
    50
	/* Register OnClientCommand */
faluco@226
    51
	m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 1, p2);
faluco@226
    52
faluco@242
    53
	/* Register OnClientSettingsChanged */
faluco@242
    54
	m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2);
faluco@242
    55
faluco@226
    56
	/* Register OnClientAuthorized */
faluco@226
    57
	//:TODO:
faluco@226
    58
}
faluco@226
    59
faluco@226
    60
void CPlayerManager::OnSourceModShutdown()
faluco@226
    61
{
faluco@226
    62
	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false);
faluco@226
    63
	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true);
faluco@226
    64
	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false);
faluco@226
    65
	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true);
faluco@226
    66
	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false);
faluco@242
    67
	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true);
faluco@268
    68
	SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &CPlayerManager::OnServerActivate, true);
faluco@226
    69
faluco@226
    70
	/* Release forwards */
faluco@226
    71
	g_Forwards.ReleaseForward(m_clconnect);
faluco@226
    72
	g_Forwards.ReleaseForward(m_clputinserver);
faluco@226
    73
	g_Forwards.ReleaseForward(m_cldisconnect);
faluco@226
    74
	g_Forwards.ReleaseForward(m_cldisconnect_post);
faluco@226
    75
	g_Forwards.ReleaseForward(m_clcommand);
faluco@242
    76
	g_Forwards.ReleaseForward(m_clinfochanged);
faluco@242
    77
faluco@242
    78
	delete [] m_Players;
faluco@226
    79
}
faluco@226
    80
faluco@268
    81
void CPlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
faluco@268
    82
{
faluco@269
    83
	if (m_FirstPass)
faluco@269
    84
	{
faluco@269
    85
		/* Initialize all players */
faluco@269
    86
		m_maxClients = clientMax;
faluco@269
    87
		m_PlayerCount = 0;
faluco@269
    88
		m_Players = new CPlayer[m_maxClients + 1];
faluco@269
    89
		m_FirstPass = false;
faluco@269
    90
	}
faluco@268
    91
}
faluco@268
    92
faluco@226
    93
bool CPlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen)
faluco@226
    94
{
faluco@226
    95
	cell_t res = 1;
faluco@242
    96
	int client = engine->IndexOfEdict(pEntity);
faluco@226
    97
faluco@242
    98
	m_Players[client].Initialize(pszName, pszAddress, pEntity);
faluco@242
    99
	m_clconnect->PushCell(client);
faluco@226
   100
	m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8, SM_PARAM_COPYBACK);
faluco@226
   101
	m_clconnect->PushCell(maxrejectlen);
faluco@226
   102
	m_clconnect->Execute(&res, NULL);
faluco@226
   103
faluco@226
   104
	return (res) ? true : false;
faluco@226
   105
}
faluco@226
   106
faluco@226
   107
void CPlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername)
faluco@226
   108
{
faluco@226
   109
	cell_t res;
faluco@242
   110
	int client = engine->IndexOfEdict(pEntity);
faluco@226
   111
faluco@242
   112
	m_Players[client].Connect();
faluco@242
   113
	m_PlayerCount++;
faluco@242
   114
	m_clputinserver->PushCell(client);
faluco@226
   115
	m_clputinserver->Execute(&res, NULL);
faluco@226
   116
}
faluco@226
   117
faluco@226
   118
void CPlayerManager::OnClientAuthorized()
faluco@226
   119
{
faluco@226
   120
	//:TODO:
faluco@226
   121
}
faluco@226
   122
faluco@226
   123
void CPlayerManager::OnClientDisconnect(edict_t *pEntity)
faluco@226
   124
{
faluco@226
   125
	cell_t res;
faluco@242
   126
	int client = engine->IndexOfEdict(pEntity);
faluco@226
   127
faluco@242
   128
	if (m_Players[client].IsPlayerConnected())
faluco@242
   129
	{
faluco@242
   130
		m_cldisconnect->PushCell(client);
faluco@242
   131
		m_cldisconnect->Execute(&res, NULL);
faluco@242
   132
	}
faluco@242
   133
	if (m_Players[client].IsPlayerInGame())
faluco@242
   134
	{
faluco@242
   135
		m_PlayerCount--;
faluco@242
   136
	}
faluco@242
   137
	m_Players[client].Disconnect();
faluco@226
   138
}
faluco@226
   139
faluco@226
   140
void CPlayerManager::OnClientDisconnect_Post(edict_t *pEntity)
faluco@226
   141
{
faluco@226
   142
	cell_t res;
faluco@226
   143
faluco@226
   144
	m_cldisconnect_post->PushCell(engine->IndexOfEdict(pEntity));
faluco@226
   145
	m_cldisconnect_post->Execute(&res, NULL);
faluco@226
   146
}
faluco@226
   147
faluco@226
   148
void CPlayerManager::OnClientCommand(edict_t *pEntity)
faluco@226
   149
{
faluco@226
   150
	cell_t res;
faluco@226
   151
faluco@226
   152
	m_clcommand->PushCell(engine->IndexOfEdict(pEntity));
faluco@226
   153
	m_clcommand->Execute(&res, NULL);
faluco@242
   154
faluco@242
   155
	//:TODO: res should be evaluated here for something, DOCUMENT this in the INC FILE!
faluco@242
   156
}
faluco@242
   157
faluco@242
   158
void CPlayerManager::OnClientSettingsChanged(edict_t *pEntity)
faluco@242
   159
{
faluco@242
   160
	cell_t res;
faluco@242
   161
	int client = engine->IndexOfEdict(pEntity);
faluco@242
   162
faluco@242
   163
	m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity));
faluco@242
   164
	m_clinfochanged->Execute(&res, NULL);
faluco@242
   165
	if (m_Players[client].IsPlayerInGame())
faluco@242
   166
	{
faluco@242
   167
		m_Players[client].SetName(engine->GetClientConVarValue(client, "name"));
faluco@242
   168
	}
faluco@242
   169
}