Add more natives!
This commit is contained in:
parent
cf6d35365e
commit
50b7eb0def
@ -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;
|
||||
}
|
||||
|
17
listeners.h
17
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
|
||||
{
|
||||
|
61
natives.cpp
61
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}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user