Finding & Creating a simple hook

Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!
  • Public Service Announcement

    Hey Guest, I’ve got some exciting news to share! 🎉

    Starting this December, I’ll be moving the entire GameServersHub website away from WordPress and rebuilding it in Next.js! This upgrade will bring incredibly faster speeds, smoother performance, and a modern user experience that sets the stage for everything coming next.

    In 2026, GameServersHub will be entering a new era. I’ll be revamping the entire platform from the ground up and launching a brand-new, fully modernized marketplace. It’ll feature a cleaner design, improved functionality, and better tools for both creators and server owners.

    On top of that, development has already started on the GameServerListing project at https://gsl-six.vercel.app/, which is expected to launch in early Q1 2026. This new system will make discovering and managing servers easier than ever before.


    👉 Stay in the loop!
    Join our Discord for behind-the-scenes updates, early previews, and community discussions.

    » Click here to join our Discord! «

    ~ MrOwlSky

OwnProx

Well-known member
Joined
Jan 19, 2018
Messages
514
What is a Hook? a hook is a way intercepting a function when it gets called by the server it will execute your hook before returning back to the original function giving you the ability to modify the return or manipulate the arguments or do your own task

Automatic Hook Generator Tool (Easy Method)
https://arkserverapi.com/resources/ark-atlas-server-api-c-hook-generator.79/





Manual Hooks (Hard Method)

These are the header files of where you can find such functions to hook:
https://github.com/Michidu/**************/tree/master/version/Core/Public/API/ARK



Finding A Hook

in Actor.h you notice this structure is called APrimalCharacter and you want to hook damage function so ctrl + f search: APrimalCharacter.TakeDamage

you will find this
float TakeDamage(float Damage, FDamageEvent * DamageEvent, AController * EventInstigator, AActor * DamageCauser) { return NativeCall<float, float, FDamageEvent *, AController *, AActor *>(this, "APrimalCharacter.TakeDamage", Damage, DamageEvent, EventInstigator, DamageCauser); }


Declaring A Hook

now this part is pretty simple you declare your hook at the top of your page just below the #include's

DECLARE_HOOK(APrimalCharacter_TakeDamage, float, APrimalCharacter*, float, FDamageEvent*, AController*, AActor*);

lets explain the above declare hook:

Argument 0: (APrimalCharacter_TakeDamage): is the Declaration name this can be anything but your hook function must relate to it
Argument 1: The return type of the function you want to hook (float TakeDamage) as you see here it starts with float so its return type is a float
Argument 2: The Pointer to the class we found the function in, notice the TakeDamage(float Damage, FDamageEvent * DamageEvent, AController * EventInstigator, AActor * DamageCauser) { return NativeCall<float, float, FDamageEvent *, AController *, AActor *>(this, "APrimalCharacter.TakeDamage", Damage, DamageEvent, EventInstigator, DamageCauser); }
if you look "APrimalCharacter.TakeDamage", so you know it will be APrimalCharacter* (you could also scroll up to the top of the struct to see it)
Argument 3-6: these are the arguments that are in TakeDamage Function, TakeDamage(float Damage, FDamageEvent * DamageEvent, AController * EventInstigator, AActor * DamageCauser)

so notice here ^^ float Damage so thats a float then, FDamageEvent*, then AController*, then AActor* ^^ all arguments from up there


Creating the function for the hook to call (2 Examples Below)

Creating our function (with No Damage)
float _cdecl Hook_APrimalCharacter_TakeDamage(APrimalCharacter* _this, float Damage, FDamageEvent* DamageEvent, AController* EventInstigator
, AActor* DamageCauser)
{
return 0;
}

Creating our function (Normal Damage)
float _cdecl Hook_APrimalCharacter_TakeDamage(APrimalCharacter* _this, float Damage, FDamageEvent* DamageEvent, AController* EventInstigator
, AActor* DamageCauser)
{
return APrimalCharacter_TakeDamage_original(_this, Damage, DamageEvent, EventInstigator, DamageCauser);
}


Adding the hook

Setting the hook (notice in the TakeDamage function we want to hook ("APrimalCharacter.TakeDamage")) you need this as the first argument for below and the second argument is your custom function:
ArkApi::GetHooks().SetHook("APrimalCharacter.TakeDamage", &Hook_APrimalCharacter_TakeDamage, &APrimalCharacter_TakeDamage_original);

Removing the Hook
Removing the hook (useful for plugin unloading):
ArkApi::GetHooks().DisableHook("APrimalCharacter.TakeDamage", &Hook_APrimalCharacter_TakeDamage);
 
Last edited:
Back
Top