faluco@226: #include "CPlayerManager.h" faluco@226: #include "ForwardSys.h" faluco@226: faluco@242: CPlayerManager g_PlayerManager; faluco@242: faluco@226: SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char *, const char *, char *, int); faluco@226: SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, const char *); faluco@226: SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *); faluco@226: SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); faluco@242: SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *); faluco@268: SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int); faluco@226: faluco@226: void CPlayerManager::OnSourceModAllInitialized() faluco@226: { faluco@226: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false); faluco@226: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true); faluco@226: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false); faluco@226: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true); faluco@226: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false); faluco@242: SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true); faluco@268: SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &CPlayerManager::OnServerActivate, true); faluco@226: faluco@226: /* Register OnClientConnect */ faluco@226: ParamType p1[] = {Param_Cell, Param_String, Param_Cell}; faluco@226: m_clconnect = g_Forwards.CreateForward("OnClientConnect", ET_Event, 3, p1); faluco@226: faluco@226: /* Register OnClientPutInServer */ faluco@226: ParamType p2[] = {Param_Cell}; faluco@226: m_clputinserver = g_Forwards.CreateForward("OnClientPutInServer", ET_Ignore, 1, p2); faluco@226: faluco@226: /* Register OnClientDisconnect */ faluco@226: m_cldisconnect = g_Forwards.CreateForward("OnClientDisconnect", ET_Ignore, 1, p2); faluco@226: faluco@226: /* Register OnClientDisconnect_Post */ faluco@226: m_cldisconnect_post = g_Forwards.CreateForward("OnClientDisconnect_Post", ET_Ignore, 1, p2); faluco@226: faluco@226: /* Register OnClientCommand */ faluco@226: m_clcommand = g_Forwards.CreateForward("OnClientCommand", ET_Hook, 1, p2); faluco@226: faluco@242: /* Register OnClientSettingsChanged */ faluco@242: m_clinfochanged = g_Forwards.CreateForward("OnClientSettingsChanged", ET_Ignore, 1, p2); faluco@242: faluco@226: /* Register OnClientAuthorized */ faluco@226: //:TODO: faluco@226: } faluco@226: faluco@226: void CPlayerManager::OnSourceModShutdown() faluco@226: { faluco@226: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, serverClients, this, &CPlayerManager::OnClientConnect, false); faluco@226: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, serverClients, this, &CPlayerManager::OnClientPutInServer, true); faluco@226: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect, false); faluco@226: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, serverClients, this, &CPlayerManager::OnClientDisconnect_Post, true); faluco@226: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, serverClients, this, &CPlayerManager::OnClientCommand, false); faluco@242: SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, serverClients, this, &CPlayerManager::OnClientSettingsChanged, true); faluco@268: SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, gamedll, this, &CPlayerManager::OnServerActivate, true); faluco@226: faluco@226: /* Release forwards */ faluco@226: g_Forwards.ReleaseForward(m_clconnect); faluco@226: g_Forwards.ReleaseForward(m_clputinserver); faluco@226: g_Forwards.ReleaseForward(m_cldisconnect); faluco@226: g_Forwards.ReleaseForward(m_cldisconnect_post); faluco@226: g_Forwards.ReleaseForward(m_clcommand); faluco@242: g_Forwards.ReleaseForward(m_clinfochanged); faluco@242: faluco@242: delete [] m_Players; faluco@226: } faluco@226: faluco@268: void CPlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax) faluco@268: { faluco@269: if (m_FirstPass) faluco@269: { faluco@269: /* Initialize all players */ faluco@269: m_maxClients = clientMax; faluco@269: m_PlayerCount = 0; faluco@269: m_Players = new CPlayer[m_maxClients + 1]; faluco@269: m_FirstPass = false; faluco@269: } faluco@268: } faluco@268: faluco@226: bool CPlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) faluco@226: { faluco@226: cell_t res = 1; faluco@242: int client = engine->IndexOfEdict(pEntity); faluco@226: faluco@242: m_Players[client].Initialize(pszName, pszAddress, pEntity); faluco@242: m_clconnect->PushCell(client); faluco@226: m_clconnect->PushStringEx(reject, maxrejectlen, SM_PARAM_STRING_UTF8, SM_PARAM_COPYBACK); faluco@226: m_clconnect->PushCell(maxrejectlen); faluco@226: m_clconnect->Execute(&res, NULL); faluco@226: faluco@226: return (res) ? true : false; faluco@226: } faluco@226: faluco@226: void CPlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername) faluco@226: { faluco@226: cell_t res; faluco@242: int client = engine->IndexOfEdict(pEntity); faluco@226: faluco@242: m_Players[client].Connect(); faluco@242: m_PlayerCount++; faluco@242: m_clputinserver->PushCell(client); faluco@226: m_clputinserver->Execute(&res, NULL); faluco@226: } faluco@226: faluco@226: void CPlayerManager::OnClientAuthorized() faluco@226: { faluco@226: //:TODO: faluco@226: } faluco@226: faluco@226: void CPlayerManager::OnClientDisconnect(edict_t *pEntity) faluco@226: { faluco@226: cell_t res; faluco@242: int client = engine->IndexOfEdict(pEntity); faluco@226: faluco@242: if (m_Players[client].IsPlayerConnected()) faluco@242: { faluco@242: m_cldisconnect->PushCell(client); faluco@242: m_cldisconnect->Execute(&res, NULL); faluco@242: } faluco@242: if (m_Players[client].IsPlayerInGame()) faluco@242: { faluco@242: m_PlayerCount--; faluco@242: } faluco@242: m_Players[client].Disconnect(); faluco@226: } faluco@226: faluco@226: void CPlayerManager::OnClientDisconnect_Post(edict_t *pEntity) faluco@226: { faluco@226: cell_t res; faluco@226: faluco@226: m_cldisconnect_post->PushCell(engine->IndexOfEdict(pEntity)); faluco@226: m_cldisconnect_post->Execute(&res, NULL); faluco@226: } faluco@226: faluco@226: void CPlayerManager::OnClientCommand(edict_t *pEntity) faluco@226: { faluco@226: cell_t res; faluco@226: faluco@226: m_clcommand->PushCell(engine->IndexOfEdict(pEntity)); faluco@226: m_clcommand->Execute(&res, NULL); faluco@242: faluco@242: //:TODO: res should be evaluated here for something, DOCUMENT this in the INC FILE! faluco@242: } faluco@242: faluco@242: void CPlayerManager::OnClientSettingsChanged(edict_t *pEntity) faluco@242: { faluco@242: cell_t res; faluco@242: int client = engine->IndexOfEdict(pEntity); faluco@242: faluco@242: m_clinfochanged->PushCell(engine->IndexOfEdict(pEntity)); faluco@242: m_clinfochanged->Execute(&res, NULL); faluco@242: if (m_Players[client].IsPlayerInGame()) faluco@242: { faluco@242: m_Players[client].SetName(engine->GetClientConVarValue(client, "name")); faluco@242: } faluco@242: }