AvoidNeighbors
0x00a11ab0 · 1685 bytes · __cdecl
_Z14AvoidNeighborsP8InfectedP11CBaseEntityP12PathFollower
Decompiled
undefined (3 params)
/* AvoidNeighbors(Infected*, CBaseEntity*, PathFollower*) */
void AvoidNeighbors(Infected *param_1,CBaseEntity *param_2,PathFollower *param_3)
{
code *pcVar1;
uint uVar2;
CBaseEntity *this;
char cVar3;
int *piVar4;
undefined4 uVar5;
int iVar6;
undefined4 *puVar7;
Vector *pVVar8;
CBaseEntity *pCVar9;
float *pfVar10;
undefined *puVar11;
TerrorNavArea *pTVar12;
longdouble lVar13;
float fVar14;
float fVar15;
float fVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
float fVar21;
undefined4 uVar22;
float local_40;
float local_34;
float local_30;
float local_2c;
float local_28;
float local_24;
float local_20;
piVar4 = (int *)(**(code **)(*(int *)param_1 + 0x590))(param_1);
cVar3 = (**(code **)(*piVar4 + 200))(piVar4);
if (((cVar3 == '\0') && (cVar3 = (**(code **)(*piVar4 + 0xf8))(piVar4), cVar3 != '\0')) &&
((param_2 == (CBaseEntity *)0x0 ||
(cVar3 = (**(code **)(*(int *)(param_1 + 0x1a3c) + 0x114))
(param_1 + 0x1a3c,param_2,0x437a0000), cVar3 == '\0')))) {
pcVar1 = *(code **)(*(int *)param_3 + 0x2c);
uVar5 = (**(code **)(*piVar4 + 300))(piVar4);
(*pcVar1)(param_3,uVar5,0,0);
iVar6 = (**(code **)(*(int *)param_3 + 0x40))(param_3);
puVar7 = *(undefined4 **)(iVar6 + 0x1c);
if (puVar7 != (undefined4 *)0x0) {
if (puVar7[5] == 0) {
local_40 = 0.0;
do {
pTVar12 = (TerrorNavArea *)*puVar7;
if ((pTVar12 != (TerrorNavArea *)0x0) &&
(cVar3 = TerrorNavArea::IsBottleneck(pTVar12), cVar3 != '\0')) {
pVVar8 = (Vector *)(**(code **)(*piVar4 + 300))(piVar4);
lVar13 = (longdouble)CNavArea::GetDistanceSquaredToPoint((CNavArea *)pTVar12,pVVar8);
fVar14 = SQRT((float)lVar13);
if (*(int *)(ZombieDebugAvoid._28_4_ + 0x30) == 0) goto LAB_00a11c7f;
pTVar12 = pTVar12 + 0x2c;
goto LAB_00a11c1e;
}
local_40 = local_40 + (float)puVar7[10];
puVar7 = (undefined4 *)(**(code **)(*(int *)param_3 + 0x58))(param_3,puVar7);
if ((puVar7 == (undefined4 *)0x0) || (750.0 <= local_40)) goto LAB_00a11c98;
} while (puVar7[5] == 0);
}
pTVar12 = (TerrorNavArea *)&local_28;
iVar6 = (**(code **)(*piVar4 + 300))(piVar4);
uVar5 = *(undefined4 *)(iVar6 + 8);
uVar22 = puVar7[5];
CNavLadder::GetPosAtHeight((float)pTVar12);
pfVar10 = (float *)(**(code **)(*piVar4 + 300))(piVar4,uVar22,uVar5);
fVar14 = SQRT((local_28 - *pfVar10) * (local_28 - *pfVar10) +
(local_24 - pfVar10[1]) * (local_24 - pfVar10[1]) +
(local_20 - pfVar10[2]) * (local_20 - pfVar10[2]));
if (*(int *)(ZombieDebugAvoid._28_4_ + 0x30) != 0) {
LAB_00a11c1e:
if (((byte)param_1[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
NDebugOverlay::HorzArrow
((Vector *)(param_1 + 0x2e0),(Vector *)pTVar12,10.0,0xff,0,0xff,0xff,true,0.1);
}
LAB_00a11c7f:
if ((fVar14 < 300.0) && (0.0 < fVar14)) {
return;
}
}
LAB_00a11c98:
if (*(int *)(param_1 + 0x1d34) != 0) {
iVar6 = 0;
local_34 = vec3_origin;
local_30 = DAT_01053d4c;
local_2c = DAT_01053d50;
fVar14 = *(float *)(ZombieAvoidMinRange._28_4_ + 0x2c);
fVar18 = *(float *)(ZombieAvoidMaxRange._28_4_ + 0x2c);
if (0 < *(int *)(param_1 + 0x1d34)) {
do {
uVar2 = *(uint *)(*(int *)(param_1 + 0x1d28) + iVar6 * 4);
if ((((uVar2 != 0xffffffff) &&
(puVar11 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc
)) && (*(uint *)(puVar11 + 8) == uVar2 >> 0xc)) &&
(this = *(CBaseEntity **)(puVar11 + 4), this != (CBaseEntity *)0x0)) {
pCVar9 = (CBaseEntity *)(**(code **)(*(int *)param_1 + 0x570))(param_1);
if (((byte)pCVar9[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar9);
}
if (((byte)this[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(this);
}
fVar19 = *(float *)(this + 0x2e4) - *(float *)(pCVar9 + 0x2e4);
fVar16 = *(float *)(this + 0x2e8) - *(float *)(pCVar9 + 0x2e8);
fVar20 = *(float *)(this + 0x2e0) - *(float *)(pCVar9 + 0x2e0);
fVar15 = fVar19 * fVar19 + fVar16 * fVar16 + fVar20 * fVar20;
if (fVar15 < fVar18 * fVar18) {
fVar15 = SQRT(fVar15) + 0.001;
fVar21 = 1.0 / fVar15;
if (fVar15 <= fVar14) {
fVar15 = -1.0;
fVar17 = 1.0;
}
else {
fVar17 = (fVar18 - fVar15) * (1.0 / (fVar18 - fVar14));
fVar15 = -fVar17;
}
if (*(int *)(ZombieDebugAvoid._28_4_ + 0x30) != 0) {
if (((byte)this[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(this);
}
pCVar9 = (CBaseEntity *)(**(code **)(*(int *)param_1 + 0x570))(param_1);
if (((byte)pCVar9[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar9);
}
NDebugOverlay::HorzArrow
((Vector *)(pCVar9 + 0x2e0),(Vector *)(this + 0x2e0),fVar17 * 15.0,0xff,0,
0,0xff,true,0.1);
}
local_34 = fVar20 * fVar21 * fVar15 + local_34;
local_30 = fVar19 * fVar21 * fVar15 + local_30;
local_2c = fVar15 * fVar21 * fVar16 + local_2c;
}
}
iVar6 = iVar6 + 1;
} while (iVar6 < *(int *)(param_1 + 0x1d34));
}
if (1.0 < local_30 * local_30 + local_34 * local_34 + local_2c * local_2c) {
VectorNormalize((Vector *)&local_34);
}
if (((local_34 != vec3_origin) || (local_30 != DAT_01053d4c)) || (local_2c != DAT_01053d50)) {
fVar14 = *(float *)(ZombieAvoidPower._28_4_ + 0x2c);
fVar18 = local_34 * fVar14;
fVar15 = local_30 * fVar14;
fVar14 = local_2c * fVar14;
pcVar1 = *(code **)(*piVar4 + 0xb4);
pfVar10 = (float *)(**(code **)(*piVar4 + 300))(piVar4);
local_28 = fVar18 + *pfVar10;
local_24 = fVar15 + pfVar10[1];
local_20 = fVar14 + pfVar10[2];
(*pcVar1)(piVar4,&local_28,0x3f800000);
}
}
}
return;
}
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.