diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e9145a..fa5e229 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,15 +12,15 @@ on: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: - sm_version: [ "1.10", "1.11", "1.12" ] + sm_version: [ "1.11", "1.12" ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v6 - name: Set environment variables run: | @@ -47,7 +47,7 @@ jobs: working-directory: ${{ env.SCRIPTING_PATH }}/ - name: Uploading artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v7 with: name: movementapi-${{ env.GITHUB_SHA_SHORT }} path: ./ diff --git a/.travis.yml b/.travis.yml index d563940..da5c805 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ addons: - lib32stdc++6 # needed for spcomp env: - - SMVERSION=1.10 + - SMVERSION=1.12 before_script: # install smbuilder diff --git a/README.md b/README.md index 191a28d..3b6ffc5 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,7 @@ A SourceMod API focused on player movement in the form of a [function stock liba ### Requirements - * SourceMod ^1.10 - * [DHooks 2 with detour support](https://github.com/peace-maker/DHooks2) + * SourceMod ^1.11 ### Plugin Installation diff --git a/addons/sourcemod/scripting/include/dhooks.inc b/addons/sourcemod/scripting/include/dhooks.inc index 5354b89..d293fdb 100644 --- a/addons/sourcemod/scripting/include/dhooks.inc +++ b/addons/sourcemod/scripting/include/dhooks.inc @@ -1,3 +1,35 @@ +/** + * 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 @@ -38,8 +70,8 @@ enum ReturnType ReturnType_Int, ReturnType_Bool, ReturnType_Float, - ReturnType_String, //Note this is a string_t - ReturnType_StringPtr, //Note this is a string_t * + ReturnType_String, // Note this is a string_t + ReturnType_StringPtr, // Note this is a string_t * ReturnType_CharPtr, ReturnType_Vector, ReturnType_VectorPtr, @@ -53,8 +85,8 @@ enum HookParamType HookParamType_Int, HookParamType_Bool, HookParamType_Float, - HookParamType_String, //Note this is a string_t - HookParamType_StringPtr, //Note this is a string_t * + HookParamType_String, // Note this is a string_t + HookParamType_StringPtr, // Note this is a string_t * HookParamType_CharPtr, HookParamType_VectorPtr, HookParamType_CBaseEntity, @@ -87,34 +119,34 @@ enum CallingConvention enum HookMode { - Hook_Pre, // Callback will be executed BEFORE the original function. - Hook_Post // Callback will be executed AFTER the original function. + 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 + 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 */ + 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, @@ -124,7 +156,7 @@ enum DHookRegister DHookRegister_CH, DHookRegister_DH, DHookRegister_BH, - + // 32-bit general purpose registers DHookRegister_EAX, DHookRegister_ECX, @@ -134,7 +166,7 @@ enum DHookRegister DHookRegister_EBP, DHookRegister_ESI, DHookRegister_EDI, - + // 128-bit XMM registers DHookRegister_XMM0, DHookRegister_XMM1, @@ -144,17 +176,17 @@ enum DHookRegister DHookRegister_XMM5, DHookRegister_XMM6, DHookRegister_XMM7, - + // 80-bit FPU registers DHookRegister_ST0 }; typeset ListenCB { - //Deleted + // Deleted function void (int entity); - - //Created + + // Created function void (int entity, const char[] classname); }; @@ -162,46 +194,47 @@ typeset DHookRemovalCB { function void (int hookid); }; + typeset DHookCallback { - //Function Example: void Ham::Test() with this pointer ignore + // Function Example: void Ham::Test() with this pointer ignore function MRESReturn (); - - //Function Example: void Ham::Test() with this pointer passed + + // 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 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 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 Example: int Ham::Test() with this pointer ignore function MRESReturn (DHookReturn hReturn); - - //Function Example: int Ham::Test() with this pointer passed + + // 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 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 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 + + // 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 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 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 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. @@ -233,13 +266,15 @@ methodmap DHookParam < Handle // @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. // @@ -336,9 +371,18 @@ methodmap DHookParam < Handle // // @param num Parameter number to check, starting at 1. // - // @return True if null, false otherwise. + // @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); }; @@ -348,6 +392,8 @@ 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. @@ -409,7 +455,7 @@ methodmap DHookSetup < 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. + // @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); @@ -419,7 +465,7 @@ methodmap DHookSetup < Handle // @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); }; @@ -427,7 +473,7 @@ methodmap DHookSetup < Handle // 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 @@ -438,7 +484,7 @@ methodmap DynamicHook < DHookSetup // @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); @@ -460,14 +506,14 @@ methodmap DynamicHook < DHookSetup // 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. + // 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); @@ -478,13 +524,13 @@ methodmap DynamicHook < DHookSetup // 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. + // 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); @@ -493,23 +539,22 @@ methodmap DynamicHook < DHookSetup // 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. + // 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: - // This will NOT fire the removal callback! - // + // Remove hook by hook id. + // // @param hookid Hook id to remove. - // - // @return True on success, false otherwise + // + // @return true on success, false otherwise public static native bool RemoveHook(int hookid); }; @@ -521,7 +566,7 @@ methodmap DynamicHook < DHookSetup // 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 +// 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 @@ -554,13 +599,13 @@ methodmap DynamicDetour < DHookSetup // 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. + // 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. + // @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); @@ -569,367 +614,405 @@ methodmap DynamicDetour < DHookSetup // @param mode The hook mode to disable - pre or post. // @param callback Callback function. // - // @return True if detour was disabled, false otherwise. + // @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 +/** + * Adds an entity listener hook * - * @noreturn -*/ + * @param type Type of listener to add + * @param callback Callback to use + */ native void DHookAddEntityListener(ListenType type, ListenCB callback); -/* Removes an entity listener hook +/** + * Removes an entity listener hook * - * @param type Type of listener to remove - * @param callback Callback this listener was using + * @param type Type of listener to remove + * @param callback Callback this listener was using * - * @return True if one was removed false otherwise. -*/ + * @return true if one was removed, false otherwise + */ native bool DHookRemoveEntityListener(ListenType type, ListenCB callback); -/* Creates a hook +/** + * 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. -*/ + * @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) + * @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. - */ + * @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. + * @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. + * @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. + * @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. + * @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 retunr 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 + * @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. + * @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 + * @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. + * @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 +/** + * 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) - * @noreturn -*/ + * @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. - * - * @error Invalid setup handle, invalid address, invalid hook type or invalid callback. - * @return INVALID_HOOK_ID on fail a hookid on success -*/ +/** + * 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. - * - * @error Invalid setup handle, invalid address, invalid hook type or invalid callback. - * @return INVALID_HOOK_ID on fail a hookid on success -*/ +/** + * 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. - * - * @error Invalid setup handle, invalid address, invalid hook type or invalid callback. - * @return INVALID_HOOK_ID on fail a hookid on success -*/ +/** + * 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 - * @note This will not fire the removal callback! -*/ +/** + * 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, 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) - * - * @error Invalid handle. Invalid param number. Invalid param type. - * @return value if num greater than 0. If 0 returns paramcount. -*/ +/** + * 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. - * @noreturn -*/ +/** + * 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. - * @noreturn -*/ +/** + * 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, bool or float param types) - * - * @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. - * @noreturn -*/ +/** + * 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. - * @noreturn -*/ +/** + * 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. - * @noreturn -*/ +/** + * 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. -*/ +/** + * 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. - * @noreturn -*/ +/** + * 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. - * @noreturn -*/ +/** + * 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) - * - * @param hReturn Handle to return structure - * @param value Value to set return as - * - * @error Invalid Handle, invalid type. - * @noreturn -*/ +/** + * 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. - * @noreturn -*/ +/** + * 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. - * @noreturn -*/ +/** + * 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 +/** + * 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 + * @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. -*/ + * @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 +/** + * 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. + * @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. - * @noreturn -*/ + * @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 +/** + * 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 + * @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. - * @noreturn -*/ + * @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 +/** + * 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. + * @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. - * @noreturn -*/ + * @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 +/** + * 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 + * @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. - * @noreturn -*/ + * @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 +/** + * Checks if a pointer param is null * - * @param hParams Handle to params structure - * @param num Param number to check. + * @param hParams Handle to params structure + * @param num Param number to check. * - * @error Non pointer param - * @return True if null false otherwise. -*/ + * @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", @@ -980,6 +1063,7 @@ public __ext_dhooks_SetNTVOptional() MarkNativeAsOptional("DHookSetParamObjectPtrVarVector"); MarkNativeAsOptional("DHookIsNullParam"); MarkNativeAsOptional("DHookGetParamObjectPtrString"); + MarkNativeAsOptional("DHookGetParamAddress"); MarkNativeAsOptional("DHookParam.IsNull"); MarkNativeAsOptional("DHookParam.Get"); @@ -993,6 +1077,7 @@ public __ext_dhooks_SetNTVOptional() MarkNativeAsOptional("DHookParam.GetObjectVarString"); MarkNativeAsOptional("DHookParam.SetObjectVar"); MarkNativeAsOptional("DHookParam.SetObjectVarVector"); + MarkNativeAsOptional("DHookParam.GetAddress"); MarkNativeAsOptional("DHookReturn.Value.get"); MarkNativeAsOptional("DHookReturn.Value.set"); MarkNativeAsOptional("DHookReturn.GetVector");