L L4D2node

TankAttack::Update

0x00ae1fc0 · 5712 bytes · __thiscall

_ZN10TankAttack6UpdateEP4Tankf

Decompiled

undefined (3 params)

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

TankAttack * __thiscall TankAttack::Update(TankAttack *this,Tank *param_1,float param_2)

{
  Tank *pTVar1;
  float fVar2;
  code *pcVar3;
  bool bVar4;
  char cVar5;
  Tank TVar6;
  int *piVar7;
  int *piVar8;
  uint *puVar9;
  CBaseEntity *pCVar10;
  int iVar11;
  int iVar12;
  float *pfVar13;
  undefined **ppuVar14;
  uint uVar15;
  Vector *pVVar16;
  uint uVar17;
  undefined *puVar18;
  float *pfVar19;
  CTerrorPlayer *pCVar20;
  longdouble lVar21;
  float fVar22;
  float fVar23;
  float *local_a8;
  float local_a4;
  float local_9c;
  float local_98;
  float local_94;
  float local_90;
  float local_8c;
  float local_88;
  float local_84;
  float local_80;
  undefined **local_7c;
  float local_78;
  CBaseEntity *local_74;
  undefined4 local_70;
  undefined4 local_6c;
  undefined4 local_68;
  
  piVar7 = (int *)(**(code **)(*(int *)param_2 + 0x9b4))();
  if (*(int *)(TankStuckFailsafe._28_4_ + 0x30) != 0) {
    CMultiPlayerAnimState::GetMainActivity(*(CMultiPlayerAnimState **)((int)param_2 + 0x2910));
    cVar5 = CTerrorPlayer::IsMotionControlledXY();
    if (cVar5 == '\0') {
      CMultiPlayerAnimState::GetMainActivity(*(CMultiPlayerAnimState **)((int)param_2 + 0x2910));
      cVar5 = CTerrorPlayer::IsMotionControlledZ();
      if (cVar5 != '\0') goto LAB_00ae2015;
    }
    else {
LAB_00ae2015:
      piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
      (**(code **)(*piVar8 + 0x170))();
      if (*(float *)(param_1 + 0x486c) != -1.0) {
        (**(code **)(*(int *)(param_1 + 0x4868) + 4))();
        *(undefined4 *)(param_1 + 0x486c) = 0xbf800000;
      }
    }
    cVar5 = (**(code **)(*(int *)param_2 + 0xa0))();
    if (cVar5 == '\0') {
LAB_00ae2066:
      bVar4 = false;
    }
    else {
      piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
      (**(code **)(*piVar8 + 0x170))();
      if (*(float *)(param_1 + 0x486c) != -1.0) {
        (**(code **)(*(int *)(param_1 + 0x4868) + 4))();
        *(undefined4 *)(param_1 + 0x486c) = 0xbf800000;
      }
      if (*(float *)(param_1 + 0x4874) <= 0.0) {
        lVar21 = (longdouble)IntervalTimer::Now();
        if ((float)lVar21 != *(float *)(param_1 + 0x4874)) {
          (**(code **)(*(int *)(param_1 + 0x4870) + 4))();
          *(float *)(param_1 + 0x4874) = (float)lVar21;
        }
        goto LAB_00ae2066;
      }
      lVar21 = (longdouble)IntervalTimer::Now();
      fVar23 = (float)lVar21 - *(float *)(param_1 + 0x4874);
      if (fVar23 < *(float *)(TankStasisTimeSuicide._28_4_ + 0x2c) ||
          fVar23 == *(float *)(TankStasisTimeSuicide._28_4_ + 0x2c)) goto LAB_00ae2066;
      if (*(float *)(param_1 + 0x4874) == -1.0) {
        bVar4 = true;
      }
      else {
        bVar4 = true;
        (**(code **)(*(int *)(param_1 + 0x4870) + 4))();
        *(undefined4 *)(param_1 + 0x4874) = 0xbf800000;
      }
    }
    piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9bc))();
    lVar21 = (longdouble)(**(code **)(*piVar8 + 0xb8))();
    fVar23 = (float)lVar21;
    if (*(float *)(param_1 + 0x486c) <= 0.0) {
LAB_00ae2186:
      if (fVar23 != 3.4028235e+38) goto LAB_00ae219b;
    }
    else {
      lVar21 = (longdouble)IntervalTimer::Now();
      fVar2 = *(float *)(param_1 + 0x486c);
      if ((*(float *)(TankStuckTimeChooseNewTarget._28_4_ + 0x2c) <= (float)lVar21 - fVar2 &&
           (float)lVar21 - fVar2 != *(float *)(TankStuckTimeChooseNewTarget._28_4_ + 0x2c)) &&
         (fVar23 < *(float *)(TankStuckVisibilityToleranceChooseNewTarget._28_4_ + 0x2c))) {
        if (fVar2 != -1.0) {
          (**(code **)(*(int *)(param_1 + 0x4868) + 4))();
          *(undefined4 *)(param_1 + 0x486c) = 0xbf800000;
        }
        if (*(float *)(param_1 + 0x482c) != -1.0) {
          (**(code **)(*(int *)(param_1 + 0x4824) + 4))();
          *(undefined4 *)(param_1 + 0x482c) = 0xbf800000;
        }
        if (*(float *)(param_1 + 0x4838) != -1.0) {
          (**(code **)(*(int *)(param_1 + 0x4830) + 4))();
          *(undefined4 *)(param_1 + 0x4838) = 0xbf800000;
        }
        PathFollower::Invalidate((PathFollower *)(param_1 + 0x38));
        *(undefined4 *)(param_1 + 0x34) = 0xffffffff;
        goto LAB_00ae2186;
      }
      fVar22 = 99999.9;
      if (0.0 < fVar2) {
        lVar21 = (longdouble)IntervalTimer::Now();
        fVar22 = (float)lVar21 - *(float *)(param_1 + 0x486c);
      }
      if (fVar22 < *(float *)(TankStuckTimeTimeSuicide._28_4_ + 0x2c) ||
          fVar22 == *(float *)(TankStuckTimeTimeSuicide._28_4_ + 0x2c)) goto LAB_00ae2186;
      if (fVar23 == 3.4028235e+38) goto LAB_00ae21b2;
      if (*(float *)(TankStuckVisibilityToleranceSuicide._28_4_ + 0x2c) <= fVar23 &&
          fVar23 != *(float *)(TankStuckVisibilityToleranceSuicide._28_4_ + 0x2c)) {
        bVar4 = true;
      }
LAB_00ae219b:
      if (*(float *)(TankVisibilityToleranceSuicide._28_4_ + 0x2c) <= fVar23 &&
          fVar23 != *(float *)(TankVisibilityToleranceSuicide._28_4_ + 0x2c)) goto LAB_00ae21b2;
    }
    if (bVar4) {
LAB_00ae21b2:
      Tank::LeaveStasis((Tank *)param_2);
      if ((*(byte *)((int)param_2 + 0x14d) & 8) != 0) {
        CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_2);
      }
      Msg();
      CTakeDamageInfo::CTakeDamageInfo
                ((CTakeDamageInfo *)&local_7c,(CBaseEntity *)param_2,(CBaseEntity *)param_2,
                 (float)*(int *)((int)param_2 + 0x100),2,0);
      CBaseEntity::TakeDamage((CBaseEntity *)param_2,(CTakeDamageInfo *)&local_7c);
      if (*(float *)(param_1 + 0x486c) != -1.0) {
        (**(code **)(*(int *)(param_1 + 0x4868) + 4))();
        *(undefined4 *)(param_1 + 0x486c) = 0xbf800000;
      }
      *(undefined4 *)this = 3;
      *(undefined4 *)(this + 4) = 0;
      *(char **)(this + 8) = "Killing self";
      return this;
    }
  }
  cVar5 = (**(code **)(*(int *)param_2 + 0xa0))();
  if (cVar5 != '\0') goto LAB_00ae22c9;
  piVar8 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
  cVar5 = (**(code **)(*piVar8 + 0x114))();
  uVar15 = *(uint *)(param_1 + 0x34);
  if (cVar5 == '\0') {
    if ((uVar15 != 0xffffffff) &&
       (piVar8 = (int *)(g_pEntityList + (uVar15 & 0xfff) * 0x10 + 4), piVar8 != (int *)0x0)) {
LAB_00ae2343:
      if ((piVar8[1] == uVar15 >> 0xc) && (*piVar8 != 0)) {
        iVar11 = (**(code **)(*(int *)param_2 + 0x9a0))();
        iVar11 = CMultiPlayerAnimState::GetMainActivity
                           (*(CMultiPlayerAnimState **)(iVar11 + 0x2910));
        if (iVar11 != 0x31a) {
          iVar11 = (**(code **)(*(int *)param_2 + 0x9a0))();
          iVar11 = CMultiPlayerAnimState::GetMainActivity
                             (*(CMultiPlayerAnimState **)(iVar11 + 0x2910));
          if (iVar11 != 0x31b) goto LAB_00ae2351;
        }
        pCVar10 = (CBaseEntity *)0x0;
        pfVar13 = (float *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xd4))();
        uVar15 = *(uint *)(param_1 + 0x34);
        if (((uVar15 != 0xffffffff) &&
            (puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc))
           && (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
          pCVar10 = *(CBaseEntity **)(puVar18 + 4);
        }
        if (((byte)pCVar10[0x14d] & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition(pCVar10);
        }
        local_88 = *(float *)(pCVar10 + 0x2e0) - *pfVar13;
        local_84 = *(float *)(pCVar10 + 0x2e4) - pfVar13[1];
        local_80 = *(float *)(pCVar10 + 0x2e8) - pfVar13[2];
        VectorAngles((Vector *)&local_88,(QAngle *)&local_7c);
        pCVar10 = (CBaseEntity *)(**(code **)(*(int *)param_2 + 0x9a0))();
        CBaseEntity::SetAbsAngles(pCVar10,(QAngle *)&local_7c);
      }
    }
  }
  else if (uVar15 != 0xffffffff) {
    uVar17 = uVar15 & 0xfff;
    piVar8 = (int *)(g_pEntityList + uVar17 * 0x10 + 4);
    if (piVar8 != (int *)0x0) {
      if (((*(uint *)(g_pEntityList + uVar17 * 0x10 + 8) != uVar15 >> 0xc) ||
          (*(int *)(g_pEntityList + uVar17 * 0x10 + 4) == 0)) || (*(int *)(param_1 + 0x443c) < 1))
      goto LAB_00ae2343;
      fVar23 = (float)((int)param_2 + 0x4028);
      local_7c = &PTR_operator___00d20e60;
      local_78 = fVar23;
      local_70 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
      pCVar10 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
      iVar11 = (**(code **)(*(int *)pCVar10 + 0x14c))();
      local_6c = 0x3f800000;
      if (iVar11 != 0) {
        local_6c = *(undefined4 *)(iVar11 + 0x1cec);
      }
      cVar5 = (**(code **)(*(int *)pCVar10 + 0x16c))();
      local_74 = (CBaseEntity *)0x0;
      if (cVar5 != '\0') {
        local_74 = pCVar10;
      }
      iVar11 = CBaseEntity::GetTeamNumber(pCVar10);
      local_68 = 9;
      if (iVar11 == 3) {
        local_68 = (**(code **)(*(int *)pCVar10 + 0x544))();
      }
      uVar15 = *(uint *)(param_1 + 0x34);
      local_a4 = 0.0;
      if (((uVar15 != 0xffffffff) &&
          (puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc))
         && (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
        local_a4 = *(float *)(puVar18 + 4);
      }
      pTVar1 = param_1 + 0x38;
      piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
      cVar5 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
      if (((cVar5 == '\0') && (cVar5 = (**(code **)(*piVar7 + 0xd4))(), cVar5 == '\0')) &&
         ((cVar5 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar5 == '\0' &&
          (cVar5 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar5 == '\0')))) {
        (**(code **)(*(int *)(param_1 + 0x38) + 0x90))();
        pfVar19 = (float *)&stack0xffffff10;
        local_94 = local_88;
        local_90 = local_84;
        local_8c = local_80;
        pcVar3 = *(code **)(*piVar7 + 0x158);
        (**(code **)(*piVar7 + 300))();
        cVar5 = (*pcVar3)();
        if (cVar5 == '\0') {
LAB_00ae3537:
          pfVar13 = &local_94;
          pfVar19 = (float *)&stack0xffffff10;
          goto LAB_00ae2cf1;
        }
        if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
          pVVar16 = (Vector *)(**(code **)(*piVar7 + 300))();
          cVar5 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar16,(Vector *)&local_88);
          if (cVar5 == '\0') goto LAB_00ae3537;
        }
        (**(code **)(*piVar7 + 0x120))();
        (**(code **)(*piVar7 + 0xb4))();
        piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
        (**(code **)(*piVar7 + 0xc4))();
        (**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
        param_1[0x4844] = (Tank)0x1;
      }
      else {
        pfVar13 = (float *)0x0;
        pfVar19 = (float *)&stack0xffffff14;
LAB_00ae2cf1:
        local_9c = 0.0;
        local_98 = 0.0;
        if (_towlower == 0.0) {
          local_80 = 0.0;
        }
        else {
          *pfVar19 = _towlower;
          pfVar19[1] = (float)&local_9c;
          pfVar19[0xb] = (float)"ChasePath::Update";
          pfVar19[10] = (float)"NextBot";
          pfVar19[9] = (float)"(%s)%s";
          pfVar19[8] = (float)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::
                               tm_fmt;
          pfVar19[7] = 1.45735e-43;
          pfVar19[6] = (float)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
          pfVar19[5] = 0.0;
          pfVar19[3] = 0.0;
          pfVar19[4] = 0.0;
          pfVar19[2] = 0.0;
          pcVar3 = *(code **)((int)_towlower + 0x50);
          pfVar19[-1] = 1.5995679e-38;
          (*pcVar3)();
          local_80 = _towlower;
        }
        iVar11 = _DAT_0105db00;
        local_88 = local_9c;
        local_84 = local_98;
        if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
                    /* try { // try from 00ae2dad to 00ae2db1 has its CatchHandler @ 00ae36d0 */
          pfVar19[-1] = 1.5995769e-38;
          iVar12 = ThreadGetCurrentId();
          if (iVar11 == iVar12) {
            if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
              pfVar19[4] = 5.60519e-45;
              pfVar19[3] = (float)"NextBot";
              pfVar19[2] = 0.0;
              pfVar19[1] = (float)"ChasePath::Update";
              *pfVar19 = (float)_DAT_0105d15c;
                    /* try { // try from 00ae31a0 to 00ae31c3 has its CatchHandler @ 00ae36d0 */
              pfVar19[-1] = 1.5997185e-38;
              _DAT_0105d15c =
                   (int *)CVProfNode::GetSubNode
                                    ((char *)*pfVar19,(int)pfVar19[1],(char *)pfVar19[2],
                                     (int)pfVar19[3]);
            }
            puVar9 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
            *puVar9 = *puVar9 | 4;
            *pfVar19 = (float)_DAT_0105d15c;
            pfVar19[-1] = 1.5997229e-38;
            CVProfNode::EnterScope();
            DAT_0105d158 = '\0';
          }
        }
        pfVar19[4] = (float)pfVar13;
        pfVar19[3] = (float)&local_7c;
        pfVar19[1] = fVar23;
        *pfVar19 = (float)pTVar1;
        pfVar19[2] = local_a4;
                    /* try { // try from 00ae2de0 to 00ae2df0 has its CatchHandler @ 00ae36c0 */
        pfVar19[-1] = 1.599584e-38;
        ChasePath::RefreshPath
                  ((ChasePath *)*pfVar19,(INextBot *)pfVar19[1],(CBaseEntity *)pfVar19[2],
                   (IPathCost *)pfVar19[3],(Vector *)pfVar19[4]);
        pfVar19[1] = fVar23;
        *pfVar19 = (float)pTVar1;
        pfVar19[-1] = 1.5995857e-38;
        PathFollower::Update((PathFollower *)*pfVar19,(INextBot *)pfVar19[1]);
        iVar11 = _DAT_0105db00;
        if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
          pfVar19[-1] = 1.5995898e-38;
          iVar12 = ThreadGetCurrentId();
          if (iVar11 == iVar12) {
            *pfVar19 = (float)_DAT_0105d15c;
            pfVar19[-1] = 1.5997051e-38;
            cVar5 = CVProfNode::ExitScope();
            if (cVar5 != '\0') {
              _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
            }
            DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
          }
        }
        if (local_80 != 0.0) {
          pfVar19[5] = 0.0;
          pfVar19[4] = 0.0;
          pfVar19[3] = 0.0;
          *pfVar19 = local_80;
          pfVar19[1] = local_88;
          pfVar19[2] = local_84;
          pcVar3 = *(code **)((int)local_80 + 0x54);
          pfVar19[-1] = 1.5995985e-38;
          (*pcVar3)();
        }
        iVar11 = *(int *)(param_1 + 0x38);
        *pfVar19 = (float)pTVar1;
        pcVar3 = *(code **)(iVar11 + 0x44);
        pfVar19[-1] = 1.5996006e-38;
        TVar6 = (Tank)(*pcVar3)();
        param_1[0x4844] = TVar6;
      }
      pfVar19[1] = fVar23;
      pfVar19[2] = local_a4;
      *pfVar19 = (float)pTVar1;
      pfVar19[-1] = 1.5996053e-38;
      DirectChasePath::NotifyVictim
                ((DirectChasePath *)*pfVar19,(INextBot *)pfVar19[1],(CBaseEntity *)pfVar19[2]);
      goto LAB_00ae22c9;
    }
  }
LAB_00ae2351:
  uVar15 = *(uint *)((int)param_2 + 0x30bc);
  if ((((uVar15 == 0xffffffff) ||
       (puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc)) ||
      (*(uint *)(puVar18 + 8) != uVar15 >> 0xc)) ||
     ((*(int **)(puVar18 + 4) == (int *)0x0 ||
      (cVar5 = (**(code **)(**(int **)(puVar18 + 4) + 0x354))(), cVar5 == '\0')))) {
    local_7c = (undefined **)0x0;
    ForEachSurvivor<MinigunnerScan>((MinigunnerScan *)&local_7c);
    ppuVar14 = local_7c;
    if (local_7c == (undefined **)0x0) {
      uVar15 = *(uint *)(param_1 + 0x34);
      pCVar20 = (CTerrorPlayer *)0x0;
      if (((uVar15 != 0xffffffff) &&
          (puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc))
         && (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
        pCVar20 = *(CTerrorPlayer **)(puVar18 + 4);
      }
      ppuVar14 = (undefined **)
                 BossZombiePlayerBot::ChooseVictim
                           ((BossZombiePlayerBot *)param_2,pCVar20,4,(CBaseCombatCharacter *)0x0);
      if (ppuVar14 == (undefined **)0x0) {
        *(undefined4 *)(param_1 + 0x34) = 0xffffffff;
        uVar15 = 0xffffffff;
        goto LAB_00ae23a6;
      }
    }
    puVar9 = (uint *)(**(code **)(*ppuVar14 + 0xc))();
    uVar15 = *puVar9;
    *(uint *)(param_1 + 0x34) = uVar15;
  }
  else {
    uVar15 = *(uint *)(param_1 + 0x34);
  }
LAB_00ae23a6:
  if ((((uVar15 == 0xffffffff) ||
       (puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 == (undefined *)0xfffffffc)) ||
      (*(uint *)(puVar18 + 8) != uVar15 >> 0xc)) ||
     ((*(int **)(puVar18 + 4) == (int *)0x0 ||
      (cVar5 = (**(code **)(**(int **)(puVar18 + 4) + 300))(), cVar5 == '\0')))) goto LAB_00ae22c9;
  TryToThrowRock((TankAttack *)param_1,(Tank *)param_2);
  (**(code **)(*piVar7 + 0xc4))();
  fVar23 = (float)((int)param_2 + 0x4028);
  cVar5 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x11c))();
  if (cVar5 == '\0') {
    pCVar10 = (CBaseEntity *)0x0;
    piVar7 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
    pcVar3 = *(code **)(*piVar7 + 0x158);
    uVar15 = *(uint *)(param_1 + 0x34);
    if (((uVar15 != 0xffffffff) &&
        (puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
      pCVar10 = *(CBaseEntity **)(puVar18 + 4);
    }
    if (((byte)pCVar10[0x14d] & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition(pCVar10);
    }
    if ((*(byte *)((int)param_2 + 0x14d) & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_2);
    }
    cVar5 = (*pcVar3)();
    if (cVar5 != '\0') goto LAB_00ae22c9;
  }
  local_7c = &PTR_operator___00d20e60;
  local_78 = fVar23;
  local_70 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
  pCVar10 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
  iVar11 = (**(code **)(*(int *)pCVar10 + 0x14c))();
  local_6c = 0x3f800000;
  if (iVar11 != 0) {
    local_6c = *(undefined4 *)(iVar11 + 0x1cec);
  }
  cVar5 = (**(code **)(*(int *)pCVar10 + 0x16c))();
  local_74 = (CBaseEntity *)0x0;
  if (cVar5 != '\0') {
    local_74 = pCVar10;
  }
  iVar11 = CBaseEntity::GetTeamNumber(pCVar10);
  local_68 = 9;
  if (iVar11 == 3) {
    local_68 = (**(code **)(*(int *)pCVar10 + 0x544))();
  }
  uVar15 = *(uint *)(param_1 + 0x34);
  local_a4 = 0.0;
  if (((uVar15 != 0xffffffff) &&
      (puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
    local_a4 = *(float *)(puVar18 + 4);
  }
  pTVar1 = param_1 + 0x38;
  piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
  cVar5 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
  if (((cVar5 == '\0') && (cVar5 = (**(code **)(*piVar7 + 0xd4))(), cVar5 == '\0')) &&
     ((cVar5 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar5 == '\0' &&
      (cVar5 = (**(code **)(*(int *)(param_1 + 0x38) + 0x80))(), cVar5 == '\0')))) {
    (**(code **)(*(int *)(param_1 + 0x38) + 0x90))();
    pfVar13 = (float *)&stack0xffffff10;
    local_94 = local_88;
    local_90 = local_84;
    local_8c = local_80;
    pcVar3 = *(code **)(*piVar7 + 0x158);
    (**(code **)(*piVar7 + 300))();
    cVar5 = (*pcVar3)();
    if (cVar5 == '\0') {
LAB_00ae367f:
      local_a8 = &local_94;
      pfVar13 = (float *)&stack0xffffff10;
      goto LAB_00ae25fb;
    }
    if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
      pVVar16 = (Vector *)(**(code **)(*piVar7 + 300))();
      cVar5 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar16,(Vector *)&local_88);
      if (cVar5 == '\0') goto LAB_00ae367f;
    }
    (**(code **)(*piVar7 + 0x120))();
    (**(code **)(*piVar7 + 0xb4))();
    piVar7 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
    (**(code **)(*piVar7 + 0xc4))();
    (**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
    param_1[0x4844] = (Tank)0x1;
  }
  else {
    local_a8 = (float *)0x0;
    pfVar13 = (float *)&stack0xffffff14;
LAB_00ae25fb:
    local_9c = 0.0;
    local_98 = 0.0;
    if (_towlower == 0.0) {
      local_80 = 0.0;
    }
    else {
      *pfVar13 = _towlower;
      pfVar13[1] = (float)&local_9c;
      pfVar13[0xb] = (float)"ChasePath::Update";
      pfVar13[10] = (float)"NextBot";
      pfVar13[9] = (float)"(%s)%s";
      pfVar13[8] = (float)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::
                           tm_fmt;
      pfVar13[7] = 1.45735e-43;
      pfVar13[6] = (float)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
      pfVar13[5] = 0.0;
      pfVar13[3] = 0.0;
      pfVar13[4] = 0.0;
      pfVar13[2] = 0.0;
      pcVar3 = *(code **)((int)_towlower + 0x50);
      pfVar13[-1] = 1.5993182e-38;
      (*pcVar3)();
      local_80 = _towlower;
    }
    iVar11 = _DAT_0105db00;
    local_88 = local_9c;
    local_84 = local_98;
    if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
                    /* try { // try from 00ae26b7 to 00ae26bb has its CatchHandler @ 00ae3698 */
      pfVar13[-1] = 1.5993272e-38;
      iVar12 = ThreadGetCurrentId();
      if (iVar11 == iVar12) {
        if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
          pfVar13[4] = 5.60519e-45;
          pfVar13[3] = (float)"NextBot";
          pfVar13[2] = 0.0;
          pfVar13[1] = (float)"ChasePath::Update";
          *pfVar13 = (float)_DAT_0105d15c;
                    /* try { // try from 00ae35ec to 00ae360f has its CatchHandler @ 00ae3698 */
          pfVar13[-1] = 1.5998727e-38;
          _DAT_0105d15c =
               (int *)CVProfNode::GetSubNode
                                ((char *)*pfVar13,(int)pfVar13[1],(char *)pfVar13[2],(int)pfVar13[3]
                                );
        }
        puVar9 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
        *puVar9 = *puVar9 | 4;
        *pfVar13 = (float)_DAT_0105d15c;
        pfVar13[-1] = 1.599877e-38;
        CVProfNode::EnterScope();
        DAT_0105d158 = '\0';
      }
    }
    *pfVar13 = (float)pTVar1;
    pfVar13[4] = (float)local_a8;
    pfVar13[3] = (float)&local_7c;
    pfVar13[2] = local_a4;
    pfVar13[1] = fVar23;
                    /* try { // try from 00ae26f0 to 00ae2706 has its CatchHandler @ 00ae36b0 */
    pfVar13[-1] = 1.5993351e-38;
    ChasePath::RefreshPath
              ((ChasePath *)*pfVar13,(INextBot *)pfVar13[1],(CBaseEntity *)pfVar13[2],
               (IPathCost *)pfVar13[3],(Vector *)pfVar13[4]);
    *pfVar13 = (float)pTVar1;
    pfVar13[1] = fVar23;
    pfVar13[-1] = 1.5993377e-38;
    PathFollower::Update((PathFollower *)*pfVar13,(INextBot *)pfVar13[1]);
    iVar11 = _DAT_0105db00;
    if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
      pfVar13[-1] = 1.5993424e-38;
      iVar12 = ThreadGetCurrentId();
      if (iVar11 == iVar12) {
        *pfVar13 = (float)_DAT_0105d15c;
        pfVar13[-1] = 1.5998605e-38;
        cVar5 = CVProfNode::ExitScope();
        if (cVar5 != '\0') {
          _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
        }
        DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
      }
    }
    if (local_80 != 0.0) {
      pfVar13[5] = 0.0;
      pfVar13[4] = 0.0;
      pfVar13[3] = 0.0;
      *pfVar13 = local_80;
      pfVar13[1] = local_88;
      pfVar13[2] = local_84;
      pcVar3 = *(code **)((int)local_80 + 0x54);
      pfVar13[-1] = 1.5993517e-38;
      (*pcVar3)();
    }
    iVar11 = *(int *)(param_1 + 0x38);
    *pfVar13 = (float)pTVar1;
    pcVar3 = *(code **)(iVar11 + 0x44);
    pfVar13[-1] = 1.599353e-38;
    TVar6 = (Tank)(*pcVar3)();
    param_1[0x4844] = TVar6;
  }
  *pfVar13 = (float)pTVar1;
  pfVar13[2] = local_a4;
  pfVar13[1] = fVar23;
  pfVar13[-1] = 1.5993577e-38;
  DirectChasePath::NotifyVictim
            ((DirectChasePath *)*pfVar13,(INextBot *)pfVar13[1],(CBaseEntity *)pfVar13[2]);
  if (*(int *)(param_1 + 0x443c) < 1) {
    iVar11 = *(int *)param_2;
    *pfVar13 = param_2;
    iVar12 = 0;
    pcVar3 = *(code **)(iVar11 + 0x9b0);
    pfVar13[-1] = 1.5993615e-38;
    piVar7 = (int *)(*pcVar3)();
    pcVar3 = *(code **)(*piVar7 + 0xb4);
    uVar15 = *(uint *)(param_1 + 0x34);
    if (((uVar15 != 0xffffffff) &&
        (puVar18 = g_pEntityList + (uVar15 & 0xfff) * 0x10, puVar18 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar18 + 8) == uVar15 >> 0xc)) {
      iVar12 = *(int *)(puVar18 + 4);
    }
    if ((*(byte *)(iVar12 + 0x14d) & 8) != 0) {
      *pfVar13 = (float)iVar12;
      pfVar13[-1] = 1.5998838e-38;
      CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*pfVar13);
    }
    *pfVar13 = (float)piVar7;
    pfVar13[2] = 1.0;
    pfVar13[1] = (float)(iVar12 + 0x2e0);
    pfVar13[-1] = 1.5993758e-38;
    (*pcVar3)();
  }
LAB_00ae22c9:
  *(undefined4 *)this = 0;
  *(undefined4 *)(this + 4) = 0;
  *(undefined4 *)(this + 8) = 0;
  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)