From 50b7eb0defc8cf94bc19965ff407b2890a33fcc5 Mon Sep 17 00:00:00 2001 From: Dr!fter Date: Thu, 22 Aug 2013 14:55:33 -0400 Subject: [PATCH] Add more natives! --- listeners.cpp | 29 ++++++++++++++++++++++++ listeners.h | 17 ++++++++------ natives.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++---- natives.h | 3 +++ 4 files changed, 99 insertions(+), 11 deletions(-) diff --git a/listeners.cpp b/listeners.cpp index 172c0a9..4129f3f 100644 --- a/listeners.cpp +++ b/listeners.cpp @@ -71,3 +71,32 @@ void DHooksEntityListener::OnEntityDestroyed(CBaseEntity *pEntity) } } } +bool DHooksEntityListener::AddPluginEntityListener(ListenType type, IPluginFunction *callback) +{ + for(int i = g_EntityListeners.Count() -1; i >= 0; i--) + { + EntityListener listerner = g_EntityListeners.Element(i); + if(listerner.callback == callback && listerner.type == type) + { + return true; + } + } + EntityListener listener; + listener.callback = callback; + listener.type = type; + g_EntityListeners.AddToTail(listener); + return true; +} +bool DHooksEntityListener::RemovePluginEntityListener(ListenType type, IPluginFunction *callback) +{ + for(int i = g_EntityListeners.Count() -1; i >= 0; i--) + { + EntityListener listerner = g_EntityListeners.Element(i); + if(listerner.callback == callback && listerner.type == type) + { + g_EntityListeners.Remove(i); + return true; + } + } + return false; +} diff --git a/listeners.h b/listeners.h index 87bc1b0..e2af029 100644 --- a/listeners.h +++ b/listeners.h @@ -1,9 +1,15 @@ -#ifndef _INCLUDE_FORWARDS_H_ -#define _INCLUDE_FORWARDS_H_ +#ifndef _INCLUDE_LISTENERS_H_ +#define _INCLUDE_LISTENERS_H_ #include "extension.h" #include "vhook.h" +enum ListenType +{ + ListenType_Created, + ListenType_Deleted +}; + class DHooksEntityListener : public ISMEntityListener { public: @@ -11,13 +17,10 @@ public: virtual void OnEntityDestroyed(CBaseEntity *pEntity); void CleanupListeners(IPluginContext *func); virtual void LevelShutdown(); + bool AddPluginEntityListener(ListenType type, IPluginFunction *callback); + bool RemovePluginEntityListener(ListenType type, IPluginFunction *callback); }; -enum ListenType -{ - ListenType_Created, - ListenType_Deleted -}; struct EntityListener { diff --git a/natives.cpp b/natives.cpp index d6acb0b..0864304 100644 --- a/natives.cpp +++ b/natives.cpp @@ -520,6 +520,59 @@ cell_t Native_SetParamString(IPluginContext *pContext, const cell_t *params) return 1; } +//native DHookAddEntityListener(ListenType:type, ListenCB:callback); +cell_t Native_AddEntityListener(IPluginContext *pContext, const cell_t *params) +{ + if(g_pEntityListener) + { + return g_pEntityListener->AddPluginEntityListener((ListenType)params[1], pContext->GetFunctionById(params[2]));; + } + return pContext->ThrowNativeError("Failed to get g_pEntityListener"); +} + +//native bool:DHookRemoveEntityListener(ListenType:type, ListenCB:callback); +cell_t Native_RemoveEntityListener(IPluginContext *pContext, const cell_t *params) +{ + if(g_pEntityListener) + { + return g_pEntityListener->RemovePluginEntityListener((ListenType)params[1], pContext->GetFunctionById(params[2]));; + } + return pContext->ThrowNativeError("Failed to get g_pEntityListener"); +} + +//native bool:DHookIsNullParam(Handle:hParams, num); +cell_t Native_IsNullParam(IPluginContext *pContext, const cell_t *params) +{ + if(params[1] == BAD_HANDLE) + { + return pContext->ThrowNativeError("Invalid Handle %i", BAD_HANDLE); + } + + HandleError err; + HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); + HookParamsStruct *paramStruct; + + if((err = handlesys->ReadHandle(params[1], g_HookParamsHandle, &sec, (void **)¶mStruct)) != HandleError_None) + { + return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); + } + + if(params[2] <= 0 || params[2] > paramStruct->dg->params.Count()) + { + return pContext->ThrowNativeError("Invalid param number %i max params is %i", params[2], paramStruct->dg->params.Count()); + } + + int index = params[2] - 1; + + HookParamType type = paramStruct->dg->params.Element(index).type; + + //Check that the type is ptr + if(type == HookParamType_StringPtr || type == HookParamType_CharPtr || type == HookParamType_VectorPtr || type == HookParamType_CBaseEntity || type == HookParamType_ObjectPtr || type == HookParamType_Edict || type == HookParamType_Unknown) + return (paramStruct->orgParams[index] == NULL); + else + return pContext->ThrowNativeError("Param is not a pointer!"); +} + sp_nativeinfo_t g_Natives[] = { {"DHookCreate", Native_CreateHook}, @@ -540,12 +593,12 @@ sp_nativeinfo_t g_Natives[] = //{"DHookGetReturnString", Native_GetReturnString}, //{"DHookSetReturnString", Native_SetReturnString}, {"DHookSetParamString", Native_SetParamString}, - /*{"DHookAddEntityListener", Native_AddEntityListener}, + {"DHookAddEntityListener", Native_AddEntityListener}, {"DHookRemoveEntityListener", Native_RemoveEntityListener}, - {"DHookGetParamObjectPtrVar", Native_GetParamObjectPtrVar}, + /*{"DHookGetParamObjectPtrVar", Native_GetParamObjectPtrVar}, {"DHookSetParamObjectPtrVar", Native_SetParamObjectPtrVar}, {"DHookGetParamObjectPtrVarVector", Native_GetParamObjectPtrVarVector}, - {"DHookSetParamObjectPtrVarVector", Native_SetParamObjectPtrVarVector}, - {"DHookIsNullParam", Native_IsNullParam},*/ + {"DHookSetParamObjectPtrVarVector", Native_SetParamObjectPtrVarVector},*/ + {"DHookIsNullParam", Native_IsNullParam}, {NULL, NULL} }; diff --git a/natives.h b/natives.h index 9b19b52..34d07f3 100644 --- a/natives.h +++ b/natives.h @@ -3,6 +3,9 @@ #include "extension.h" #include "vhook.h" +#include "listeners.h" + +extern DHooksEntityListener *g_pEntityListener; extern ISDKTools *g_pSDKTools; extern HandleType_t g_HookSetupHandle; extern HandleType_t g_HookParamsHandle;