So I made an external zombie esp and got the offsets for a few things
\\---------------------------------------------------------------------------\
Message to the mods
Please do not ban me this is highly detectable
I am 90% sure you already detect it
\\---------------------------------------------------------------------------\
These are all based on "plutonium-bootstrapper-win32.exe"
Zombie Entity List - "plutonium-bootstrapper-win32.exe"+0x1F30470
How to read zombie entity list:
the first zombie is from reading the pointer at the zombie entity list address
then for each zombie after that they are located at increments of 0x8C
I recommend at least reading up to 256 entities minimum this you can do smaller but i like to be safe
uint32_t entity;
ReadProcessMemory(pHandle, (LPCVOID)(moduleBase + elistaddress + (0x8C * i)), &entity, sizeof(entity), nullptr);
if (entity == NULL)
continue;
Zombie Offsets:
health -> 0x1A8
Position -> 0x134 (a vector3) increments of 4 bytes for each position it will return (x,z,y)
struct zombie_pos
{
float x, y, z;
};
zombie_pos pos;
ReadProcessMemory(pHandle, (LPCVOID)(entity + 0x134), &pos, sizeof(zombie_pos), nullptr);
When reading entities you will get a lot of junk out of it that will still render so reading this offset and checking its value helps
sorting offset (idk what to call this) -> 0x228
check if this offset of the zombie is equal to 9999 or 666
its worked well enough for me every once in a while a zombie doesnt get drawn and i assume its do to this I havent figured it out
(I do not know if panzers are in this or not have not tested)
Player View Matrix - 0x0103AD40
Reading the view matrix and doing w2s
to read our view matrix we want to make a struct of 16 different floats
struct viewMatrix {
float m1, m2, m3, m4;
float m5, m6, m7, m8;
float m9, m10, m11, m12;
float m13, m14, m15, m16;
};
Then we should read the proccess memory from our viewmatrix address
viewMatrix vm;
ReadProcessMemory(pHandle, (LPCVOID)vmaddress, &vm, sizeof(viewMatrix), nullptr);
then we will need this function in order to convert our zombie's 3d position to a 2d screen position
vec2 worldToScreen(viewMatrix m, float x, float y, float z, int w, int h) {
float clip_x = x * m.m1 + y * m.m2 + z * m.m3 + m.m4;
float clip_y = x * m.m5 + y * m.m6 + z * m.m7 + m.m8;
float clip_w = x * m.m13 + y * m.m14 + z * m.m15 + m.m16;
if (clip_w < 0.01) {
vec2 offscreenVec = { -99,-99 };
return offscreenVec;
}
float ndc_x = clip_x / clip_w;
float ndc_y = clip_y / clip_w;
vec2 screenPos = { (ndc_x + 1.0) * 0.5 * w,(1.0 - ndc_y) * 0.5 * h };
return screenPos;
}
Using the W2S Function
vec2 res = worldToScreen(vm, pos.x, pos.y, pos.z, 1920, 1080);
if (res.x == -99.f && res.y == -99.f)
continue;
Player Address - "plutonium-bootstrapper-win32.exe"+0x8A4EEC
Reading Your Player Data
start by reading the pointer at player address
uintptr_t player;
ReadProcessMemory(pHandle, (LPCVOID)(moduleBase + 0x8A4EEC), &player, sizeof(player), nullptr);
then to get the position of our player we read the same way we did our zombie position but starting at 0x18
zombie_pos player_pos;
ReadProcessMemory(pHandle, (LPCVOID)(player + 0x18), &player_pos, sizeof(zombie_pos), nullptr);
Tada you have everything you need to make an esp for zombies.
Go have fun at make sure you either play in lan mode or just solo play (solo play online still has anti cheat enabled so be wary of that)