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