InfectedWander::Update
0x00a3a0c0 · 1187 bytes · __thiscall
_ZN14InfectedWander6UpdateEP8Infectedf
Decompiled
undefined (3 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* InfectedWander::Update(Infected*, float) */
InfectedWander * __thiscall
InfectedWander::Update(InfectedWander *this,Infected *param_1,float param_2)
{
uint *puVar1;
code *pcVar2;
char cVar3;
int *piVar4;
int iVar5;
InfectedWander *pIVar6;
Vector *pVVar7;
int iVar8;
void *pvVar9;
float fVar10;
float *pfVar11;
float *pfVar12;
longdouble lVar13;
Infected *pIVar14;
char *in_stack_ffffff88;
Vector *in_stack_ffffff8c;
int local_3c;
int local_38;
int local_34;
int local_30;
int local_2c;
Infected local_28 [24];
pfVar12 = (float *)&stack0xffffff84;
local_3c = 0;
local_38 = 0;
if (_towlower == 0) {
local_2c = 0;
}
else {
in_stack_ffffff88 = (char *)&local_3c;
in_stack_ffffff8c = (Vector *)0x0;
(**(code **)(_towlower + 0x50))();
local_2c = _towlower;
}
iVar8 = _DAT_0105db00;
local_34 = local_3c;
local_30 = local_38;
/* try { // try from 00a3a288 to 00a3a2e9 has its CatchHandler @ 00a3a59e */
if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
(iVar5 = ThreadGetCurrentId(), iVar8 == iVar5)) {
if ((char *)*_DAT_0105d15c != "InfectedWander::Update") {
in_stack_ffffff8c = (Vector *)0x0;
in_stack_ffffff88 = "InfectedWander::Update";
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd252df,(char *)0x0,0xca8906);
}
puVar1 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar1 = *puVar1 | 4;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
/* try { // try from 00a3a17f to 00a3a1bf has its CatchHandler @ 00a3a5b3 */
piVar4 = (int *)(**(code **)(*(int *)param_2 + 0x59c))();
if (*(float *)(param_1 + 0x4c) <= 0.0) {
/* try { // try from 00a3a318 to 00a3a45b has its CatchHandler @ 00a3a5b3 */
cVar3 = CDirector::IsFinale(TheDirector);
if (((cVar3 != '\0') || (**(char **)(TheDirector + 0x640) != '\0')) &&
((pIVar6 = (InfectedWander *)CDirectorTacticalServices::GetRandomSurvivor(),
pIVar6 != (InfectedWander *)0x0 &&
((**(code **)(*(int *)pIVar6 + 0x288))(), *(float *)(param_1 + 0x4c) <= 0.0)))) {
BecomeAlert(pIVar6,(Infected *)in_stack_ffffff88,in_stack_ffffff8c);
}
iVar8 = (**(code **)(*piVar4 + 0xb4))();
pfVar11 = (float *)&stack0xffffff84;
if (iVar8 != 0) {
pVVar7 = (Vector *)(**(code **)(*piVar4 + 0xb4))();
pIVar14 = local_28;
pIVar6 = (InfectedWander *)0xa3a38a;
(**(code **)(*(int *)pVVar7 + 0x234))();
pfVar11 = (float *)&stack0xffffff80;
if (*(float *)(param_1 + 0x4c) <= 0.0) {
BecomeAlert(pIVar6,pIVar14,pVVar7);
pfVar11 = (float *)&stack0xffffff80;
}
}
}
else {
lVar13 = (longdouble)CountdownTimer::Now();
pfVar11 = (float *)&stack0xffffff84;
if (*(float *)(param_1 + 0x4c) <= (float)lVar13) {
pvVar9 = ::operator_new(0x80);
/* try { // try from 00a3a470 to 00a3a474 has its CatchHandler @ 00a3a5c3 */
InfectedAlert::InfectedAlert();
*(undefined4 *)this = 1;
*(void **)(this + 4) = pvVar9;
*(undefined4 *)(this + 8) = 0;
goto LAB_00a3a1e6;
}
}
pIVar14 = param_1 + 0x38;
*pfVar11 = (float)pIVar14;
pfVar11[-1] = 1.5027211e-38;
lVar13 = (longdouble)CountdownTimer::Now();
if (*(float *)(param_1 + 0x40) <= (float)lVar13) {
pfVar11[1] = 6.0;
*pfVar11 = 4.0;
pfVar11[-1] = 1.5027934e-38;
lVar13 = (longdouble)RandomFloat();
fVar10 = (float)lVar13;
*pfVar11 = (float)pIVar14;
pfVar11[-1] = 1.5027954e-38;
lVar13 = (longdouble)CountdownTimer::Now();
if ((float)lVar13 + fVar10 != *(float *)(param_1 + 0x40)) {
iVar8 = *(int *)(param_1 + 0x38);
pfVar11[1] = (float)(param_1 + 0x40);
*pfVar11 = (float)pIVar14;
pcVar2 = *(code **)(iVar8 + 4);
pfVar11[-1] = 1.502837e-38;
(*pcVar2)();
*(float *)(param_1 + 0x40) = (float)lVar13 + fVar10;
}
if (fVar10 != *(float *)(param_1 + 0x3c)) {
iVar8 = *(int *)(param_1 + 0x38);
pfVar11[1] = (float)(param_1 + 0x3c);
*pfVar11 = (float)pIVar14;
pcVar2 = *(code **)(iVar8 + 4);
pfVar11[-1] = 1.5028314e-38;
(*pcVar2)();
*(float *)(param_1 + 0x3c) = fVar10;
}
*pfVar11 = param_2;
pfVar11[-1] = 1.5028025e-38;
iVar8 = CBaseEntity::GetGender((CBaseEntity *)*pfVar11);
if (iVar8 == 0x10) {
pfVar11[1] = 1.4013e-43;
*pfVar11 = 1.4013e-45;
pfVar11[-1] = 1.5028427e-38;
iVar8 = RandomInt();
if (iVar8 < 0x32) {
pfVar11[1] = (float)"flower";
*pfVar11 = param_2;
pfVar11[-1] = 1.5028462e-38;
fVar10 = (float)CBaseAnimating::LookupAttachment
((CBaseAnimating *)*pfVar11,(char *)pfVar11[1]);
pfVar11[5] = -NAN;
pfVar11[4] = 0.0;
pfVar11[3] = fVar10;
pfVar11[2] = param_2;
pfVar11[1] = 7.00649e-45;
*pfVar11 = (float)"blood_spray_clown";
pfVar11[-1] = 1.5028524e-38;
DispatchParticleEffect();
pfVar11[3] = 0.0;
pfVar11[2] = 0.0;
pfVar11[1] = (float)"Blood.Spurt";
*pfVar11 = param_2;
pfVar11[-1] = 1.5028569e-38;
CBaseEntity::EmitSound
((CBaseEntity *)*pfVar11,(char *)pfVar11[1],pfVar11[2],(float *)pfVar11[3]);
}
}
iVar8 = *(int *)param_2;
*pfVar11 = param_2;
pcVar2 = *(code **)(iVar8 + 0x594);
pfVar11[-1] = 1.5028053e-38;
piVar4 = (int *)(*pcVar2)();
iVar8 = *piVar4;
pfVar11[1] = 0.0;
*pfVar11 = (float)piVar4;
pcVar2 = *(code **)(iVar8 + 0x100);
pfVar11[-1] = 1.502808e-38;
cVar3 = (*pcVar2)();
pfVar11[2] = 0.0;
if (cVar3 == '\0') {
pfVar11[1] = (float)"Zombie.Sleeping";
*pfVar11 = param_2;
/* try { // try from 00a3a4b3 to 00a3a598 has its CatchHandler @ 00a3a5b3 */
pfVar11[-1] = 1.5028276e-38;
Infected::Vocalize((Infected *)*pfVar11,(char *)pfVar11[1],*(bool *)(pfVar11 + 2));
}
else {
pfVar11[1] = (float)"Zombie.Wander";
*pfVar11 = param_2;
pfVar11[-1] = 1.5028119e-38;
Infected::Vocalize((Infected *)*pfVar11,(char *)pfVar11[1],*(bool *)(pfVar11 + 2));
}
}
*(undefined4 *)this = 0;
*(undefined4 *)(this + 4) = 0;
*(undefined4 *)(this + 8) = 0;
pfVar12 = pfVar11;
LAB_00a3a1e6:
iVar8 = _DAT_0105db00;
if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
pfVar12[-1] = 1.5027406e-38;
iVar5 = ThreadGetCurrentId();
if (iVar8 == iVar5) {
*pfVar12 = (float)_DAT_0105d15c;
pfVar12[-1] = 1.502743e-38;
cVar3 = CVProfNode::ExitScope();
if (cVar3 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
}
if (local_2c != 0) {
pfVar12[5] = 0.0;
pfVar12[4] = 0.0;
pfVar12[3] = 0.0;
*pfVar12 = (float)local_2c;
pfVar12[1] = (float)local_34;
pfVar12[2] = (float)local_30;
pcVar2 = *(code **)(local_2c + 0x54);
pfVar12[-1] = 1.5027361e-38;
(*pcVar2)();
}
return this;
}
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.