/** * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod (C)2021 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License, version 3.0, as published by the * Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . * * As a special exception, AlliedModders LLC gives you permission to link the * code of this program (as well as its derivative works) to "Half-Life 2," the * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software * by the Valve Corporation. You must obey the GNU General Public License in * all respects for all other code used. Additionally, AlliedModders LLC grants * this exception to all derivative works. AlliedModders LLC defines further * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * or . * * Version: $Id$ */ #if defined _dhooks_included #endinput #endif #define _dhooks_included // Needed for the SDKFuncConfSource enum. #include #define INVALID_HOOK_ID 0 enum ObjectValueType { ObjectValueType_Int = 0, ObjectValueType_Bool, ObjectValueType_Ehandle, ObjectValueType_Float, ObjectValueType_CBaseEntityPtr, ObjectValueType_IntPtr, ObjectValueType_BoolPtr, ObjectValueType_EhandlePtr, ObjectValueType_FloatPtr, ObjectValueType_Vector, ObjectValueType_VectorPtr, ObjectValueType_CharPtr, ObjectValueType_String }; enum ListenType { ListenType_Created, ListenType_Deleted }; enum ReturnType { ReturnType_Unknown, ReturnType_Void, ReturnType_Int, ReturnType_Bool, ReturnType_Float, ReturnType_String, // Note this is a string_t ReturnType_StringPtr, // Note this is a string_t * ReturnType_CharPtr, ReturnType_Vector, ReturnType_VectorPtr, ReturnType_CBaseEntity, ReturnType_Edict }; enum HookParamType { HookParamType_Unknown, HookParamType_Int, HookParamType_Bool, HookParamType_Float, HookParamType_String, // Note this is a string_t HookParamType_StringPtr, // Note this is a string_t * HookParamType_CharPtr, HookParamType_VectorPtr, HookParamType_CBaseEntity, HookParamType_ObjectPtr, HookParamType_Edict, HookParamType_Object }; enum ThisPointerType { ThisPointer_Ignore, ThisPointer_CBaseEntity, ThisPointer_Address }; enum HookType { HookType_Entity, HookType_GameRules, HookType_Raw }; enum CallingConvention { CallConv_CDECL, CallConv_THISCALL, CallConv_STDCALL, CallConv_FASTCALL, }; enum HookMode { Hook_Pre, /**< Callback will be executed BEFORE the original function. */ Hook_Post /**< Callback will be executed AFTER the original function. */ }; enum MRESReturn { MRES_ChangedHandled = -2, /**< Use changed values and return MRES_Handled */ MRES_ChangedOverride, /**< Use changed values and return MRES_Override */ MRES_Ignored, /**< plugin didn't take any action */ MRES_Handled, /**< plugin did something, but real function should still be called */ MRES_Override, /**< call real function, but use my return value */ MRES_Supercede /**< skip real function; use my return value */ }; enum DHookPassFlag { DHookPass_ByVal = (1<<0), /**< Passing by value */ DHookPass_ByRef = (1<<1), /**< Passing by reference */ DHookPass_ODTOR = (1<<2), /**< Object has a destructor */ DHookPass_OCTOR = (1<<3), /**< Object has a constructor */ DHookPass_OASSIGNOP = (1<<4), /**< Object has an assignment operator */ }; enum DHookRegister { // Don't change the register and use the default for the calling convention. DHookRegister_Default, // 8-bit general purpose registers DHookRegister_AL, DHookRegister_CL, DHookRegister_DL, DHookRegister_BL, DHookRegister_AH, DHookRegister_CH, DHookRegister_DH, DHookRegister_BH, // 32-bit general purpose registers DHookRegister_EAX, DHookRegister_ECX, DHookRegister_EDX, DHookRegister_EBX, DHookRegister_ESP, DHookRegister_EBP, DHookRegister_ESI, DHookRegister_EDI, // 128-bit XMM registers DHookRegister_XMM0, DHookRegister_XMM1, DHookRegister_XMM2, DHookRegister_XMM3, DHookRegister_XMM4, DHookRegister_XMM5, DHookRegister_XMM6, DHookRegister_XMM7, // 80-bit FPU registers DHookRegister_ST0 }; typeset ListenCB { // Deleted function void (int entity); // Created function void (int entity, const char[] classname); }; typeset DHookRemovalCB { function void (int hookid); }; typeset DHookCallback { // Function Example: void Ham::Test() with this pointer ignore function MRESReturn (); // Function Example: void Ham::Test() with this pointer passed function MRESReturn (int pThis); // Function Example: void Ham::Test(int cake) with this pointer ignore function MRESReturn (DHookParam hParams); // Function Example: void Ham::Test(int cake) with this pointer passed function MRESReturn (int pThis, DHookParam hParams); // Function Example: int Ham::Test() with this pointer ignore function MRESReturn (DHookReturn hReturn); // Function Example: int Ham::Test() with this pointer passed function MRESReturn (int pThis, DHookReturn hReturn); // Function Example: int Ham::Test(int cake) with this pointer ignore function MRESReturn (DHookReturn hReturn, DHookParam hParams); // Function Example: int Ham::Test(int cake) with this pointer passed function MRESReturn (int pThis, DHookReturn hReturn, DHookParam hParams); // Address NOW // Function Example: void Ham::Test() with this pointer passed function MRESReturn (Address pThis); // Function Example: void Ham::Test(int cake) with this pointer passed function MRESReturn (Address pThis, DHookParam hParams); // Function Example: int Ham::Test() with this pointer passed function MRESReturn (Address pThis, DHookReturn hReturn); // Function Example: int Ham::Test(int cake) with this pointer passed function MRESReturn (Address pThis, DHookReturn hReturn, DHookParam hParams); }; // Represents the parameters of the hooked function. methodmap DHookParam < Handle { // Get the value of a parameter. // Use only for: int, entity, edict, bool or float parameter types. // // @param num Parameter number to get, starting at 1. Parameter number 0 returns // the number of parameters. // // @return Value if num greater than 0. If 0 returns parameter count. // If CBaseEntity returns entity index. // @error Invalid handle, invalid param number or invalid param type. public native any Get(int num); // Get the value of a vector parameter. // Use only for: vector or vectorptr parameter types. // // @param num Parameter number to get, starting at 1. // @param vec Vector buffer to store result. // // @error Invalid handle, invalid param number or invalid param type. public native void GetVector(int num, float vec[3]); // Get the value of a string parameter. // Use only for: string, stringptr or charptr parameter types. // // @param num Parameter number to get, starting at 1. // @param buffer String buffer to store result. // @param size Buffer size. // // @error Invalid handle, invalid param number or invalid param type. public native void GetString(int num, char[] buffer, int size); // Set the value of a parameter. // Use only for: int, entity, edict, bool or float parameter types. // // An entity parameter type can be set to NULL using INVALID_ENT_REFERENCE (-1). // // The changes are only applied when MRES_ChangedHandled or MRES_ChangedOverride // is returned in the callback. // // @param num Parameter number to set starting at 1. // @param value Value to set it as (only pass int, bool, float or entity index). // // @error Invalid handle, invalid param number or invalid param type. public native void Set(int num, any value); // Set the value of a vector parameter. // Use only for: vector or vectorptr parameter types. // // The changes are only applied when MRES_ChangedHandled or MRES_ChangedOverride // is returned in the callback. // // @param num Parameter number to set, starting at 1. // @param vec Value to set vector as. // // @error Invalid handle, invalid param number or invalid param type. public native void SetVector(int num, const float vec[3]); // Set the value of a string parameter. // Use only for: string, stringptr or charptr parameter types. // // The changes are only applied when MRES_ChangedHandled or MRES_ChangedOverride // is returned in the callback. // // @param num Parameter number to set, starting at 1. // @param value Value to set string as. // // @error Invalid handle, invalid param number or invalid param type. public native void SetString(int num, const char[] value); // Gets an object's variable value. // // @param num Parameter number to get, starting at 1. // @param offset Byte offset within the object to the var to get. // @param type Type of var it is. // // @return Value of the objects var. If EHANDLE type or entity returns entity index. // @error Invalid handle, invalid param number, invalid param type or invalid Object type. public native any GetObjectVar(int num, int offset, ObjectValueType type); // Gets an object's vector variable value. // // @param num Parameter number to get, starting at 1. // @param offset Byte offset within the object to the var to get. // @param type Type of var it is. // @param vec Buffer to store the result vector. // // @error Invalid handle, invalid param number, invalid param type or invalid Object type. public native void GetObjectVarVector(int num, int offset, ObjectValueType type, float vec[3]); // Gets an object's string variable value. // // @param num Parameter number to get, starting at 1. // @param offset Byte offset within the object to the var to get. // @param type Type of var it is. // @param buffer Buffer to store the result string. // @param size Size of the buffer. // // @error Invalid handle, invalid param number, invalid param type or invalid Object type. public native void GetObjectVarString(int num, int offset, ObjectValueType type, char[] buffer, int size); // Sets an object's variable value. // // The changes are only applied when MRES_ChangedHandled or MRES_ChangedOverride // is returned in the callback. // // @param num Parameter number to set, starting at 1. // @param offset Byte offset within the object to the var to set. // @param type Type of var it is. // @param value The value to set the var to. // // @error Invalid handle, invalid param number, invalid param type or invalid Object type. public native void SetObjectVar(int num, int offset, ObjectValueType type, any value); // Sets an object's vector variable value. // // The changes are only applied when MRES_ChangedHandled or MRES_ChangedOverride // is returned in the callback. // // @param num Parameter number to set, starting at 1. // @param offset Byte offset within the object to the var to set. // @param type Type of var it is. // @param vec The value to set the vector var to. // // @error Invalid handle, invalid param number, invalid param type or invalid Object type. public native void SetObjectVarVector(int num, int offset, ObjectValueType type, const float vec[3]); // No setter for object strings yet. Open an issue if you really need it. // Checks if a pointer parameter is null. // // @param num Parameter number to check, starting at 1. // // @return true if null, false otherwise. // @error Non-pointer parameter. public native bool IsNull(int num); // Get param address (Use only for ptr param types) // // @param num Param number to get. (Example if the function has 2 params and you need the value // of the first param num would be 1.) // // @return Address of the parameter. // @error Invalid handle. Invalid param number. Invalid param type. public native Address GetAddress(int num); }; // Represents the return value of the hooked function. methodmap DHookReturn < Handle { // Retrieves or sets the return value. // Use only for: int, entity, edict, bool or float return types. // // An entity return type can be set to NULL using INVALID_ENT_REFERENCE (-1). // // The return value is only readable in a post hook. // The value is only applied when MRES_Override or MRES_Supercede is returned // in the callback. property any Value { public native get(); public native set(any value); } // Get return vector value. // Use only for: vector or vectorptr return types. // // Only useful in post hooks. // // @param vec Vector buffer to store result in. // // @error Invalid Handle or invalid type. public native void GetVector(float vec[3]); // Get return string value. // Use only for: string, stringptr or charptr return types. // // Only useful in post hooks. // // @param buffer String buffer to store result in. // @param size String buffer size. // // @error Invalid Handle or invalid type. public native void GetString(char[] buffer, int size); // Set return vector value. // Use only for: vector or vectorptr return types. // // The value is only applied when MRES_Override or MRES_Supercede is returned // in the callback. // // @param vec Value to set return vector to. // // @error Invalid Handle or invalid type. public native void SetVector(const float vec[3]); // Set return string value. // Use only for: string, stringptr or charptr return types. // // The value is only applied when MRES_Override or MRES_Supercede is returned // in the callback. // // @param buffer Value to set return string to. // // @error Invalid Handle or invalid type. public native void SetString(const char[] buffer); }; // Base method map for common functions between virtual hooks and detours. methodmap DHookSetup < Handle { // Load address or offset for a vtable hook or detour from a gamedata file. // // @param gameconf GameData handle. // @param source Whether to look in Offsets, Signatures, or Addresses. // @param name Name of the property to find. // // @return true on success, false if nothing was found. // @error Invalid setup or gamedata handle. public native bool SetFromConf(Handle gameconf, SDKFuncConfSource source, const char[] name); // Adds a parameter to a hook setup. // // @param type Parameter type. // @param size Used for Objects (not Object ptr) to define the size of the object. // @param flag Used to change the pass type (ignored by detours). // @param custom_register The register this argument is passed in instead of the stack (ignored by vhooks). // // @error Invalid setup handle or too many params added (request upping the max in thread). public native void AddParam(HookParamType type, int size=-1, DHookPassFlag flag=DHookPass_ByVal, DHookRegister custom_register=DHookRegister_Default); }; // A DynamicHook allows to hook a virtual function on any C++ object. // Currently CBaseEntity and CGameRules have a convenience API for easy entity hooking, // but it's possible to provide a raw this-pointer to hook any object in memory too. // // Internally this intercepts function calls by replacing the function pointer // in the virtual table of the object with our own function. methodmap DynamicHook < DHookSetup { // Creates a vtable hook. // // @param offset Virtual table offset of function to hook. // @param hooktype Type of hook. // @param returntype Type of return value. // @param thistype Type of this pointer or ignore (ignore can be used if not needed). // // @error Failed to create hook setup handle or invalid callback function. public native DynamicHook(int offset, HookType hooktype, ReturnType returntype, ThisPointerType thistype); // Setup a vtable hook for a function as described in a "Functions" section in gamedata. // The "Functions" section is parsed once the gamedata file is loaded and cached globally. // // @param gameconf GameData handle to use for address lookup. // Doesn't have to be the same as the one with the "Functions" section. // @param name Name of the function in a "Functions" section to load. // // @return Setup handle for the detour or null if offset wasn't found. // @error Failed to create detour setup handle, invalid gamedata handle, // invalid callback function or failed to find function in cached "Functions" sections. public static native DynamicHook FromConf(Handle gameconf, const char[] name); // Hook an entity. // // Entity hooks are auto-removed when the entity is destroyed. // If you need to read the return value of the function, choose a post hook. // // @param mode The desired hook mode - pre or post. // A pre hook calls your callback BEFORE the original function is called. // You can access the parameters, set the return value, and skip the original function. // A post hook calls your callback AFTER the original function executed. // You can access the parameters and get/set the return value. // @param entity Entity index to hook on. // @param callback Callback function. // @param removalcb Optional callback for when the hook is removed. // // @return A hookid on success, INVALID_HOOK_ID otherwise. // @error Invalid setup handle, invalid address, invalid hook type or invalid callback. public native int HookEntity(HookMode mode, int entity, DHookCallback callback, DHookRemovalCB removalcb=INVALID_FUNCTION); // Hook gamerules object. // // Game rules hooks are auto-removed on map end. // If you need to read the return value of the function, choose a post hook. // // @param mode The desired hook mode - pre or post. // A pre hook calls your callback BEFORE the original function is called. // You can access the parameters, set the return value, and skip the original function. // A post hook calls your callback AFTER the original function executed. // You can access the parameters and get/set the return value. // @param callback Callback function. // @param removalcb Optional callback for when the hook is removed. // // @return A hookid on success, INVALID_HOOK_ID otherwise. // @error Invalid setup handle, invalid address, invalid hook type or invalid callback. public native int HookGamerules(HookMode mode, DHookCallback callback, DHookRemovalCB removalcb=INVALID_FUNCTION); // Hook a raw this-pointer. // If you need to read the return value of the function, choose a post hook. // // @param mode The desired hook mode - pre or post. // A pre hook calls your callback BEFORE the original function is called. // You can access the parameters, set the return value, and skip the original function. // A post hook calls your callback AFTER the original function executed. // You can access the parameters and get/set the return value. // @param addr This pointer address. // @param callback Callback function. // // @return A hookid on success, INVALID_HOOK_ID otherwise. // @error Invalid setup handle, invalid address, invalid hook type or invalid callback. public native int HookRaw(HookMode mode, Address addr, DHookCallback callback); // Remove hook by hook id. // // @param hookid Hook id to remove. // // @return true on success, false otherwise public static native bool RemoveHook(int hookid); }; // A DynamicDetour is a way to hook and block any function in memory. // Given the address of a function, it can call a callback in your script whenever // the function gets called. The callback has access to all parameters of the function // as well as the return value. // // Internally this works by replacing the first instructions of the function // with a jump to our own code. This means that the signature used to find // the function address in the first place might not match anymore after a detour. // If you need to detour the same function in different plugins make sure to // wildcard \x2a the first 6 bytes of the signature to accommodate for the patched // jump introduced by the detour. methodmap DynamicDetour < DHookSetup { // Creates a detour. // // @param funcaddr The address of the function to detour. // Can be Address_Null if you want to load the address from gamedata using DHookSetFromConf. // @param callConv Calling convention of the function. // @param returnType Type of the return value. // @param thisType Type of this pointer or ignore (ignore can be used if not needed). // Only used for thiscall detours. // // @error Failed to create detour setup handle. public native DynamicDetour(Address funcaddr, CallingConvention callConv, ReturnType returntype, ThisPointerType thisType=ThisPointer_Ignore); // Setup a detour for a function as described in a "Functions" section in gamedata. // The "Functions" section is parsed once the gamedata file is loaded and cached globally. // // @param gameconf GameData handle to use for address lookup. // Doesn't have to be the same as the one with the "Functions" section. // @param name Name of the function in a "Functions" section to load. // // @return Setup handle for the detour or null if offset wasn't found. // @error Failed to create detour setup handle, invalid gamedata handle, // invalid callback function or failed to find function in cached "Functions" sections. public static native DynamicDetour FromConf(Handle gameconf, const char[] name); // Enable the detour of the function described in this detour setup. // If you need to read the return value of the function, choose a post hook. // // @param mode The desired hook mode - pre or post. // A pre hook calls your callback BEFORE the original function is called. // You can access the parameters, set the return value, and skip the original function. // A post hook calls your callback AFTER the original function executed. // You can access the parameters and get/set the return value. // @param callback Callback function. // // @return true if detour was enabled, false otherwise. // @error Hook handle is not setup for a detour. public native bool Enable(HookMode mode, DHookCallback callback); // Disable the detour of the function described in this detour setup. // // @param mode The hook mode to disable - pre or post. // @param callback Callback function. // // @return true if detour was disabled, false otherwise. // @error Hook handle is not setup for a detour or function is not detoured. public native bool Disable(HookMode mode, DHookCallback callback); }; /** * Adds an entity listener hook * * @param type Type of listener to add * @param callback Callback to use */ native void DHookAddEntityListener(ListenType type, ListenCB callback); /** * Removes an entity listener hook * * @param type Type of listener to remove * @param callback Callback this listener was using * * @return true if one was removed, false otherwise */ native bool DHookRemoveEntityListener(ListenType type, ListenCB callback); /** * Creates a hook * * @param offset vtable offset of function to hook * @param hooktype Type of hook * @param returntype Type of return value * @param thistype Type of this pointer or ignore (ignore can be used if not needed) * @param callback Optional callback function, if not set here must be set when hooking. * * @return Returns setup handle for the hook. * @error Failed to create hook setup handle or invalid callback function. */ native DynamicHook DHookCreate(int offset, HookType hooktype, ReturnType returntype, ThisPointerType thistype, DHookCallback callback=INVALID_FUNCTION); /** * Creates a detour * * @param funcaddr The address of the function to detour. * Can be Address_Null if you want to load the address from gamedata using DHookSetFromConf. * @param callConv Calling convention of the function. * @param returnType Type of the return value. * @param thisType Type of this pointer or ignore (ignore can be used if not needed) * * @return Setup handle for the detour. * @error Failed to create detour setup handle. */ native DynamicDetour DHookCreateDetour(Address funcaddr, CallingConvention callConv, ReturnType returntype, ThisPointerType thisType); /** * Setup a detour or hook for a function as described in a "Functions" section in gamedata. * * @param gameconf GameConfig handle * @param name Name of the function in the gamedata to load. * * @return Setup handle for the detour or INVALID_HANDLE if offset/signature/address wasn't found. * @error Failed to create detour setup handle, invalid gamedata handle, invalid callback function or * failed to find function in gamedata. */ native DHookSetup DHookCreateFromConf(Handle gameconf, const char[] name); /** * Load details for a vhook or detour from a gamedata file. * * @param setup Hook setup handle to set the offset or address on. * @param gameconf GameConfig handle * @param source Whether to look in Offsets or Signatures. * @param name Name of the property to find. * * @return true on success, false if nothing was found. * @error Invalid setup or gamedata handle. */ native bool DHookSetFromConf(Handle setup, Handle gameconf, SDKFuncConfSource source, const char[] name); /** * Enable the detour of the function described in the hook setup handle. * * @param setup Hook setup handle * @param post true to make the hook a post hook. (If you need to change the return value or need the return * value use a post hook! If you need to change params and return use a pre and post hook!) * @param callback Callback function * * @return true if detour was enabled, false otherwise. * @error Hook handle is not setup for a detour. */ native bool DHookEnableDetour(Handle setup, bool post, DHookCallback callback); /** * Disable the detour of the function described in the hook setup handle. * * @param setup Hook setup handle * @param post true to disable a post hook. * @param callback Callback function * * @return true if detour was disabled, false otherwise. * @error Hook handle is not setup for a detour or function is not detoured. */ native bool DHookDisableDetour(Handle setup, bool post, DHookCallback callback); /** * Adds param to a hook setup * * @param setup Setup handle to add the param to. * @param type Param type * @param size Used for Objects (not Object ptr) to define the size of the object. * @param flag Used to change the pass type. * @param custom_register The register this argument is passed in instead of the stack. * * @error Invalid setup handle or too many params added (request upping the max in thread) */ native void DHookAddParam(Handle setup, HookParamType type, int size=-1, DHookPassFlag flag=DHookPass_ByVal, DHookRegister custom_register=DHookRegister_Default); /** * Hook entity * * @param setup Setup handle to use to add the hook. * @param post true to make the hook a post hook. (If you need to change the return value or need the return * value use a post hook! If you need to change params and return use a pre and post hook!) * @param entity Entity index to hook on. * @param removalcb Callback for when the hook is removed (Entity hooks are auto-removed on entity destroyed and * will call this callback) * @param callback Optional callback function, if not set here must be set when creating the hook. * * @return INVALID_HOOK_ID on fail a hookid on success * @error Invalid setup handle, invalid address, invalid hook type or invalid callback. */ native int DHookEntity(Handle setup, bool post, int entity, DHookRemovalCB removalcb=INVALID_FUNCTION, DHookCallback callback=INVALID_FUNCTION); /** * Hook gamerules * * @param setup Setup handle to use to add the hook. * @param post true to make the hook a post hook. (If you need to change the return value or need the return * value use a post hook! If you need to change params and return use a pre and post hook!) * @param removalcb Callback for when the hook is removed (Game rules hooks are auto-removed on map end and will * call this callback) * @param callback Optional callback function, if not set here must be set when creating the hook. * * @return INVALID_HOOK_ID on fail a hookid on success * @error Invalid setup handle, invalid address, invalid hook type or invalid callback. */ native int DHookGamerules(Handle setup, bool post, DHookRemovalCB removalcb=INVALID_FUNCTION, DHookCallback callback=INVALID_FUNCTION); /** * Hook a raw pointer * * @param setup Setup handle to use to add the hook. * @param post true to make the hook a post hook. (If you need to change the return value or need the return * value use a post hook! If you need to change params and return use a pre and post hook!) * @param addr This pointer address. * @param removalcb Callback for when the hook is removed (Entity hooks are auto-removed on entity destroyed and * will call this callback) * @param callback Optional callback function, if not set here must be set when creating the hook. * * @return INVALID_HOOK_ID on fail a hookid on success * @error Invalid setup handle, invalid address, invalid hook type or invalid callback. */ native int DHookRaw(Handle setup, bool post, Address addr, DHookRemovalCB removalcb=INVALID_FUNCTION, DHookCallback callback=INVALID_FUNCTION); /** * Remove hook by hook id * * @param hookid Hook id to remove * * @return true on success, false otherwise */ native bool DHookRemoveHookID(int hookid); /** * Get param value (Use only for: int, entity, edict, bool or float param types) * * @param hParams Handle to params structure * @param num Param number to get. (Example if the function has 2 params and you need the value of the first * param num would be 1. 0 Will return the number of params stored) * * @return value if num greater than 0. If 0 returns paramcount. * @error Invalid handle. Invalid param number. Invalid param type. */ native any DHookGetParam(Handle hParams, int num); /** * Get vector param value * * @param hParams Handle to params structure * @param num Param number to get. (Example if the function has 2 params and you need the value of the first * param num would be 1.) * @param vec Vector buffer to store result. * * @error Invalid handle. Invalid param number. Invalid param type. */ native void DHookGetParamVector(Handle hParams, int num, float vec[3]); /** * Get string param value * * @param hParams Handle to params structure * @param num Param number to get. (Example if the function has 2 params and you need the value of the first * param num would be 1.) * @param buffer String buffer to store result * @param size Buffer size * * @error Invalid handle. Invalid param number. Invalid param type. */ native void DHookGetParamString(Handle hParams, int num, char[] buffer, int size); /** * Set param value (Use only for: int, entity, edict, bool or float param types) * * An entity param type can be set to NULL using INVALID_ENT_REFERENCE (-1). * * @param hParams Handle to params structure * @param num Param number to set (Example if the function has 2 params and you need to set the value of the * first param num would be 1.) * @param value Value to set it as (only pass int, bool, float or entity index) * * @error Invalid handle. Invalid param number. Invalid param type. */ native void DHookSetParam(Handle hParams, int num, any value); /** * Set vector param value * * @param hParams Handle to params structure * @param num Param number to set (Example if the function has 2 params and you need to set the value of the * first param num would be 1.) * @param vec Value to set vector as. * * @error Invalid handle. Invalid param number. Invalid param type. */ native void DHookSetParamVector(Handle hParams, int num, float vec[3]); /** * Set string param value * * @param hParams Handle to params structure * @param num Param number to set (Example if the function has 2 params and you need to set the value of the * first param num would be 1.) * @param value Value to set string as. * * @error Invalid handle. Invalid param number. Invalid param type. */ native void DHookSetParamString(Handle hParams, int num, char[] value); /** * Get return value (Use only for: int, entity, bool or float return types) * * @param hReturn Handle to return structure * * @error Invalid Handle, invalid type. * @return Returns default value if prehook returns actual value if post hook. */ native any DHookGetReturn(Handle hReturn); /** * Get return vector value * * @param hReturn Handle to return structure * @param vec Vector buffer to store result in. (In pre hooks will be default value (0.0,0.0,0.0)) * * @error Invalid Handle, invalid type. */ native void DHookGetReturnVector(Handle hReturn, float vec[3]); /** * Get return string value * * @param hReturn Handle to return structure * @param buffer String buffer to store result in. (In pre hooks will be default value "") * @param size String buffer size * * @error Invalid Handle, invalid type. */ native void DHookGetReturnString(Handle hReturn, char[] buffer, int size); /** * Set return value (Use only for: int, entity, bool or float return types) * * An entity return type can be set to NULL using INVALID_ENT_REFERENCE (-1). * * @param hReturn Handle to return structure * @param value Value to set return as * * @error Invalid Handle, invalid type. */ native void DHookSetReturn(Handle hReturn, any value); /** * Set return vector value * * @param hReturn Handle to return structure * @param vec Value to set return vector as * * @error Invalid Handle, invalid type. */ native void DHookSetReturnVector(Handle hReturn, float vec[3]); /** * Set return string value * * @param hReturn Handle to return structure * @param value Value to set return string as * * @error Invalid Handle, invalid type. */ native void DHookSetReturnString(Handle hReturn, char[] value); //WE SHOULD WRAP THESE AROUND STOCKS FOR NON PTR AS WE SUPPORT BOTH WITH THESE NATIVE'S /** * Gets an objects variable value * * @param hParams Handle to params structure * @param num Param number to get. * @param offset Offset within the object to the var to get. * @param type Type of var it is * * @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type. * @return Value of the objects var. If EHANDLE type or entity returns entity index. */ native any DHookGetParamObjectPtrVar(Handle hParams, int num, int offset, ObjectValueType type); /** * Sets an objects variable value * * @param hParams Handle to params structure * @param num Param number to set. * @param offset Offset within the object to the var to set. * @param type Type of var it is * @param value The value to set the var to. * * @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type. */ native void DHookSetParamObjectPtrVar(Handle hParams, int num, int offset, ObjectValueType type, any value); /** * Gets an objects vector variable value * * @param hParams Handle to params structure * @param num Param number to get. * @param offset Offset within the object to the var to get. * @param type Type of var it is * @param buffer Buffer to store the result vector * * @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type. */ native void DHookGetParamObjectPtrVarVector(Handle hParams, int num, int offset, ObjectValueType type, float buffer[3]); /** * Sets an objects vector variable value * * @param hParams Handle to params structure * @param num Param number to set. * @param offset Offset within the object to the var to set. * @param type Type of var it is * @param value The value to set the vector var to. * * @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type. */ native void DHookSetParamObjectPtrVarVector(Handle hParams, int num, int offset, ObjectValueType type, float value[3]); /** * Gets an objects string variable value * * @param hParams Handle to params structure * @param num Param number to get. * @param offset Offset within the object to the var to get. * @param type Type of var it is * @param buffer Buffer to store the result vector * @param size Size of the buffer * * @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type. */ native void DHookGetParamObjectPtrString(Handle hParams, int num, int offset, ObjectValueType type, char[] buffer, int size); /** * Checks if a pointer param is null * * @param hParams Handle to params structure * @param num Param number to check. * * @return true if null, false otherwise. * @error Non pointer param */ native bool DHookIsNullParam(Handle hParams, int num); /** * Get param address (Use only for ptr param types) * * @param hParams Handle to params structure * @param num Param number to get. (Example if the function has 2 params and you need the value of the first * param num would be 1.) * * @return Address of the parameter. * @error Invalid handle. Invalid param number. Invalid param type. */ native Address DHookGetParamAddress(Handle hParams, int num); public Extension __ext_dhooks = { name = "dhooks", file = "dhooks.ext", #if defined AUTOLOAD_EXTENSIONS autoload = 1, #else autoload = 0, #endif #if defined REQUIRE_EXTENSIONS required = 1, #else required = 0, #endif }; #if !defined REQUIRE_EXTENSIONS public __ext_dhooks_SetNTVOptional() { MarkNativeAsOptional("DHookAddEntityListener"); MarkNativeAsOptional("DHookRemoveEntityListener"); MarkNativeAsOptional("DHookCreate"); MarkNativeAsOptional("DHookCreateDetour"); MarkNativeAsOptional("DHookCreateFromConf"); MarkNativeAsOptional("DHookSetFromConf"); MarkNativeAsOptional("DHookEnableDetour"); MarkNativeAsOptional("DHookDisableDetour"); MarkNativeAsOptional("DHookAddParam"); MarkNativeAsOptional("DHookEntity"); MarkNativeAsOptional("DHookGamerules"); MarkNativeAsOptional("DHookRaw"); MarkNativeAsOptional("DHookRemoveHookID"); MarkNativeAsOptional("DHookGetParam"); MarkNativeAsOptional("DHookGetParamVector"); MarkNativeAsOptional("DHookGetParamString"); MarkNativeAsOptional("DHookSetParam"); MarkNativeAsOptional("DHookSetParamVector"); MarkNativeAsOptional("DHookSetParamString"); MarkNativeAsOptional("DHookGetReturn"); MarkNativeAsOptional("DHookGetReturnVector"); MarkNativeAsOptional("DHookGetReturnString"); MarkNativeAsOptional("DHookSetReturn"); MarkNativeAsOptional("DHookSetReturnVector"); MarkNativeAsOptional("DHookSetReturnString"); MarkNativeAsOptional("DHookGetParamObjectPtrVar"); MarkNativeAsOptional("DHookSetParamObjectPtrVar"); MarkNativeAsOptional("DHookGetParamObjectPtrVarVector"); MarkNativeAsOptional("DHookSetParamObjectPtrVarVector"); MarkNativeAsOptional("DHookIsNullParam"); MarkNativeAsOptional("DHookGetParamObjectPtrString"); MarkNativeAsOptional("DHookGetParamAddress"); MarkNativeAsOptional("DHookParam.IsNull"); MarkNativeAsOptional("DHookParam.Get"); MarkNativeAsOptional("DHookParam.GetVector"); MarkNativeAsOptional("DHookParam.GetString"); MarkNativeAsOptional("DHookParam.Set"); MarkNativeAsOptional("DHookParam.SetVector"); MarkNativeAsOptional("DHookParam.SetString"); MarkNativeAsOptional("DHookParam.GetObjectVar"); MarkNativeAsOptional("DHookParam.GetObjectVarVector"); MarkNativeAsOptional("DHookParam.GetObjectVarString"); MarkNativeAsOptional("DHookParam.SetObjectVar"); MarkNativeAsOptional("DHookParam.SetObjectVarVector"); MarkNativeAsOptional("DHookParam.GetAddress"); MarkNativeAsOptional("DHookReturn.Value.get"); MarkNativeAsOptional("DHookReturn.Value.set"); MarkNativeAsOptional("DHookReturn.GetVector"); MarkNativeAsOptional("DHookReturn.GetString"); MarkNativeAsOptional("DHookReturn.SetVector"); MarkNativeAsOptional("DHookReturn.SetString"); MarkNativeAsOptional("DHookSetup.SetFromConf"); MarkNativeAsOptional("DHookSetup.AddParam"); MarkNativeAsOptional("DynamicHook.DynamicHook"); MarkNativeAsOptional("DynamicHook.FromConf"); MarkNativeAsOptional("DynamicHook.HookEntity"); MarkNativeAsOptional("DynamicHook.HookGamerules"); MarkNativeAsOptional("DynamicHook.HookRaw"); MarkNativeAsOptional("DynamicHook.RemoveHook"); MarkNativeAsOptional("DynamicDetour.DynamicDetour"); MarkNativeAsOptional("DynamicDetour.FromConf"); MarkNativeAsOptional("DynamicDetour.Enable"); MarkNativeAsOptional("DynamicDetour.Disable"); } #endif