InfectedAttack::IsUnderground
0x00a29a80 · 1535 bytes · __thiscall
_ZNK14InfectedAttack13IsUndergroundEP8Infected
Decompiled
undefined (2 params)
/* InfectedAttack::IsUnderground(Infected*) const */
undefined4 __thiscall InfectedAttack::IsUnderground(InfectedAttack *this,Infected *param_1)
{
float fVar1;
float fVar2;
float fVar3;
float fVar4;
bool bVar5;
int *piVar6;
int *piVar7;
float *pfVar8;
int iVar9;
undefined4 uVar10;
longdouble lVar11;
float fVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
float fVar17;
float fVar18;
float fVar19;
undefined **local_dc [4];
float local_cc;
float local_c8;
float local_c4;
float local_bc;
float local_b8;
float local_b4;
float local_ac;
float local_a8;
float local_a4;
float local_9c;
float local_98;
float local_94;
undefined4 local_8c;
undefined1 local_88;
undefined1 local_87;
Vector local_70 [12];
float local_64;
float local_60;
float local_5c;
float local_44;
byte local_3c;
if (*(int *)(ZombiePreventBurrowing._28_4_ + 0x30) != 0) {
piVar6 = (int *)(**(code **)(*(int *)param_1 + 0x594))(param_1);
piVar7 = (int *)(**(code **)(*(int *)param_1 + 0x590))(param_1);
if ((piVar7 != (int *)0x0) && (piVar6 != (int *)0x0)) {
if (((byte)param_1[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
fVar1 = *(float *)(param_1 + 0x2e0);
fVar2 = *(float *)(param_1 + 0x2e4);
fVar3 = *(float *)(param_1 + 0x2e8);
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)local_dc,(IHandleEntity *)0x0,8,
(_func_bool_IHandleEntity_ptr_int *)0x0);
local_dc[0] = &PTR_ShouldHitEntity_00c54558;
pfVar8 = (float *)(**(code **)(*piVar6 + 0x128))(piVar6);
fVar19 = *pfVar8;
fVar13 = pfVar8[1];
fVar12 = pfVar8[2];
pfVar8 = (float *)(**(code **)(*piVar6 + 300))(piVar6);
fVar4 = *pfVar8;
fVar15 = pfVar8[1];
fVar17 = pfVar8[2];
lVar11 = (longdouble)(**(code **)(*piVar7 + 0x130))(piVar7);
local_bc = 0.0;
local_b8 = 0.0;
local_b4 = 500.0;
local_87 = 1;
local_8c = 0;
fVar12 = (float)lVar11 + 0.1 + fVar12;
fVar16 = (fVar4 - fVar19) * 0.5;
fVar14 = (fVar15 - fVar13) * 0.5;
if (fVar17 <= fVar12) {
fVar17 = fVar12;
}
fVar18 = (fVar15 + fVar13) * 0.5;
fVar15 = (fVar17 - fVar12) * 0.5;
fVar13 = (fVar12 + fVar17) * 0.5;
bVar5 = fVar14 * fVar14 + fVar16 * fVar16 + fVar15 * fVar15 < 1e-06;
fVar19 = (fVar19 + fVar4) * 0.5;
local_cc = fVar1 + fVar19;
local_c8 = fVar2 + fVar18;
local_c4 = fVar3 + fVar13;
local_ac = -fVar19;
local_a8 = -fVar18;
local_a4 = -fVar13;
local_9c = fVar16;
local_98 = fVar14;
local_94 = fVar15;
local_88 = bVar5;
(**(code **)(*enginetrace + 0x14))
(enginetrace,&local_cc,0x2420b,(CTraceFilterSimple *)local_dc,local_70);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_70,(Vector *)&local_64,0xff,0xff,0,true,-1.0);
}
if (0.0 < local_44) {
local_8c = 0;
local_c8 = fVar18 + local_60;
local_c4 = fVar13 + local_5c;
local_bc = fVar1 - local_64;
local_b8 = fVar2 - local_60;
local_b4 = fVar3 - local_5c;
local_cc = fVar19 + local_64;
local_87 = local_b4 * local_b4 + local_b8 * local_b8 + local_bc * local_bc != 0.0;
local_ac = -fVar19;
local_a8 = -fVar18;
local_a4 = -fVar13;
local_9c = fVar16;
local_98 = fVar14;
local_94 = fVar15;
local_88 = bVar5;
(**(code **)(*enginetrace + 0x14))
(enginetrace,&local_cc,0x2420b,(CTraceFilterSimple *)local_dc,local_70);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_70,(Vector *)&local_64,0xff,0xff,0,true,-1.0);
}
if ((local_44 < 1.0) && ((local_3c & 1) != 0)) {
iVar9 = (**(code **)(*(int *)param_1 + 0x52c))(param_1);
if (iVar9 == 0) {
uVar10 = 0xffffffff;
}
else {
uVar10 = *(undefined4 *)(iVar9 + 0x8c);
}
Warning("Zombie tried to attack from under displacement in nav area %d, setpos %.1f %.1f %.1f\n"
,uVar10,(double)local_64,(double)local_60,(double)local_5c);
return 1;
}
}
}
}
return 0;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.