L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)