L4D1SurvivorMinigunAttack::SelectTarget
0x00923560 · 809 bytes · __thiscall
_ZN25L4D1SurvivorMinigunAttack12SelectTargetEP11SurvivorBot
Decompiled
undefined (2 params)
/* L4D1SurvivorMinigunAttack::SelectTarget(SurvivorBot*) */
undefined4 __thiscall
L4D1SurvivorMinigunAttack::SelectTarget(L4D1SurvivorMinigunAttack *this,SurvivorBot *param_1)
{
int *piVar1;
int iVar2;
code *pcVar3;
uint uVar4;
char cVar5;
int iVar6;
int *piVar7;
int *piVar8;
int *piVar9;
uint *puVar10;
undefined *puVar11;
int iVar12;
int iVar13;
float fVar14;
int aiStackY_88 [3];
float local_5c;
float local_58;
float local_54;
float local_50;
float local_4c;
float local_44;
float local_40;
SurvivorBot *local_38;
float local_34;
float local_30;
float local_2c;
int *local_28;
float local_24;
int *local_20;
piVar7 = (int *)&stack0xffffff84;
cVar5 = IsBlindedByVomit(this,param_1);
if (cVar5 == '\0') {
if (*(int *)(gpGlobals + 4) != *(int *)(this + 0x50)) {
iVar13 = 0;
local_38 = param_1;
CBasePlayer::EyeVectors
((CBasePlayer *)param_1,(Vector *)&local_34,(Vector *)0x0,(Vector *)0x0);
local_28 = (int *)0x0;
iVar12 = 0;
local_24 = 3.4028235e+38;
local_20 = (int *)0x0;
iVar6 = (**(code **)(*(int *)param_1 + 0x9a8))();
piVar9 = (int *)&stack0xffffff84;
if (0 < *(int *)(iVar6 + 0x70)) {
LAB_009235ff:
do {
uVar4 = *(uint *)(*(int *)(iVar6 + 100) + iVar12);
piVar8 = piVar9;
if ((((uVar4 != 0xffffffff) &&
(puVar11 = g_pEntityList + (uVar4 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc
)) && (*(uint *)(puVar11 + 8) == uVar4 >> 0xc)) &&
(piVar1 = *(int **)(puVar11 + 4), piVar1 != (int *)0x0)) {
iVar2 = *piVar1;
*piVar9 = (int)piVar1;
pcVar3 = *(code **)(iVar2 + 300);
piVar9[-1] = 0x923644;
cVar5 = (*pcVar3)();
if (cVar5 != '\0') {
iVar2 = *(int *)(local_38 + 0x4028);
piVar9[2] = *(int *)(SurvivorBotCloseThreatRange._28_4_ + 0x2c);
*piVar9 = (int)(local_38 + 0x4028);
piVar9[1] = (int)piVar1;
pcVar3 = *(code **)(iVar2 + 0x114);
piVar9[-1] = 0x923678;
cVar5 = (*pcVar3)();
if (cVar5 == '\0') {
if (local_20 == (int *)0x0) {
iVar2 = *(int *)local_38;
*piVar9 = (int)local_38;
pcVar3 = *(code **)(iVar2 + 0x9ac);
piVar9[-1] = 0x923699;
piVar7 = (int *)(*pcVar3)();
iVar2 = *piVar7;
piVar9[2] = 0;
*piVar9 = (int)piVar7;
piVar9[1] = (int)piVar1;
pcVar3 = *(code **)(iVar2 + 0xf8);
piVar9[-1] = 0x9236b3;
cVar5 = (*pcVar3)();
if (cVar5 != '\0') {
local_20 = piVar1;
}
}
}
else {
iVar2 = *(int *)local_38;
piVar9[1] = (int)local_38;
*piVar9 = (int)&local_44;
pcVar3 = *(code **)(iVar2 + 0x234);
piVar9[-1] = 0x923725;
(*pcVar3)();
iVar2 = *piVar1;
*piVar9 = (int)piVar1;
piVar9[-1] = (int)&local_50;
pcVar3 = *(code **)(iVar2 + 0x234);
piVar9[-2] = 0x92373d;
(*pcVar3)();
piVar7 = piVar9 + -2;
local_54 = 0.0;
local_5c = local_50 - local_44;
piVar9[-2] = (int)&local_5c;
local_58 = local_4c - local_40;
piVar9[-3] = 0x923770;
VectorNormalize((Vector *)piVar9[-2]);
fVar14 = 1.0 - (local_5c * local_34 + local_58 * local_30 + 1.0 +
local_54 * local_2c) * 0.5;
piVar8 = piVar9 + -2;
if (fVar14 < local_24) {
iVar2 = *(int *)local_38;
piVar9[-2] = (int)local_38;
pcVar3 = *(code **)(iVar2 + 0x9ac);
piVar9[-3] = 0x9237cd;
piVar8 = (int *)(*pcVar3)();
iVar2 = *piVar8;
*piVar9 = 0;
piVar9[-2] = (int)piVar8;
piVar9[-1] = (int)piVar1;
pcVar3 = *(code **)(iVar2 + 0xf8);
piVar9[-3] = 0x9237e7;
cVar5 = (*pcVar3)();
piVar8 = piVar9 + -2;
if (cVar5 != '\0') {
iVar13 = iVar13 + 1;
iVar12 = iVar12 + 0x2c;
piVar9 = piVar9 + -2;
local_28 = piVar1;
local_24 = fVar14;
if (*(int *)(iVar6 + 0x70) <= iVar13) break;
goto LAB_009235ff;
}
}
}
}
}
iVar13 = iVar13 + 1;
iVar12 = iVar12 + 0x2c;
piVar9 = piVar8;
piVar7 = piVar8;
} while (iVar13 < *(int *)(iVar6 + 0x70));
}
piVar9 = local_28;
if ((local_28 == (int *)0x0) && (piVar9 = local_20, local_20 == (int *)0x0)) {
*(undefined4 *)(this + 0x4c) = 0xffffffff;
*(undefined4 *)(this + 0x50) = *(undefined4 *)(gpGlobals + 4);
return 0;
}
iVar6 = *piVar9;
*piVar7 = (int)piVar9;
pcVar3 = *(code **)(iVar6 + 0xc);
piVar7[-1] = 0x92381f;
puVar10 = (uint *)(*pcVar3)();
puVar11 = g_pEntityList;
uVar4 = *puVar10;
*(uint *)(this + 0x4c) = uVar4;
*(undefined4 *)(this + 0x50) = *(undefined4 *)(gpGlobals + 4);
if (uVar4 == 0xffffffff) {
return 0;
}
puVar11 = puVar11 + (uVar4 & 0xfff) * 0x10;
if (puVar11 == (undefined *)0xfffffffc) {
return 0;
}
if (*(uint *)(puVar11 + 8) != uVar4 >> 0xc) {
return 0;
}
return *(undefined4 *)(puVar11 + 4);
}
uVar4 = *(uint *)(this + 0x4c);
if (((uVar4 != 0xffffffff) &&
(puVar11 = g_pEntityList + (uVar4 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar11 + 8) == uVar4 >> 0xc)) {
return *(undefined4 *)(puVar11 + 4);
}
}
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.