From 9d09a52e99768b30938d03e37cd7ddf0b04202ca Mon Sep 17 00:00:00 2001 From: Dr!fter Date: Sat, 27 Aug 2016 10:20:38 -0400 Subject: [PATCH] Switch to amtl vectors. Change how hooks are checked for removal on frame action. --- extension.h | 1 - listeners.cpp | 46 +++++++++++++++++++++------------------------- listeners.h | 2 +- natives.cpp | 16 ++++++++-------- natives.h | 2 +- vhook.cpp | 7 +++---- vhook.h | 1 - 7 files changed, 34 insertions(+), 41 deletions(-) diff --git a/extension.h b/extension.h index 043937a..c6e7045 100644 --- a/extension.h +++ b/extension.h @@ -42,7 +42,6 @@ #include #include #include -#include #include "sdk-hacks.h" /** diff --git a/listeners.cpp b/listeners.cpp index 71d9bef..97b0f17 100644 --- a/listeners.cpp +++ b/listeners.cpp @@ -3,42 +3,39 @@ using namespace SourceHook; -SourceHook::CVector g_EntityListeners; - +ke::Vector g_EntityListeners; +ke::Vectorg_pRemoveList; void FrameCleanupHooks(void *data) { - for (int i = g_pHooks.size() - 1; i >= 0; i--) + for (int i = g_pRemoveList.length() - 1; i >= 0; i--) { - DHooksManager *manager = g_pHooks.at(i); - if (manager->bDelete) - { - delete manager; - g_pHooks.erase(g_pHooks.iterAt(i)); - } + DHooksManager *manager = g_pRemoveList.at(i); + delete manager; + g_pRemoveList.remove(i); } } void DHooks::OnCoreMapEnd() { - for(int i = g_pHooks.size() -1; i >= 0; i--) + for(int i = g_pHooks.length() -1; i >= 0; i--) { DHooksManager *manager = g_pHooks.at(i); if(manager->callback->hookType == HookType_GameRules) { delete manager; - g_pHooks.erase(g_pHooks.iterAt(i)); + g_pHooks.remove(i); } } } void DHooksEntityListener::CleanupListeners(IPluginContext *pContext) { - for(int i = g_EntityListeners.size() -1; i >= 0; i--) + for(int i = g_EntityListeners.length() -1; i >= 0; i--) { if(pContext == NULL || pContext == g_EntityListeners.at(i).callback->GetParentRuntime()->GetDefaultContext()) { - g_EntityListeners.erase(g_EntityListeners.iterAt(i)); + g_EntityListeners.remove(i); } } } @@ -47,7 +44,7 @@ void DHooksEntityListener::OnEntityCreated(CBaseEntity *pEntity, const char *cla { int entity = gamehelpers->EntityToBCompatRef(pEntity); - for(int i = g_EntityListeners.size() -1; i >= 0; i--) + for(int i = g_EntityListeners.length() -1; i >= 0; i--) { EntityListener listerner = g_EntityListeners.at(i); if(listerner.type == ListenType_Created) @@ -64,7 +61,7 @@ void DHooksEntityListener::OnEntityDestroyed(CBaseEntity *pEntity) { int entity = gamehelpers->EntityToBCompatRef(pEntity); - for(int i = g_EntityListeners.size() -1; i >= 0; i--) + for(int i = g_EntityListeners.length() -1; i >= 0; i--) { EntityListener listerner = g_EntityListeners.at(i); if(listerner.type == ListenType_Deleted) @@ -75,25 +72,24 @@ void DHooksEntityListener::OnEntityDestroyed(CBaseEntity *pEntity) } } - bool bDeleting = false; - - for(int i = g_pHooks.size() -1; i >= 0; i--) + for(int i = g_pHooks.length() -1; i >= 0; i--) { DHooksManager *manager = g_pHooks.at(i); if(manager->callback->entity == entity) { - manager->bDelete = true; - if (!bDeleting) + if(g_pRemoveList.length() == 0) { smutils->AddFrameAction(&FrameCleanupHooks, NULL); - bDeleting = true; } + + g_pRemoveList.append(manager); + g_pHooks.remove(i); } } } bool DHooksEntityListener::AddPluginEntityListener(ListenType type, IPluginFunction *callback) { - for(int i = g_EntityListeners.size() -1; i >= 0; i--) + for(int i = g_EntityListeners.length() -1; i >= 0; i--) { EntityListener listerner = g_EntityListeners.at(i); if(listerner.callback == callback && listerner.type == type) @@ -104,17 +100,17 @@ bool DHooksEntityListener::AddPluginEntityListener(ListenType type, IPluginFunct EntityListener listener; listener.callback = callback; listener.type = type; - g_EntityListeners.push_back(listener); + g_EntityListeners.append(listener); return true; } bool DHooksEntityListener::RemovePluginEntityListener(ListenType type, IPluginFunction *callback) { - for(int i = g_EntityListeners.size() -1; i >= 0; i--) + for(int i = g_EntityListeners.length() -1; i >= 0; i--) { EntityListener listerner = g_EntityListeners.at(i); if(listerner.callback == callback && listerner.type == type) { - g_EntityListeners.erase(g_EntityListeners.iterAt(i)); + g_EntityListeners.remove(i); return true; } } diff --git a/listeners.h b/listeners.h index 8722bae..2d8041f 100644 --- a/listeners.h +++ b/listeners.h @@ -27,5 +27,5 @@ struct EntityListener IPluginFunction *callback; }; -extern SourceHook::CVector g_pHooks; +extern ke::Vector g_pHooks; #endif diff --git a/natives.cpp b/natives.cpp index 82d819b..f49211e 100644 --- a/natives.cpp +++ b/natives.cpp @@ -109,7 +109,7 @@ cell_t Native_HookEntity(IPluginContext *pContext, const cell_t *params) } bool post = params[2] != 0; - for(int i = g_pHooks.size() -1; i >= 0; i--) + for(int i = g_pHooks.length() -1; i >= 0; i--) { DHooksManager *manager = g_pHooks.at(i); if(manager->callback->hookType == HookType_Entity && manager->callback->entity == gamehelpers->ReferenceToBCompatRef(params[3]) && manager->callback->offset == setup->offset && manager->callback->post == post && manager->remove_callback == pContext->GetFunctionById(params[4]) && manager->callback->plugin_callback == setup->callback) @@ -132,7 +132,7 @@ cell_t Native_HookEntity(IPluginContext *pContext, const cell_t *params) return 0; } - g_pHooks.push_back(manager); + g_pHooks.append(manager); return manager->hookid; } @@ -153,7 +153,7 @@ cell_t Native_HookGamerules(IPluginContext *pContext, const cell_t *params) bool post = params[2] != 0; - for(int i = g_pHooks.size() -1; i >= 0; i--) + for(int i = g_pHooks.length() -1; i >= 0; i--) { DHooksManager *manager = g_pHooks.at(i); if(manager->callback->hookType == HookType_GameRules && manager->callback->offset == setup->offset && manager->callback->post == post && manager->remove_callback == pContext->GetFunctionById(params[3]) && manager->callback->plugin_callback == setup->callback) @@ -177,7 +177,7 @@ cell_t Native_HookGamerules(IPluginContext *pContext, const cell_t *params) return 0; } - g_pHooks.push_back(manager); + g_pHooks.append(manager); return manager->hookid; } @@ -199,7 +199,7 @@ cell_t Native_HookRaw(IPluginContext *pContext, const cell_t *params) bool post = params[2] != 0; void *iface = (void *)(params[3]); - for(int i = g_pHooks.size() -1; i >= 0; i--) + for(int i = g_pHooks.length() -1; i >= 0; i--) { DHooksManager *manager = g_pHooks.at(i); if(manager->callback->hookType == HookType_Raw && manager->addr == (intptr_t)iface && manager->callback->offset == setup->offset && manager->callback->post == post && manager->remove_callback == pContext->GetFunctionById(params[4]) && manager->callback->plugin_callback == setup->callback) @@ -221,20 +221,20 @@ cell_t Native_HookRaw(IPluginContext *pContext, const cell_t *params) return 0; } - g_pHooks.push_back(manager); + g_pHooks.append(manager); return manager->hookid; } // native bool:DHookRemoveHookID(hookid); cell_t Native_RemoveHookID(IPluginContext *pContext, const cell_t *params) { - for(int i = g_pHooks.size() -1; i >= 0; i--) + for(int i = g_pHooks.length() -1; i >= 0; i--) { DHooksManager *manager = g_pHooks.at(i); if(manager->hookid == params[1] && manager->callback->plugin_callback->GetParentRuntime()->GetDefaultContext() == pContext) { delete manager; - g_pHooks.erase(g_pHooks.iterAt(i)); + g_pHooks.remove(i); return 1; } } diff --git a/natives.h b/natives.h index eb34936..4299488 100644 --- a/natives.h +++ b/natives.h @@ -10,5 +10,5 @@ extern ISDKTools *g_pSDKTools; extern HandleType_t g_HookSetupHandle; extern HandleType_t g_HookParamsHandle; extern HandleType_t g_HookReturnHandle; -extern SourceHook::CVector g_pHooks; +extern ke::Vector g_pHooks; #endif diff --git a/vhook.cpp b/vhook.cpp index 3fefab9..9443e83 100644 --- a/vhook.cpp +++ b/vhook.cpp @@ -3,7 +3,7 @@ SourceHook::IHookManagerAutoGen *g_pHookManager = NULL; -SourceHook::CVector g_pHooks; +ke::Vector g_pHooks; using namespace SourceHook; @@ -26,7 +26,6 @@ DHooksManager::DHooksManager(HookSetup *setup, void *iface, IPluginFunction *rem this->callback->params = setup->params; this->addr = 0; - this->bDelete = false; if(this->callback->hookType == HookType_Entity) { @@ -75,14 +74,14 @@ DHooksManager::DHooksManager(HookSetup *setup, void *iface, IPluginFunction *rem void CleanupHooks(IPluginContext *pContext) { - for(int i = g_pHooks.size() -1; i >= 0; i--) + for(int i = g_pHooks.length() -1; i >= 0; i--) { DHooksManager *manager = g_pHooks.at(i); if(pContext == NULL || pContext == manager->callback->plugin_callback->GetParentRuntime()->GetDefaultContext()) { delete manager; - g_pHooks.erase(g_pHooks.iterAt(i)); + g_pHooks.remove(i); } } } diff --git a/vhook.h b/vhook.h index 0efd281..050be4c 100644 --- a/vhook.h +++ b/vhook.h @@ -364,7 +364,6 @@ public: DHooksCallback *callback; IPluginFunction *remove_callback; SourceHook::HookManagerPubFunc pManager; - bool bDelete; }; size_t GetStackArgsSize(DHooksCallback *dg);