L L4D2node

SpitterAssault::Update

0x00acdd60 · 3165 bytes · __thiscall

_ZN14SpitterAssault6UpdateEP7Spitterf

Decompiled

undefined (3 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* SpitterAssault::Update(Spitter*, float) */

void __thiscall SpitterAssault::Update(SpitterAssault *this,Spitter *param_1,float param_2)

{
  Spitter *pSVar1;
  code *pcVar2;
  char cVar3;
  Spitter SVar4;
  int *piVar5;
  int *piVar6;
  int *piVar7;
  undefined *puVar8;
  int *piVar9;
  uint *puVar10;
  undefined4 *puVar11;
  CBaseEntity *pCVar12;
  int iVar13;
  int iVar14;
  Vector *pVVar15;
  uint uVar16;
  float fVar17;
  float *pfVar18;
  CTerrorPlayer *pCVar19;
  longdouble lVar20;
  int *local_74;
  float local_70;
  int local_64;
  int local_54;
  int local_50;
  int local_4c;
  int local_48;
  int local_44;
  int local_40;
  int local_3c;
  int local_38;
  undefined **local_34;
  float local_30;
  CBaseEntity *local_2c;
  undefined4 local_28;
  undefined4 local_24;
  undefined4 local_20;
  
  piVar5 = (int *)(**(code **)(*(int *)param_2 + 0x9b4))();
  piVar6 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
  piVar7 = (int *)(**(code **)(*(int *)param_2 + 0x9bc))();
  puVar8 = g_pEntityList;
  if (param_1[0x4848] == (Spitter)0x0) {
LAB_00acddaa:
    uVar16 = *(uint *)(param_1 + 0x34);
    pCVar19 = (CTerrorPlayer *)0x0;
    if (((uVar16 != 0xffffffff) &&
        (puVar8 = puVar8 + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
      pCVar19 = *(CTerrorPlayer **)(puVar8 + 4);
    }
    piVar9 = (int *)BossZombiePlayerBot::ChooseVictim
                              ((BossZombiePlayerBot *)param_2,pCVar19,0,(CBaseCombatCharacter *)0x0)
    ;
    if (piVar9 == (int *)0x0) {
      *(undefined4 *)(param_1 + 0x34) = 0xffffffff;
      goto LAB_00acde49;
    }
    puVar10 = (uint *)(**(code **)(*piVar9 + 0xc))();
    puVar8 = g_pEntityList;
    uVar16 = *puVar10;
    *(uint *)(param_1 + 0x34) = uVar16;
  }
  else if (*(float *)(param_1 + 0x4854) <= 0.0) {
    uVar16 = *(uint *)((int)param_2 + 0x4324);
    if ((((uVar16 == 0xffffffff) ||
         (puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)) ||
        (*(uint *)(puVar8 + 8) != uVar16 >> 0xc)) ||
       ((*(int **)(puVar8 + 4) == (int *)0x0 ||
        (cVar3 = (**(code **)(**(int **)(puVar8 + 4) + 300))(), puVar8 = g_pEntityList,
        cVar3 == '\0')))) {
      puVar8 = g_pEntityList;
      param_1[0x4848] = (Spitter)0x0;
      *(undefined4 *)((int)param_2 + 0x4324) = 0xffffffff;
    }
    if (param_1[0x4848] == (Spitter)0x0) goto LAB_00acddaa;
    uVar16 = *(uint *)(param_1 + 0x34);
  }
  else {
    uVar16 = *(uint *)(param_1 + 0x34);
  }
  if ((((uVar16 == 0xffffffff) ||
       (puVar8 = puVar8 + (uVar16 & 0xfff) * 0x10, puVar8 == (undefined *)0xfffffffc)) ||
      (*(uint *)(puVar8 + 8) != uVar16 >> 0xc)) || (*(int **)(puVar8 + 4) == (int *)0x0))
  goto LAB_00acde49;
  puVar11 = (undefined4 *)(**(code **)(**(int **)(puVar8 + 4) + 0xc))();
  *(undefined4 *)((int)param_2 + 0x4324) = *puVar11;
  (**(code **)(*piVar5 + 0xc4))();
  if (param_1[0x4848] == (Spitter)0x0) {
    fVar17 = (float)((int)param_2 + 0x4028);
    local_34 = &PTR_operator___00d20e60;
    local_30 = fVar17;
    local_28 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
    pCVar12 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
    iVar13 = (**(code **)(*(int *)pCVar12 + 0x14c))();
    if (iVar13 == 0) {
      local_24 = 0x3f800000;
    }
    else {
      local_24 = *(undefined4 *)(iVar13 + 0x1cec);
    }
    cVar3 = (**(code **)(*(int *)pCVar12 + 0x16c))();
    local_2c = (CBaseEntity *)0x0;
    if (cVar3 != '\0') {
      local_2c = pCVar12;
    }
    iVar13 = CBaseEntity::GetTeamNumber(pCVar12);
    local_20 = 9;
    if (iVar13 == 3) {
      local_20 = (**(code **)(*(int *)pCVar12 + 0x544))();
    }
    uVar16 = *(uint *)(param_1 + 0x34);
    local_70 = 0.0;
    if (((uVar16 != 0xffffffff) &&
        (puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
      local_70 = *(float *)(puVar8 + 4);
    }
    pSVar1 = param_1 + 0x38;
    piVar9 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
    cVar3 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
    if (((cVar3 == '\0') && (cVar3 = (**(code **)(*piVar9 + 0xd4))(), cVar3 == '\0')) &&
       ((cVar3 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar3 == '\0' &&
        (cVar3 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar3 == '\0')))) {
      (**(code **)(*(int *)(param_1 + 0x38) + 0x90))();
      pfVar18 = (float *)&stack0xffffff50;
      local_4c = local_40;
      local_48 = local_3c;
      local_44 = local_38;
      pcVar2 = *(code **)(*piVar9 + 0x158);
      (**(code **)(*piVar9 + 300))();
      cVar3 = (*pcVar2)();
      if (cVar3 == '\0') {
LAB_00ace9fe:
        local_74 = &local_4c;
        pfVar18 = (float *)&stack0xffffff50;
        goto LAB_00ace0a8;
      }
      if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
        pVVar15 = (Vector *)(**(code **)(*piVar9 + 300))();
        cVar3 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar15,(Vector *)&local_40);
        if (cVar3 == '\0') goto LAB_00ace9fe;
      }
      (**(code **)(*piVar9 + 0x120))();
      (**(code **)(*piVar9 + 0xb4))();
      piVar9 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
      (**(code **)(*piVar9 + 0xc4))();
      (**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
      param_1[0x4844] = (Spitter)0x1;
    }
    else {
      local_74 = (int *)0x0;
      pfVar18 = (float *)&stack0xffffff54;
LAB_00ace0a8:
      local_54 = 0;
      local_50 = 0;
      if (_towlower == 0) {
        local_38 = 0;
      }
      else {
        *pfVar18 = (float)_towlower;
        pfVar18[1] = (float)&local_54;
        pfVar18[0xb] = (float)"ChasePath::Update";
        pfVar18[10] = (float)"NextBot";
        pfVar18[9] = (float)"(%s)%s";
        pfVar18[8] = (float)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::
                             tm_fmt;
        pfVar18[7] = 1.45735e-43;
        pfVar18[6] = (float)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
        pfVar18[5] = 0.0;
        pfVar18[3] = 0.0;
        pfVar18[4] = 0.0;
        pfVar18[2] = 0.0;
        pcVar2 = *(code **)(_towlower + 0x50);
        pfVar18[-1] = 1.5876465e-38;
        (*pcVar2)();
        local_38 = _towlower;
      }
      iVar13 = _DAT_0105db00;
      local_40 = local_54;
      local_3c = local_50;
      if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
                    /* try { // try from 00ace150 to 00ace154 has its CatchHandler @ 00acea40 */
        pfVar18[-1] = 1.5876539e-38;
        iVar14 = ThreadGetCurrentId();
        if (iVar13 == iVar14) {
          if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
            pfVar18[4] = 5.60519e-45;
            pfVar18[3] = (float)"NextBot";
            pfVar18[2] = 0.0;
            pfVar18[1] = (float)"ChasePath::Update";
            *pfVar18 = (float)_DAT_0105d15c;
                    /* try { // try from 00ace910 to 00ace933 has its CatchHandler @ 00acea40 */
            pfVar18[-1] = 1.587932e-38;
            _DAT_0105d15c =
                 (int *)CVProfNode::GetSubNode
                                  ((char *)*pfVar18,(int)pfVar18[1],(char *)pfVar18[2],
                                   (int)pfVar18[3]);
          }
          puVar10 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
          *puVar10 = *puVar10 | 4;
          *pfVar18 = (float)_DAT_0105d15c;
          pfVar18[-1] = 1.5879363e-38;
          CVProfNode::EnterScope();
          DAT_0105d158 = '\0';
        }
      }
      *pfVar18 = (float)pSVar1;
      pfVar18[4] = (float)local_74;
      pfVar18[3] = (float)&local_34;
      pfVar18[2] = local_70;
      pfVar18[1] = fVar17;
                    /* try { // try from 00ace17d to 00ace190 has its CatchHandler @ 00acea55 */
      pfVar18[-1] = 1.5876602e-38;
      ChasePath::RefreshPath
                ((ChasePath *)*pfVar18,(INextBot *)pfVar18[1],(CBaseEntity *)pfVar18[2],
                 (IPathCost *)pfVar18[3],(Vector *)pfVar18[4]);
      *pfVar18 = (float)pSVar1;
      pfVar18[1] = fVar17;
      pfVar18[-1] = 1.5876623e-38;
      PathFollower::Update((PathFollower *)*pfVar18,(INextBot *)pfVar18[1]);
      iVar13 = _DAT_0105db00;
      if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
        pfVar18[-1] = 1.5876668e-38;
        iVar14 = ThreadGetCurrentId();
        if (iVar13 == iVar14) {
          *pfVar18 = (float)_DAT_0105d15c;
          pfVar18[-1] = 1.5879398e-38;
          cVar3 = CVProfNode::ExitScope();
          if (cVar3 != '\0') {
            _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
          }
          DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
        }
      }
      if (local_38 != 0) {
        pfVar18[5] = 0.0;
        pfVar18[4] = 0.0;
        pfVar18[3] = 0.0;
        *pfVar18 = (float)local_38;
        pfVar18[1] = (float)local_40;
        pfVar18[2] = (float)local_3c;
        pcVar2 = *(code **)(local_38 + 0x54);
        pfVar18[-1] = 1.5876752e-38;
        (*pcVar2)();
      }
      iVar13 = *(int *)(param_1 + 0x38);
      *pfVar18 = (float)pSVar1;
      pcVar2 = *(code **)(iVar13 + 0x44);
      pfVar18[-1] = 1.5876765e-38;
      SVar4 = (Spitter)(*pcVar2)();
      param_1[0x4844] = SVar4;
    }
    *pfVar18 = (float)pSVar1;
    pfVar18[2] = local_70;
    pfVar18[1] = fVar17;
    pfVar18[-1] = 1.5876804e-38;
    DirectChasePath::NotifyVictim
              ((DirectChasePath *)*pfVar18,(INextBot *)pfVar18[1],(CBaseEntity *)pfVar18[2]);
    if (*(int *)(param_1 + 0x443c) < 1) {
      iVar13 = *(int *)param_2;
      *pfVar18 = param_2;
      pcVar2 = *(code **)(iVar13 + 0x9b0);
      pfVar18[-1] = 1.5878812e-38;
      piVar5 = (int *)(*pcVar2)();
      local_64 = 0;
      pcVar2 = *(code **)(*piVar5 + 0xb4);
      uVar16 = *(uint *)(param_1 + 0x34);
      if (((uVar16 != 0xffffffff) &&
          (puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
        local_64 = *(int *)(puVar8 + 4);
      }
      if ((*(byte *)(local_64 + 0x14d) & 8) != 0) {
        *pfVar18 = (float)local_64;
        pfVar18[-1] = 1.5879485e-38;
        CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*pfVar18);
      }
      pfVar18[2] = 1.0;
      *pfVar18 = (float)piVar5;
      pfVar18[1] = (float)(local_64 + 0x2e0);
      pfVar18[-1] = 1.5878969e-38;
      (*pcVar2)();
    }
    else {
      iVar13 = *piVar6;
      *pfVar18 = (float)piVar6;
      pcVar2 = *(code **)(iVar13 + 200);
      pfVar18[-1] = 1.5876843e-38;
      cVar3 = (*pcVar2)();
      if (cVar3 == '\0') {
        iVar13 = *piVar6;
        *pfVar18 = (float)piVar6;
        pcVar2 = *(code **)(iVar13 + 0x114);
        pfVar18[-1] = 1.5876874e-38;
        cVar3 = (*pcVar2)();
        if (cVar3 == '\0') {
          iVar13 = *piVar6;
          *pfVar18 = (float)piVar6;
          pcVar2 = *(code **)(iVar13 + 0xf8);
          pfVar18[-1] = 1.5876905e-38;
          cVar3 = (*pcVar2)();
          if (cVar3 != '\0') {
            iVar13 = *piVar5;
            pfVar18[1] = 1.4013e-44;
            *pfVar18 = (float)piVar5;
            pcVar2 = *(code **)(iVar13 + 0xe4);
            pfVar18[-1] = 1.5876947e-38;
            cVar3 = (*pcVar2)();
            if (cVar3 == '\0') {
              iVar13 = *piVar5;
              pfVar18[2] = 0.0;
              pfVar18[1] = 1.4013e-44;
              *pfVar18 = (float)piVar5;
              pcVar2 = *(code **)(iVar13 + 0xd8);
              pfVar18[-1] = 1.5876995e-38;
              (*pcVar2)();
            }
          }
        }
      }
    }
  }
  else if (*(float *)(param_1 + 0x4854) <= 0.0) {
    uVar16 = *(uint *)((int)param_2 + 0x4324);
    pCVar12 = (CBaseEntity *)0x0;
    if (((uVar16 != 0xffffffff) &&
        (puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
      pCVar12 = *(CBaseEntity **)(puVar8 + 4);
    }
    if (((byte)pCVar12[0x14d] & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition(pCVar12);
    }
    local_34 = *(undefined ***)(pCVar12 + 0x2e0);
    local_30 = *(float *)(pCVar12 + 0x2e4);
    local_2c = *(CBaseEntity **)(pCVar12 + 0x2e8);
    if ((*(byte *)((int)param_2 + 0x14d) & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_2);
    }
    local_2c = *(CBaseEntity **)((int)param_2 + 0x2e8);
    cVar3 = UTIL_IsFacingWithinTolerance
                      ((CBaseEntity *)param_2,(Vector *)&local_34,0.98,(float *)0x0);
    pfVar18 = (float *)&stack0xffffff54;
    if (((cVar3 != '\0') &&
        (cVar3 = CTerrorPlayer::IsCustomAbilityReadyToFire((CTerrorPlayer *)param_2),
        pfVar18 = (float *)&stack0xffffff54, cVar3 != '\0')) &&
       ((**(code **)(*(int *)param_2 + 0x938))(), pfVar18 = (float *)&stack0xffffff54,
       *(float *)(param_1 + 0x4854) <= 0.0)) {
      lVar20 = (longdouble)CountdownTimer::Now();
      if ((float)lVar20 + 1.0 != *(float *)(param_1 + 0x4854)) {
        (**(code **)(*(int *)(param_1 + 0x484c) + 4))();
        *(float *)(param_1 + 0x4854) = (float)lVar20 + 1.0;
      }
      pfVar18 = (float *)&stack0xffffff54;
      if (*(float *)(param_1 + 0x4850) != 1.0) {
        (**(code **)(*(int *)(param_1 + 0x484c) + 4))();
        *(undefined4 *)(param_1 + 0x4850) = 0x3f800000;
        pfVar18 = (float *)&stack0xffffff54;
      }
    }
  }
  else {
    lVar20 = (longdouble)CountdownTimer::Now();
    pfVar18 = (float *)&stack0xffffff54;
    if (*(float *)(param_1 + 0x4854) <= (float)lVar20) {
      if (*(float *)(param_1 + 0x4854) != -1.0) {
        (**(code **)(*(int *)(param_1 + 0x484c) + 4))();
        *(undefined4 *)(param_1 + 0x4854) = 0xbf800000;
      }
      param_1[0x4848] = (Spitter)0x0;
      pfVar18 = (float *)&stack0xffffff54;
    }
  }
  fVar17 = 0.0;
  pcVar2 = *(code **)(*piVar7 + 0xf8);
  uVar16 = *(uint *)(param_1 + 0x34);
  if (((uVar16 != 0xffffffff) &&
      (puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
    fVar17 = *(float *)(puVar8 + 4);
  }
  pfVar18[2] = 0.0;
  pfVar18[1] = fVar17;
  *pfVar18 = (float)piVar7;
  pfVar18[-1] = 1.5877236e-38;
  cVar3 = (*pcVar2)();
  if (cVar3 != '\0') {
    uVar16 = *(uint *)(param_1 + 0x34);
    fVar17 = 0.0;
    if (((uVar16 != 0xffffffff) &&
        (puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
      fVar17 = *(float *)(puVar8 + 4);
    }
    pfVar18[3] = 0.0;
    pfVar18[2] = 0.8;
    pfVar18[1] = fVar17;
    *pfVar18 = param_2;
    pfVar18[-1] = 1.5877353e-38;
    cVar3 = UTIL_IsFacingWithinTolerance
                      ((CBaseEntity *)*pfVar18,(CBaseEntity *)pfVar18[1],pfVar18[2],
                       (float *)pfVar18[3]);
    if ((cVar3 != '\0') && ((*(byte *)((int)param_2 + 0x150) & 1) != 0)) {
      *pfVar18 = param_2;
      pfVar18[-1] = 1.5877394e-38;
      cVar3 = CTerrorPlayer::IsCustomAbilityReadyToFire((CTerrorPlayer *)*pfVar18);
      if (cVar3 != '\0') {
        fVar17 = 0.0;
        pcVar2 = *(code **)(*(int *)((int)param_2 + 0x4028) + 300);
        uVar16 = *(uint *)(param_1 + 0x34);
        if (((uVar16 != 0xffffffff) &&
            (puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc))
           && (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
          fVar17 = *(float *)(puVar8 + 4);
        }
        pfVar18[1] = fVar17;
        *pfVar18 = (float)((int)param_2 + 0x4028);
        pfVar18[-1] = 1.5877524e-38;
        lVar20 = (longdouble)(*pcVar2)();
        if ((float)lVar20 <
            *(float *)(z_spitter_range._28_4_ + 0x2c) * *(float *)(z_spitter_range._28_4_ + 0x2c)) {
          iVar13 = *piVar6;
          *pfVar18 = (float)piVar6;
          pcVar2 = *(code **)(iVar13 + 0xe0);
          pfVar18[-1] = 1.5879085e-38;
          (*pcVar2)();
          param_1[0x4848] = (Spitter)0x1;
          goto LAB_00acde49;
        }
      }
      uVar16 = *(uint *)(param_1 + 0x34);
      fVar17 = 0.0;
      pcVar2 = *(code **)(*(int *)((int)param_2 + 0x4028) + 300);
      if (((uVar16 != 0xffffffff) &&
          (puVar8 = g_pEntityList + (uVar16 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar8 + 8) == uVar16 >> 0xc)) {
        fVar17 = *(float *)(puVar8 + 4);
      }
      pfVar18[1] = fVar17;
      *pfVar18 = (float)((int)param_2 + 0x4028);
      pfVar18[-1] = 1.5877667e-38;
      lVar20 = (longdouble)(*pcVar2)();
      if ((float)lVar20 < 1764.0) {
        iVar13 = *(int *)param_2;
        pfVar18[1] = -1.0;
        *pfVar18 = param_2;
        pcVar2 = *(code **)(iVar13 + 0x940);
        pfVar18[-1] = 1.5877729e-38;
        (*pcVar2)();
      }
    }
  }
LAB_00acde49:
  *(undefined4 *)this = 0;
  *(undefined4 *)(this + 4) = 0;
  *(undefined4 *)(this + 8) = 0;
  return;
}

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)