Move PlayerRunCmd to a global VTable Hook (bug 6051, r=psychonic).
This commit is contained in:
@@ -116,36 +116,18 @@ void CHookManager::OnClientPutInServer(int client)
|
||||
return;
|
||||
}
|
||||
|
||||
SH_ADD_MANUALHOOK(PlayerRunCmdHook, pEntity, SH_MEMBER(this, &CHookManager::PlayerRunCmd), false);
|
||||
}
|
||||
|
||||
void CHookManager::OnClientDisconnecting(int client)
|
||||
{
|
||||
if (!PRCH_enabled)
|
||||
return;
|
||||
|
||||
if (!PRCH_used)
|
||||
return;
|
||||
|
||||
edict_t *pEdict = PEntityOfEntIndex(client);
|
||||
if (!pEdict)
|
||||
CVTableHook hook(pEntity);
|
||||
for (size_t i = 0; i < m_runUserCmdHooks.length(); ++i)
|
||||
{
|
||||
return;
|
||||
if (hook == m_runUserCmdHooks[i])
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
IServerUnknown *pUnknown = pEdict->GetUnknown();
|
||||
if (!pUnknown)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CBaseEntity *pEntity = pUnknown->GetBaseEntity();
|
||||
if (!pEntity)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SH_REMOVE_MANUALHOOK(PlayerRunCmdHook, pEntity, SH_MEMBER(this, &CHookManager::PlayerRunCmd), false);
|
||||
int hookid = SH_ADD_MANUALVPHOOK(PlayerRunCmdHook, pEntity, SH_MEMBER(this, &CHookManager::PlayerRunCmd), false);
|
||||
hook.SetHookID(hookid);
|
||||
m_runUserCmdHooks.append(new CVTableHook(hook));
|
||||
}
|
||||
|
||||
void CHookManager::PlayerRunCmd(CUserCmd *ucmd, IMoveHelper *moveHelper)
|
||||
@@ -245,15 +227,12 @@ void CHookManager::OnPluginUnloaded(IPlugin *plugin)
|
||||
if (m_usercmdsFwd->GetFunctionCount())
|
||||
return;
|
||||
|
||||
int MaxClients = playerhelpers->GetMaxClients();
|
||||
for (int i = 1; i <= MaxClients; i++)
|
||||
for (size_t i = 0; i < m_runUserCmdHooks.length(); ++i)
|
||||
{
|
||||
if (playerhelpers->GetGamePlayer(i)->IsInGame())
|
||||
{
|
||||
OnClientDisconnecting(i);
|
||||
}
|
||||
delete m_runUserCmdHooks[i];
|
||||
}
|
||||
|
||||
m_runUserCmdHooks.clear();
|
||||
PRCH_used = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
class CUserCmd;
|
||||
|
||||
#include "extension.h"
|
||||
#include "amtl/am-vector.h"
|
||||
#include "vtable_hook_helper.h"
|
||||
|
||||
class CHookManager : IPluginsListener, IFeatureProvider
|
||||
{
|
||||
@@ -43,7 +45,6 @@ public:
|
||||
void Initialize();
|
||||
void Shutdown();
|
||||
void OnClientPutInServer(int client);
|
||||
void OnClientDisconnecting(int client);
|
||||
void PlayerRunCmd(CUserCmd *ucmd, IMoveHelper *moveHelper);
|
||||
public: //IPluginsListener
|
||||
void OnPluginLoaded(IPlugin *plugin);
|
||||
@@ -53,6 +54,7 @@ public: //IFeatureProvider
|
||||
|
||||
private:
|
||||
IForward *m_usercmdsFwd;
|
||||
ke::Vector<CVTableHook *> m_runUserCmdHooks;
|
||||
};
|
||||
|
||||
extern CHookManager g_Hooks;
|
||||
|
||||
@@ -173,8 +173,6 @@ bool SDKTools::OnSetClientListening(int iReceiver, int iSender, bool bListen)
|
||||
|
||||
void SDKTools::OnClientDisconnecting(int client)
|
||||
{
|
||||
g_Hooks.OnClientDisconnecting(client);
|
||||
|
||||
int max_clients = playerhelpers->GetMaxClients();
|
||||
|
||||
if (g_VoiceHookCount == 0)
|
||||
|
||||
Reference in New Issue
Block a user