- Status
- Offline
- Joined
- Mar 3, 2026
- Messages
- 247
- Reaction score
- 7
Boys, throwing together a quick snippet for those of you messing around with internal hooks in Warface. Getting character movement to trigger correctly via memory can be a headache if your VTable index is off or you're missing the proper global environment pointers.
Here is how I am handling SetPos calls by grabbing the entity interface. Remember that vtable index 21 is the standard for the SetPos function in this engine build, but always verify your offsets if you are running on a different client version.
And here is the boilerplate to pull your pointers from the SSystemGlobalEnvironment. I included the actor and entity retrieval logic so you can verify you are actually targeting the client actor before pushing the coordinates.
A few things to note:
Has anyone experimented with this on the latest patch? Curious if they added more sanity checks to position updates in RM.
Here is how I am handling SetPos calls by grabbing the entity interface. Remember that vtable index 21 is the standard for the SetPos function in this engine build, but always verify your offsets if you are running on a different client version.
Code:
void SetPos(void* pEntity, const Vec3& newPos)
{
uintptr_t* vtable = *(uintptr_t**)pEntity;
SetPosFn fnSetPos = (SetPosFn)vtable[21];
fnSetPos(pEntity, &newPos, 0);
}
And here is the boilerplate to pull your pointers from the SSystemGlobalEnvironment. I included the actor and entity retrieval logic so you can verify you are actually targeting the client actor before pushing the coordinates.
Code:
SSystemGlobalEnvironment* pEvn = SSystemGlobalEnvironment::GetInstance();
if (!pEvn) return;
CGame* pGame = pEvn->GetGame();
CGameFramework* pGameFramework = pGame->GetGameFramework();
CActorSystem* pActorSystem = pGameFramework->GetActorSystem();
CActor* m_pActor = pActorSystem->GetActor(pGameFramework->GetClientActorId());
CEntity* pEntity = m_pActor->GetEntity();
if (pEntity)
{
Vec3 newPos = { 100.0f, 200.0f, 300.0f };
SetPos(pEntity, newPos);
}
A few things to note:
- Always validate your pointers before calling the function or you will be looking at an instant crash to desktop.
- This is a basic memory write. If you are doing this in high-traffic areas or constantly spamming position updates, expect a flag from the server-side analytics.
- If anyone has found a more stable way to trigger this without relying on the VTable index (maybe a direct function hook or a different pattern), drop your insights below.
Has anyone experimented with this on the latest patch? Curious if they added more sanity checks to position updates in RM.