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