L L4D2node

SpitterAttack::Update

0x00ada210 · 4792 bytes · __thiscall

_ZN13SpitterAttack6UpdateEP7Spitterf

Decompiled

undefined (3 params)

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

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

{
  Spitter *pSVar1;
  code *pcVar2;
  char cVar3;
  Spitter SVar4;
  int *piVar5;
  int *piVar6;
  int *piVar7;
  uint uVar8;
  SpitterPrepareAmbush *pSVar9;
  uint *puVar10;
  undefined4 *puVar11;
  CBaseEntity *pCVar12;
  int iVar13;
  int iVar14;
  int iVar15;
  Vector *pVVar16;
  CTerrorPlayer *pCVar17;
  float fVar18;
  uint uVar19;
  undefined *puVar20;
  float *pfVar21;
  int *piVar22;
  longdouble lVar23;
  int *local_74;
  float local_70;
  int local_68;
  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;
  
  pfVar21 = (float *)&stack0xffffff54;
  piVar5 = (int *)(**(code **)(*(int *)param_2 + 0x9b4))();
  piVar6 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
  piVar7 = (int *)(**(code **)(*(int *)param_2 + 0x9bc))();
  if (((param_1[0x4848] != (Spitter)0x0) && (*(float *)(param_1 + 0x4854) <= 0.0)) &&
     (((uVar8 = *(uint *)((int)param_2 + 0x4324), uVar8 == 0xffffffff ||
       (((puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 == (undefined *)0xfffffffc ||
         (*(uint *)(puVar20 + 8) != uVar8 >> 0xc)) || (*(int **)(puVar20 + 4) == (int *)0x0)))) ||
      (cVar3 = (**(code **)(**(int **)(puVar20 + 4) + 300))(), cVar3 == '\0')))) {
    param_1[0x4848] = (Spitter)0x0;
    *(undefined4 *)((int)param_2 + 0x4324) = 0xffffffff;
  }
  (**(code **)(*(int *)param_2 + 0x99c))();
  if (param_1[0x4848] == (Spitter)0x0) {
    uVar8 = *(uint *)(param_1 + 0x34);
    pCVar17 = (CTerrorPlayer *)0x0;
    if (((uVar8 != 0xffffffff) &&
        (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
      pCVar17 = *(CTerrorPlayer **)(puVar20 + 4);
    }
    piVar22 = (int *)BossZombiePlayerBot::ChooseVictim
                               ((BossZombiePlayerBot *)param_2,pCVar17,0,(CBaseCombatCharacter *)0x0
                               );
    if (piVar22 == (int *)0x0) {
      *(undefined4 *)(param_1 + 0x34) = 0xffffffff;
      goto LAB_00ada2a7;
    }
    puVar10 = (uint *)(**(code **)(*piVar22 + 0xc))();
    uVar8 = *puVar10;
    *(uint *)(param_1 + 0x34) = uVar8;
  }
  else {
    uVar8 = *(uint *)(param_1 + 0x34);
  }
  if (uVar8 == 0xffffffff) {
LAB_00ada2a7:
    (**(code **)(*piVar6 + 0xe0))();
    pSVar9 = ::operator_new(0x481c);
                    /* try { // try from 00ada2c6 to 00ada2ca has its CatchHandler @ 00adb598 */
    SpitterPrepareAmbush::SpitterPrepareAmbush(pSVar9);
    *(undefined4 *)this = 1;
    *(SpitterPrepareAmbush **)(this + 4) = pSVar9;
    *(undefined4 *)(this + 8) = 0;
    return this;
  }
  uVar19 = uVar8 & 0xfff;
  piVar22 = (int *)(g_pEntityList + uVar19 * 0x10 + 4);
  if (((piVar22 == (int *)0x0) || (*(uint *)(g_pEntityList + uVar19 * 0x10 + 8) != uVar8 >> 0xc)) ||
     (*(int *)(g_pEntityList + uVar19 * 0x10 + 4) == 0)) goto LAB_00ada2a7;
  if (*(int *)(param_1 + 0x443c) < 1) {
LAB_00ada379:
    if ((int *)*piVar22 == (int *)0x0) goto LAB_00adabf2;
    puVar11 = (undefined4 *)(**(code **)(*(int *)*piVar22 + 0xc))();
    *(undefined4 *)((int)param_2 + 0x4324) = *puVar11;
  }
  else {
    piVar22 = (int *)(**(code **)(*(int *)param_2 + 0x9b0))();
    cVar3 = (**(code **)(*piVar22 + 0x114))();
    if (cVar3 != '\0') {
      iVar13 = (int)param_2 + 0x4028;
      local_34 = &PTR_operator___00d20e60;
      local_30 = (float)iVar13;
      local_28 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
      pCVar12 = (CBaseEntity *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xb4))();
      iVar15 = (**(code **)(*(int *)pCVar12 + 0x14c))();
      local_24 = 0x3f800000;
      if (iVar15 != 0) {
        local_24 = *(undefined4 *)(iVar15 + 0x1cec);
      }
      cVar3 = (**(code **)(*(int *)pCVar12 + 0x16c))();
      local_2c = (CBaseEntity *)0x0;
      if (cVar3 != '\0') {
        local_2c = pCVar12;
      }
      iVar15 = CBaseEntity::GetTeamNumber(pCVar12);
      local_20 = 9;
      if (iVar15 == 3) {
        local_20 = (**(code **)(*(int *)pCVar12 + 0x544))();
      }
      uVar8 = *(uint *)(param_1 + 0x34);
      local_64 = 0;
      if (((uVar8 != 0xffffffff) &&
          (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
        local_64 = *(int *)(puVar20 + 4);
      }
      pSVar1 = param_1 + 0x38;
      piVar5 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
      cVar3 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
      if (((cVar3 == '\0') && (cVar3 = (**(code **)(*piVar5 + 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))();
        piVar6 = (int *)&stack0xffffff50;
        local_4c = local_40;
        local_48 = local_3c;
        local_44 = local_38;
        pcVar2 = *(code **)(*piVar5 + 0x158);
        (**(code **)(*piVar5 + 300))();
        cVar3 = (*pcVar2)();
        if (cVar3 != '\0') {
          if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
            pVVar16 = (Vector *)(**(code **)(*piVar5 + 300))();
            cVar3 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar16,(Vector *)&local_40);
            if (cVar3 == '\0') goto LAB_00adb469;
          }
          (**(code **)(*piVar5 + 0x120))();
          (**(code **)(*piVar5 + 0xb4))();
          piVar5 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
          (**(code **)(*piVar5 + 0xc4))();
          (**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
          param_1[0x4844] = (Spitter)0x1;
          goto LAB_00ada9d4;
        }
LAB_00adb469:
        piVar5 = &local_4c;
        piVar6 = (int *)&stack0xffffff50;
      }
      else {
        piVar5 = (int *)0x0;
        piVar6 = (int *)&stack0xffffff54;
      }
      local_54 = 0;
      local_50 = 0;
      if (_towlower == 0) {
        local_38 = 0;
      }
      else {
        *piVar6 = _towlower;
        piVar6[1] = (int)&local_54;
        piVar6[0xb] = (int)"ChasePath::Update";
        piVar6[10] = (int)"NextBot";
        piVar6[9] = (int)"(%s)%s";
        piVar6[8] = (int)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::tm_fmt
        ;
        piVar6[7] = 0x68;
        piVar6[6] = (int)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
        piVar6[5] = 0;
        piVar6[3] = 0;
        piVar6[4] = 0;
        piVar6[2] = 0;
        pcVar2 = *(code **)(_towlower + 0x50);
        piVar6[-1] = 0xada900;
        (*pcVar2)();
        local_38 = _towlower;
      }
      iVar15 = _DAT_0105db00;
      local_40 = local_54;
      local_3c = local_50;
      if ((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) {
                    /* try { // try from 00ada92f to 00ada933 has its CatchHandler @ 00adb574 */
        piVar6[-1] = 0xada934;
        iVar14 = ThreadGetCurrentId();
        if (iVar15 == iVar14) {
          if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
            piVar6[4] = 4;
            piVar6[3] = (int)"NextBot";
            piVar6[2] = 0;
            piVar6[1] = (int)"ChasePath::Update";
            *piVar6 = (int)_DAT_0105d15c;
                    /* try { // try from 00adb340 to 00adb363 has its CatchHandler @ 00adb574 */
            piVar6[-1] = 0xadb345;
            _DAT_0105d15c =
                 (int *)CVProfNode::GetSubNode
                                  ((char *)*piVar6,piVar6[1],(char *)piVar6[2],piVar6[3]);
          }
          puVar10 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
          *puVar10 = *puVar10 | 4;
          *piVar6 = (int)_DAT_0105d15c;
          piVar6[-1] = 0xadb364;
          CVProfNode::EnterScope();
          DAT_0105d158 = '\0';
        }
      }
      piVar6[4] = (int)piVar5;
      piVar6[3] = (int)&local_34;
      piVar6[1] = iVar13;
      *piVar6 = (int)pSVar1;
      piVar6[2] = local_64;
                    /* try { // try from 00ada959 to 00ada969 has its CatchHandler @ 00adb588 */
      piVar6[-1] = 0xada95e;
      ChasePath::RefreshPath
                ((ChasePath *)*piVar6,(INextBot *)piVar6[1],(CBaseEntity *)piVar6[2],
                 (IPathCost *)piVar6[3],(Vector *)piVar6[4]);
      piVar6[1] = iVar13;
      *piVar6 = (int)pSVar1;
      piVar6[-1] = 0xada96a;
      PathFollower::Update((PathFollower *)*piVar6,(INextBot *)piVar6[1]);
      iVar15 = _DAT_0105db00;
      if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
        piVar6[-1] = 0xada987;
        iVar14 = ThreadGetCurrentId();
        if (iVar15 == iVar14) {
          *piVar6 = (int)_DAT_0105d15c;
          piVar6[-1] = 0xadb2ed;
          cVar3 = CVProfNode::ExitScope();
          if (cVar3 != '\0') {
            _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
          }
          DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
        }
      }
      if (local_38 != 0) {
        piVar6[5] = 0;
        piVar6[4] = 0;
        piVar6[3] = 0;
        *piVar6 = local_38;
        piVar6[1] = local_40;
        piVar6[2] = local_3c;
        pcVar2 = *(code **)(local_38 + 0x54);
        piVar6[-1] = 0xada9c2;
        (*pcVar2)();
      }
      iVar15 = *(int *)(param_1 + 0x38);
      *piVar6 = (int)pSVar1;
      pcVar2 = *(code **)(iVar15 + 0x44);
      piVar6[-1] = 0xada9ce;
      SVar4 = (Spitter)(*pcVar2)();
      param_1[0x4844] = SVar4;
LAB_00ada9d4:
      piVar6[1] = iVar13;
      piVar6[2] = local_64;
      *piVar6 = (int)pSVar1;
      piVar6[-1] = 0xada9ea;
      DirectChasePath::NotifyVictim
                ((DirectChasePath *)*piVar6,(INextBot *)piVar6[1],(CBaseEntity *)piVar6[2]);
      *(undefined4 *)this = 0;
      *(undefined4 *)(this + 4) = 0;
      *(undefined4 *)(this + 8) = 0;
      return this;
    }
    uVar8 = *(uint *)(param_1 + 0x34);
    if (((uVar8 != 0xffffffff) &&
        (piVar22 = (int *)(g_pEntityList + (uVar8 & 0xfff) * 0x10 + 4), piVar22 != (int *)0x0)) &&
       (piVar22[1] == uVar8 >> 0xc)) goto LAB_00ada379;
LAB_00adabf2:
    *(undefined4 *)((int)param_2 + 0x4324) = 0xffffffff;
  }
  (**(code **)(*piVar5 + 0xc4))();
  if (param_1[0x4848] == (Spitter)0x0) {
    fVar18 = (float)((int)param_2 + 0x4028);
    local_34 = &PTR_operator___00d20e60;
    local_30 = fVar18;
    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))();
    }
    uVar8 = *(uint *)(param_1 + 0x34);
    local_70 = 0.0;
    if (((uVar8 != 0xffffffff) &&
        (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
      local_70 = *(float *)(puVar20 + 4);
    }
    pSVar1 = param_1 + 0x38;
    piVar22 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc0))();
    cVar3 = (**(code **)(*(int *)((int)param_2 + 0x4028) + 0x104))();
    if (((cVar3 == '\0') && (cVar3 = (**(code **)(*piVar22 + 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))();
      pfVar21 = (float *)&stack0xffffff50;
      local_4c = local_40;
      local_48 = local_3c;
      local_44 = local_38;
      pcVar2 = *(code **)(*piVar22 + 0x158);
      (**(code **)(*piVar22 + 300))();
      cVar3 = (*pcVar2)();
      if (cVar3 == '\0') {
LAB_00adb50d:
        local_74 = &local_4c;
        pfVar21 = (float *)&stack0xffffff50;
        goto LAB_00ada521;
      }
      if (*(int *)(DirectChaseNavCheck._28_4_ + 0x30) != 0) {
        pVVar16 = (Vector *)(**(code **)(*piVar22 + 300))();
        cVar3 = CNavMesh::DoesRayStayWithinMesh(TheNavMesh,pVVar16,(Vector *)&local_40);
        if (cVar3 == '\0') goto LAB_00adb50d;
      }
      (**(code **)(*piVar22 + 0x120))();
      (**(code **)(*piVar22 + 0xb4))();
      piVar22 = (int *)(**(code **)(*(int *)((int)param_2 + 0x4028) + 0xc4))();
      (**(code **)(*piVar22 + 0xc4))();
      (**(code **)(*(int *)(param_1 + 0x38) + 0x48))();
      param_1[0x4844] = (Spitter)0x1;
    }
    else {
      local_74 = (int *)0x0;
      pfVar21 = (float *)&stack0xffffff54;
LAB_00ada521:
      local_54 = 0;
      local_50 = 0;
      if (_towlower == 0) {
        local_38 = 0;
      }
      else {
        *pfVar21 = (float)_towlower;
        pfVar21[1] = (float)&local_54;
        pfVar21[0xb] = (float)"ChasePath::Update";
        pfVar21[10] = (float)"NextBot";
        pfVar21[9] = (float)"(%s)%s";
        pfVar21[8] = (float)&ChasePath::Update(INextBot*,CBaseEntity*,IPathCost_const&,Vector*)::
                             tm_fmt;
        pfVar21[7] = 1.45735e-43;
        pfVar21[6] = (float)"/data/src/game/server/nextbot/path/nextbotchasepath.h";
        pfVar21[5] = 0.0;
        pfVar21[3] = 0.0;
        pfVar21[4] = 0.0;
        pfVar21[2] = 0.0;
        pcVar2 = *(code **)(_towlower + 0x50);
        pfVar21[-1] = 1.5946946e-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 00adadf8 to 00adae59 has its CatchHandler @ 00adb570 */
        pfVar21[-1] = 1.5949956e-38;
        iVar15 = ThreadGetCurrentId();
        if (iVar13 == iVar15) {
          if ((char *)*_DAT_0105d15c != "ChasePath::Update") {
            pfVar21[4] = 5.60519e-45;
            pfVar21[3] = (float)"NextBot";
            pfVar21[2] = 0.0;
            pfVar21[1] = (float)"ChasePath::Update";
            *pfVar21 = (float)_DAT_0105d15c;
            pfVar21[-1] = 1.5950043e-38;
            _DAT_0105d15c =
                 (int *)CVProfNode::GetSubNode
                                  ((char *)*pfVar21,(int)pfVar21[1],(char *)pfVar21[2],
                                   (int)pfVar21[3]);
          }
          puVar10 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
          *puVar10 = *puVar10 | 4;
          *pfVar21 = (float)_DAT_0105d15c;
          pfVar21[-1] = 1.5950086e-38;
          CVProfNode::EnterScope();
          DAT_0105d158 = '\0';
        }
      }
      *pfVar21 = (float)pSVar1;
      pfVar21[4] = (float)local_74;
      pfVar21[3] = (float)&local_34;
      pfVar21[2] = local_70;
      pfVar21[1] = fVar18;
                    /* try { // try from 00ada5e7 to 00ada5fa has its CatchHandler @ 00adb54f */
      pfVar21[-1] = 1.5947062e-38;
      ChasePath::RefreshPath
                ((ChasePath *)*pfVar21,(INextBot *)pfVar21[1],(CBaseEntity *)pfVar21[2],
                 (IPathCost *)pfVar21[3],(Vector *)pfVar21[4]);
      *pfVar21 = (float)pSVar1;
      pfVar21[1] = fVar18;
      pfVar21[-1] = 1.5947083e-38;
      PathFollower::Update((PathFollower *)*pfVar21,(INextBot *)pfVar21[1]);
      iVar13 = _DAT_0105db00;
      if ((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) {
        pfVar21[-1] = 1.5949855e-38;
        iVar15 = ThreadGetCurrentId();
        if (iVar13 == iVar15) {
          *pfVar21 = (float)_DAT_0105d15c;
          pfVar21[-1] = 1.5949886e-38;
          cVar3 = CVProfNode::ExitScope();
          if (cVar3 != '\0') {
            _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
          }
          DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
        }
      }
      if (local_38 != 0) {
        pfVar21[5] = 0.0;
        pfVar21[4] = 0.0;
        pfVar21[3] = 0.0;
        *pfVar21 = (float)local_38;
        pfVar21[1] = (float)local_40;
        pfVar21[2] = (float)local_3c;
        pcVar2 = *(code **)(local_38 + 0x54);
        pfVar21[-1] = 1.5947193e-38;
        (*pcVar2)();
      }
      iVar13 = *(int *)(param_1 + 0x38);
      *pfVar21 = (float)pSVar1;
      pcVar2 = *(code **)(iVar13 + 0x44);
      pfVar21[-1] = 1.5947205e-38;
      SVar4 = (Spitter)(*pcVar2)();
      param_1[0x4844] = SVar4;
    }
    *pfVar21 = (float)pSVar1;
    pfVar21[2] = local_70;
    pfVar21[1] = fVar18;
    pfVar21[-1] = 1.5947245e-38;
    DirectChasePath::NotifyVictim
              ((DirectChasePath *)*pfVar21,(INextBot *)pfVar21[1],(CBaseEntity *)pfVar21[2]);
    if (*(int *)(param_1 + 0x443c) < 1) {
      iVar13 = *(int *)param_2;
      *pfVar21 = param_2;
      pcVar2 = *(code **)(iVar13 + 0x9b0);
      pfVar21[-1] = 1.5951545e-38;
      piVar5 = (int *)(*pcVar2)();
      local_68 = 0;
      pcVar2 = *(code **)(*piVar5 + 0xb4);
      uVar8 = *(uint *)(param_1 + 0x34);
      if (((uVar8 != 0xffffffff) &&
          (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
        local_68 = *(int *)(puVar20 + 4);
      }
      if ((*(byte *)(local_68 + 0x14d) & 8) != 0) {
        *pfVar21 = (float)local_68;
        pfVar21[-1] = 1.5952173e-38;
        CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*pfVar21);
      }
      *pfVar21 = (float)piVar5;
      pfVar21[2] = 1.0;
      pfVar21[1] = (float)(local_68 + 0x2e0);
      pfVar21[-1] = 1.5951698e-38;
      (*pcVar2)();
    }
    else {
      iVar13 = *piVar6;
      *pfVar21 = (float)piVar6;
      pcVar2 = *(code **)(iVar13 + 200);
      pfVar21[-1] = 1.5947284e-38;
      cVar3 = (*pcVar2)();
      if (cVar3 == '\0') {
        iVar13 = *piVar6;
        *pfVar21 = (float)piVar6;
        pcVar2 = *(code **)(iVar13 + 0x114);
        pfVar21[-1] = 1.5947315e-38;
        cVar3 = (*pcVar2)();
        if (cVar3 == '\0') {
          iVar13 = *piVar6;
          *pfVar21 = (float)piVar6;
          pcVar2 = *(code **)(iVar13 + 0xf8);
          pfVar21[-1] = 1.5947345e-38;
          cVar3 = (*pcVar2)();
          if (cVar3 != '\0') {
            iVar13 = *piVar5;
            pfVar21[1] = 1.4013e-44;
            *pfVar21 = (float)piVar5;
            pcVar2 = *(code **)(iVar13 + 0xe4);
            pfVar21[-1] = 1.5947387e-38;
            cVar3 = (*pcVar2)();
            if (cVar3 == '\0') {
              iVar13 = *piVar5;
              pfVar21[2] = 0.0;
              pfVar21[1] = 1.4013e-44;
              *pfVar21 = (float)piVar5;
              pcVar2 = *(code **)(iVar13 + 0xd8);
              pfVar21[-1] = 1.5947441e-38;
              (*pcVar2)();
            }
          }
        }
      }
    }
  }
  else if (*(float *)(param_1 + 0x4854) <= 0.0) {
    uVar8 = *(uint *)((int)param_2 + 0x4324);
    pCVar12 = (CBaseEntity *)0x0;
    if (((uVar8 != 0xffffffff) &&
        (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
      pCVar12 = *(CBaseEntity **)(puVar20 + 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);
    pfVar21 = (float *)&stack0xffffff54;
    if (((cVar3 != '\0') &&
        (cVar3 = CTerrorPlayer::IsCustomAbilityReadyToFire((CTerrorPlayer *)param_2),
        pfVar21 = (float *)&stack0xffffff54, cVar3 != '\0')) &&
       ((**(code **)(*(int *)param_2 + 0x938))(), pfVar21 = (float *)&stack0xffffff54,
       *(float *)(param_1 + 0x4854) <= 0.0)) {
      lVar23 = (longdouble)CountdownTimer::Now();
      if ((float)lVar23 + 1.0 != *(float *)(param_1 + 0x4854)) {
        (**(code **)(*(int *)(param_1 + 0x484c) + 4))();
        *(float *)(param_1 + 0x4854) = (float)lVar23 + 1.0;
      }
      pfVar21 = (float *)&stack0xffffff54;
      if (*(float *)(param_1 + 0x4850) != 1.0) {
        (**(code **)(*(int *)(param_1 + 0x484c) + 4))();
        *(undefined4 *)(param_1 + 0x4850) = 0x3f800000;
        pfVar21 = (float *)&stack0xffffff54;
      }
    }
  }
  else {
    lVar23 = (longdouble)CountdownTimer::Now();
    if (*(float *)(param_1 + 0x4854) <= (float)lVar23) {
      iVar13 = RandomInt();
      if (iVar13 < 0x32) {
        pSVar9 = ::operator_new(0x481c);
                    /* try { // try from 00adb495 to 00adb499 has its CatchHandler @ 00adb576 */
        SpitterPrepareAmbush::SpitterPrepareAmbush(pSVar9);
        *(undefined4 *)this = 1;
        *(SpitterPrepareAmbush **)(this + 4) = pSVar9;
        *(char **)(this + 8) = "Done spitting";
        return this;
      }
      if (*(float *)(param_1 + 0x4854) != -1.0) {
        (**(code **)(*(int *)(param_1 + 0x484c) + 4))();
        *(undefined4 *)(param_1 + 0x4854) = 0xbf800000;
      }
      param_1[0x4848] = (Spitter)0x0;
      pfVar21 = (float *)&stack0xffffff54;
    }
  }
  fVar18 = 0.0;
  pcVar2 = *(code **)(*piVar7 + 0xf8);
  uVar8 = *(uint *)(param_1 + 0x34);
  if (((uVar8 != 0xffffffff) &&
      (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
    fVar18 = *(float *)(puVar20 + 4);
  }
  pfVar21[2] = 0.0;
  pfVar21[1] = fVar18;
  *pfVar21 = (float)piVar7;
  pfVar21[-1] = 1.5949442e-38;
  cVar3 = (*pcVar2)();
  if (cVar3 != '\0') {
    uVar8 = *(uint *)(param_1 + 0x34);
    fVar18 = 0.0;
    if (((uVar8 != 0xffffffff) &&
        (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
      fVar18 = *(float *)(puVar20 + 4);
    }
    pfVar21[3] = 0.0;
    pfVar21[2] = 0.8;
    pfVar21[1] = fVar18;
    *pfVar21 = param_2;
    pfVar21[-1] = 1.594956e-38;
    cVar3 = UTIL_IsFacingWithinTolerance
                      ((CBaseEntity *)*pfVar21,(CBaseEntity *)pfVar21[1],pfVar21[2],
                       (float *)pfVar21[3]);
    if ((cVar3 != '\0') && ((*(byte *)((int)param_2 + 0x150) & 1) != 0)) {
      *pfVar21 = param_2;
      pfVar21[-1] = 1.59496e-38;
      cVar3 = CTerrorPlayer::IsCustomAbilityReadyToFire((CTerrorPlayer *)*pfVar21);
      if (cVar3 != '\0') {
        fVar18 = 0.0;
        pcVar2 = *(code **)(*(int *)((int)param_2 + 0x4028) + 300);
        uVar8 = *(uint *)(param_1 + 0x34);
        if (((uVar8 != 0xffffffff) &&
            (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc))
           && (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
          fVar18 = *(float *)(puVar20 + 4);
        }
        pfVar21[1] = fVar18;
        *pfVar21 = (float)((int)param_2 + 0x4028);
        pfVar21[-1] = 1.5951446e-38;
        lVar23 = (longdouble)(*pcVar2)();
        if ((float)lVar23 <
            *(float *)(z_spitter_range._28_4_ + 0x2c) * *(float *)(z_spitter_range._28_4_ + 0x2c)) {
          iVar13 = *piVar6;
          *pfVar21 = (float)piVar6;
          pcVar2 = *(code **)(iVar13 + 0xe0);
          pfVar21[-1] = 1.5951509e-38;
          (*pcVar2)();
          param_1[0x4848] = (Spitter)0x1;
          goto LAB_00adad80;
        }
      }
      uVar8 = *(uint *)(param_1 + 0x34);
      fVar18 = 0.0;
      pcVar2 = *(code **)(*(int *)((int)param_2 + 0x4028) + 300);
      if (((uVar8 != 0xffffffff) &&
          (puVar20 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar20 != (undefined *)0xfffffffc)) &&
         (*(uint *)(puVar20 + 8) == uVar8 >> 0xc)) {
        fVar18 = *(float *)(puVar20 + 4);
      }
      pfVar21[1] = fVar18;
      *pfVar21 = (float)((int)param_2 + 0x4028);
      pfVar21[-1] = 1.5949723e-38;
      lVar23 = (longdouble)(*pcVar2)();
      if ((float)lVar23 < 1764.0) {
        iVar13 = *(int *)param_2;
        pfVar21[1] = -1.0;
        *pfVar21 = param_2;
        pcVar2 = *(code **)(iVar13 + 0x940);
        pfVar21[-1] = 1.594978e-38;
        (*pcVar2)();
      }
    }
  }
LAB_00adad80:
  *(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)