L L4D2node

ZombieManager::ChooseMobSpawnAreas

0x00a607d0 · 3169 bytes · __thiscall

_ZN13ZombieManager19ChooseMobSpawnAreasEv

Decompiled

undefined (1 param)

/* ZombieManager::ChooseMobSpawnAreas() */

void __thiscall ZombieManager::ChooseMobSpawnAreas(ZombieManager *this)

{
  float fVar1;
  float fVar2;
  float fVar3;
  int iVar4;
  CBaseEntity *pCVar5;
  char cVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  void *pvVar10;
  CBaseEntity *pCVar11;
  int iVar12;
  uint uVar13;
  int iVar14;
  int in_GS_OFFSET;
  longdouble lVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  char *pcVar20;
  int local_2b8;
  CUtlMemory<CTerrorPlayer*,int> *local_2b4;
  int *local_2ac;
  float local_2a8;
  int local_2a4;
  float local_2a0;
  float local_298;
  float local_294;
  CBaseEntity *local_290;
  undefined4 local_28c;
  undefined4 local_288;
  undefined4 local_284;
  int local_280;
  undefined4 local_27c;
  int local_278 [5];
  CNavArea *local_264;
  undefined4 local_260;
  undefined4 local_25c;
  undefined4 local_258;
  CNavArea local_254 [16];
  int local_244;
  CNavArea *local_240;
  undefined1 *local_23c;
  undefined4 local_238;
  undefined4 local_234;
  undefined4 local_230;
  undefined1 local_22c [512];
  undefined4 local_2c;
  undefined1 *local_28;
  Color local_24;
  undefined1 local_23;
  undefined1 local_22;
  undefined1 local_21;
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (*(int *)(ZombieSpawnMobsFromSelectedSet._28_4_ + 0x30) == 0) {
    local_2ac = (int *)CollectSpawnAreas(this,*(undefined4 *)(this + 0x214));
  }
  else {
    local_2ac = (int *)CNavMesh::GetSelectedSet(TheNavMesh);
  }
  *(undefined4 *)(this + 0x1dc) = 0;
  if (1 < *(int *)(ZombieDebugMobSpawn._28_4_ + 0x30)) {
    CNavMesh::ClearSelectedSet(TheNavMesh);
  }
  if (local_2ac[3] == 0) {
    pcVar20 = (char *)TheDirector;
    if (*(int *)(this + 0x214) == 0) {
      cVar6 = CDirector::IsFinale(TheDirector);
      if (((cVar6 != '\0') ||
          (pcVar20 = (char *)TheDirector, cVar6 = CDirector::AreAllSurvivorsInFinaleArea(),
          cVar6 == '\0')) && (**(char **)(TheDirector + 0x640) == '\0')) {
        DevMsg("(MOB) %3.2f: MOB SPAWN ERROR: ANYWHERE = Empty spawn area set\n",
               (double)*(float *)(gpGlobals + 0xc));
        pcVar20 = "(MOB) %3.2f: MOB SPAWN ERROR: ANYWHERE = Empty spawn area set\n";
        UTIL_LogPrintf("(MOB) %3.2f: MOB SPAWN ERROR: ANYWHERE = Empty spawn area set\n",
                       (double)*(float *)(gpGlobals + 0xc));
      }
      *(undefined4 *)(this + 0x1f0) = 0;
    }
    else {
      cVar6 = CDirector::IsFinale(TheDirector);
      if (((cVar6 != '\0') ||
          (pcVar20 = (char *)TheDirector, cVar6 = CDirector::AreAllSurvivorsInFinaleArea(),
          cVar6 == '\0')) && (**(char **)(TheDirector + 0x640) == '\0')) {
        DevMsg("(MOB) %3.2f: MOB SPAWN ERROR: Empty spawn area set, switching to ANYWHERE\n",
               (double)*(float *)(gpGlobals + 0xc));
        pcVar20 = "(MOB) %3.2f: MOB SPAWN ERROR: Empty spawn area set, switching to ANYWHERE\n";
        UTIL_LogPrintf("(MOB) %3.2f: MOB SPAWN ERROR: Empty spawn area set, switching to ANYWHERE\n"
                       ,(double)*(float *)(gpGlobals + 0xc));
      }
      *(undefined4 *)(this + 0x214) = 0;
      *(undefined4 *)(this + 0x1f0) = 0;
    }
  }
  else {
    local_23c = local_22c;
    local_2c = 0;
    local_230 = 0;
    local_238 = 0x80;
    local_234 = 0xffffffff;
    local_28 = local_23c;
                    /* try { // try from 00a60a0a to 00a60a0e has its CatchHandler @ 00a614d9 */
    CUtlVector<float,CUtlMemoryFixedGrowable<float,128u,int>>::EnsureCount
              ((CUtlVector<float,CUtlMemoryFixedGrowable<float,128u,int>> *)&local_23c,local_2ac[3])
    ;
    local_28c = 0;
    local_288 = 0;
    local_284 = 0;
    local_280 = 0;
    local_27c = 0;
                    /* try { // try from 00a60eb3 to 00a60eb7 has its CatchHandler @ 00a60eae */
    if (((*(int *)(this + 0x214) == 9) &&
        (ForEachSurvivor<SurvivorCollector>((SurvivorCollector *)&local_28c),
        *(int *)(this + 0x214) == 9)) && (local_280 != 0)) {
      local_278[0] = 0;
      local_278[1] = 0;
      local_278[2] = 0;
      local_278[3] = 0;
      local_278[4] = 0;
                    /* try { // try from 00a60f14 to 00a60f18 has its CatchHandler @ 00a614d5 */
      ForEachSurvivor<SurvivorCollector>((SurvivorCollector *)local_278);
      local_264 = local_254;
      local_260 = 4;
      local_25c = 0xffffffff;
      local_258 = 0;
      local_244 = 0;
      local_240 = local_264;
      if (0 < local_278[3]) {
        iVar7 = 0;
        do {
          iVar12 = iVar7 * 4;
          pCVar11 = (CBaseEntity *)
                    CDirectorTacticalServices::GetClosestSurvivor
                              (*(CDirectorTacticalServices **)(TheDirector + 0x628),
                               *(CBaseCombatCharacter **)(local_278[0] + iVar7 * 4),true,true);
          if (pCVar11 == (CBaseEntity *)0x0) {
LAB_00a6100f:
                    /* try { // try from 00a61032 to 00a6132f has its CatchHandler @ 00a61456 */
            CUtlVector<CTerrorPlayer*,CUtlMemoryFixedGrowable<CTerrorPlayer*,4u,int>>::InsertBefore
                      ((CUtlVector<CTerrorPlayer*,CUtlMemoryFixedGrowable<CTerrorPlayer*,4u,int>> *)
                       &local_264,local_244,(CTerrorPlayer **)(iVar12 + local_278[0]));
          }
          else {
            pCVar5 = *(CBaseEntity **)(local_278[0] + iVar12);
            if (((byte)pCVar5[0x14d] & 8) == 0) {
              if (((byte)pCVar11[0x14d] & 8) == 0) goto LAB_00a60f85;
LAB_00a610b6:
              CBaseEntity::CalcAbsolutePosition(pCVar11);
              local_294 = (*(float *)(pCVar11 + 0x2e4) - *(float *)(pCVar5 + 0x2e4)) *
                          (*(float *)(pCVar11 + 0x2e4) - *(float *)(pCVar5 + 0x2e4)) +
                          (*(float *)(pCVar11 + 0x2e0) - *(float *)(pCVar5 + 0x2e0)) *
                          (*(float *)(pCVar11 + 0x2e0) - *(float *)(pCVar5 + 0x2e0));
              if (((byte)pCVar11[0x14d] & 8) != 0) {
                CBaseEntity::CalcAbsolutePosition(pCVar11);
              }
            }
            else {
              CBaseEntity::CalcAbsolutePosition(pCVar5);
              if (((byte)pCVar11[0x14d] & 8) != 0) goto LAB_00a610b6;
LAB_00a60f85:
              local_294 = (*(float *)(pCVar11 + 0x2e4) - *(float *)(pCVar5 + 0x2e4)) *
                          (*(float *)(pCVar11 + 0x2e4) - *(float *)(pCVar5 + 0x2e4)) +
                          (*(float *)(pCVar11 + 0x2e0) - *(float *)(pCVar5 + 0x2e0)) *
                          (*(float *)(pCVar11 + 0x2e0) - *(float *)(pCVar5 + 0x2e0));
            }
            fVar16 = *(float *)(pCVar11 + 0x2e8);
            pCVar11 = *(CBaseEntity **)(local_278[0] + iVar12);
            if (((byte)pCVar11[0x14d] & 8) != 0) {
              CBaseEntity::CalcAbsolutePosition(pCVar11);
            }
            if ((1e+06 < local_294) || (120.0 < ABS(fVar16 - *(float *)(pCVar11 + 0x2e8))))
            goto LAB_00a6100f;
          }
          iVar7 = iVar7 + 1;
        } while (iVar7 < local_278[3]);
      }
      local_2b4 = (CUtlMemory<CTerrorPlayer*,int> *)&local_264;
      if (local_2ac[3] < 1) {
        local_2a8 = 0.0;
      }
      else {
        local_2b8 = 0;
        local_2a8 = 0.0;
        do {
          iVar12 = local_2b8 * 4;
          iVar7 = *(int *)(*local_2ac + local_2b8 * 4);
          fVar16 = *(float *)(iVar7 + 0x14);
          fVar1 = *(float *)(iVar7 + 0x10);
          fVar2 = *(float *)(iVar7 + 8);
          fVar3 = *(float *)(iVar7 + 4);
          if (local_278[3] < 1) {
            local_2a4 = 0;
            fVar19 = *(float *)(iVar7 + 0x34);
            fVar17 = 1.0;
            local_2a0 = 1.1754944e-38;
          }
          else {
            local_2a4 = 0;
            iVar14 = 0;
            local_2a0 = 1.1754944e-38;
            local_298 = 3.4028235e+38;
            do {
              iVar8 = iVar14 * 4;
              pCVar11 = *(CBaseEntity **)(local_278[0] + iVar14 * 4);
              if ((*(uint *)(pCVar11 + 0x14c) & 0x800) == 0) {
                if (local_2a0 < *(float *)(pCVar11 + 0x2e8)) {
                  uVar13 = 0;
                  local_290 = pCVar11;
                  goto LAB_00a611e0;
                }
              }
              else {
                CBaseEntity::CalcAbsolutePosition(pCVar11);
                local_290 = *(CBaseEntity **)(local_278[0] + iVar8);
                uVar13 = *(uint *)(local_290 + 0x14c) & 0x800;
                pCVar5 = pCVar11 + 0x2e8;
                pCVar11 = local_290;
                if (local_2a0 < *(float *)pCVar5) {
                  if (uVar13 != 0) {
                    CBaseEntity::CalcAbsolutePosition(local_290);
                    pCVar11 = *(CBaseEntity **)(local_278[0] + iVar8);
                    uVar13 = *(uint *)(pCVar11 + 0x14c) & 0x800;
                  }
LAB_00a611e0:
                  local_2a0 = *(float *)(local_290 + 0x2e8);
                }
                if (uVar13 != 0) {
                  CBaseEntity::CalcAbsolutePosition(pCVar11);
                }
              }
              fVar18 = *(float *)(iVar7 + 0x2c) - *(float *)(pCVar11 + 0x2e0);
              fVar17 = *(float *)(iVar7 + 0x30) - *(float *)(pCVar11 + 0x2e4);
              fVar19 = *(float *)(iVar7 + 0x34);
              fVar17 = SQRT(fVar17 * fVar17 + fVar18 * fVar18 +
                            (fVar19 - *(float *)(pCVar11 + 0x2e8)) *
                            (fVar19 - *(float *)(pCVar11 + 0x2e8)));
              if (fVar17 < local_298) {
                local_2a4 = *(int *)(local_278[0] + iVar8);
                local_298 = fVar17;
              }
              iVar14 = iVar14 + 1;
            } while (iVar14 < local_278[3]);
            if (local_298 <= 0.1) {
              local_298 = 0.1;
            }
            if (1600.0 <= local_298) {
              local_298 = 1600.0;
            }
            fVar17 = local_298 * -0.0025 + 5.0;
          }
          if (0 < local_244) {
            if (local_2a4 != *(int *)local_264) {
              iVar7 = 0;
              do {
                iVar7 = iVar7 + 1;
                if (iVar7 == local_244) goto LAB_00a61390;
              } while (local_2a4 != *(int *)(local_264 + iVar7 * 4));
              if (iVar7 == -1) goto LAB_00a61390;
            }
            fVar17 = fVar17 * 5.0;
          }
LAB_00a61390:
          if (ABS(fVar19 - local_2a0) < 120.0) {
            fVar17 = fVar17 * 5.0;
          }
          fVar17 = fVar17 * (fVar1 - fVar3) * (fVar16 - fVar2);
          local_2b8 = local_2b8 + 1;
          *(float *)(local_23c + iVar12) = fVar17;
          local_2a8 = fVar17 + local_2a8;
        } while (local_2b8 < local_2ac[3]);
      }
      local_244 = 0;
      CUtlMemory<CTerrorPlayer*,int>::Purge(local_2b4);
      local_240 = local_264;
      CUtlMemory<CTerrorPlayer*,int>::Purge(local_2b4);
      CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>>::~CUtlVector
                ((CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>> *)local_278);
    }
    else {
      iVar7 = 0;
      local_2a8 = 0.0;
      if (0 < local_2ac[3]) {
        local_2a8 = 0.0;
        do {
          iVar12 = *(int *)(*local_2ac + iVar7 * 4);
          fVar16 = (*(float *)(iVar12 + 0x14) - *(float *)(iVar12 + 8)) *
                   (*(float *)(iVar12 + 0x10) - *(float *)(iVar12 + 4));
          *(float *)(local_23c + iVar7 * 4) = fVar16;
          iVar7 = iVar7 + 1;
          local_2a8 = local_2a8 + fVar16;
        } while (iVar7 < local_2ac[3]);
      }
    }
    local_298 = 0.0;
    iVar7 = *(int *)(this + 0x214);
    *(undefined4 *)(this + 0x1f0) = 0;
    do {
                    /* try { // try from 00a60b1f to 00a60b23 has its CatchHandler @ 00a60eae */
      lVar15 = (longdouble)RandomFloat(0,local_2a8);
      if (0 < local_2ac[3]) {
        fVar16 = 0.0;
        iVar12 = *(int *)(this + 0x1f0);
        iVar14 = 0;
        while( true ) {
          local_264 = *(CNavArea **)(*local_2ac + iVar14 * 4);
          if (iVar12 < 1) break;
          if (local_264 != (CNavArea *)**(int **)(this + 0x1e4)) {
            iVar8 = 0;
            do {
              iVar8 = iVar8 + 1;
              if (iVar8 == iVar12) goto LAB_00a60b9c;
            } while (local_264 != (CNavArea *)(*(int **)(this + 0x1e4))[iVar8 * 2]);
          }
LAB_00a60bb6:
          iVar14 = iVar14 + 1;
          if (iVar14 == local_2ac[3]) goto LAB_00a60bc1;
        }
LAB_00a60b9c:
        fVar16 = fVar16 + *(float *)(local_23c + iVar14 * 4);
        if (fVar16 < (float)lVar15) goto LAB_00a60bb6;
        iVar8 = iVar12 + 1;
        iVar9 = *(int *)(this + 0x1e8);
        if (iVar8 <= iVar9) {
          pvVar10 = *(void **)(this + 0x1e4);
          goto LAB_00a60c63;
        }
        iVar4 = *(int *)(this + 0x1ec);
        if (iVar4 < 0) {
          pvVar10 = *(void **)(this + 0x1e4);
          goto LAB_00a60c63;
        }
        if (iVar4 != 0) {
          for (iVar9 = (iVar12 / iVar4 + 1) * iVar4; iVar9 < iVar8; iVar9 = (iVar9 + iVar8) / 2) {
          }
          goto LAB_00a60dde;
        }
        if (iVar9 != 0) goto LAB_00a60e2e;
        if (iVar8 < 5) {
          iVar9 = 4;
        }
        else {
          iVar9 = 4;
LAB_00a60e2e:
          do {
            iVar9 = iVar9 * 2;
          } while (iVar9 < iVar8);
        }
LAB_00a60dde:
        *(int *)(this + 0x1e8) = iVar9;
        if (*(void **)(this + 0x1e4) == (void *)0x0) {
          pvVar10 = malloc(iVar9 << 3);
          *(void **)(this + 0x1e4) = pvVar10;
        }
        else {
          pvVar10 = realloc(*(void **)(this + 0x1e4),iVar9 << 3);
          *(void **)(this + 0x1e4) = pvVar10;
          iVar8 = *(int *)(this + 0x1f0) + 1;
        }
LAB_00a60c63:
        *(int *)(this + 0x1f0) = iVar8;
        *(void **)(this + 500) = pvVar10;
        iVar8 = (iVar8 - iVar12) + -1;
        iVar12 = iVar12 * 8;
        if (0 < iVar8) {
          _V_memmove((void *)((int)pvVar10 + iVar12 + 8),(void *)((int)pvVar10 + iVar12),iVar8 * 8);
          pvVar10 = *(void **)(this + 0x1e4);
        }
        *(CNavArea **)((int)pvVar10 + iVar12) = local_264;
        *(int *)(*(int *)(this + 0x1e4) + 4 + iVar12) =
             (int)((*(float *)(local_264 + 0x10) - *(float *)(local_264 + 4)) *
                   (*(float *)(local_264 + 0x14) - *(float *)(local_264 + 8)) *
                  *(float *)(ZombieMobPopulationDensity._28_4_ + 0x2c));
                    /* try { // try from 00a60ceb to 00a60d9c has its CatchHandler @ 00a60e60 */
        CUtlVector<TerrorNavArea*,CUtlMemory<TerrorNavArea*,int>>::InsertBefore
                  ((CUtlVector<TerrorNavArea*,CUtlMemory<TerrorNavArea*,int>> *)(this + 0x1d0),
                   *(int *)(this + 0x1dc),(TerrorNavArea **)&local_264);
        if (*(int *)(ZombieDebugMobSpawn._28_4_ + 0x30) != 0) {
          if (1 < *(int *)(ZombieDebugMobSpawn._28_4_ + 0x30)) {
            CNavMesh::AddToSelectedSet(TheNavMesh,local_264);
          }
          local_24 = 0xff;
          local_23 = 0x80;
          local_22 = 0;
          local_21 = 0xff;
          ConColorMsg(&local_24,
                      "ChooseMobSpawnAreas: m_mobSpawnAreas[%d].pArea %d has %d population\n");
        }
        local_2a8 = local_2a8 - *(float *)(local_23c + iVar14 * 4);
      }
LAB_00a60bc1:
      local_298 = (float)((int)local_298 + 1);
    } while ((int)local_298 < (int)((uint)(iVar7 == 9) * 2 + 2));
    local_280 = 0;
    CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)&local_28c);
    local_27c = local_28c;
    CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)&local_28c);
    local_2c = 0;
    CUtlMemory<float,int>::Purge((CUtlMemory<float,int> *)&local_23c);
    local_28 = local_23c;
    pcVar20 = (char *)&local_23c;
    CUtlMemory<float,int>::Purge((CUtlMemory<float,int> *)pcVar20);
  }
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail(pcVar20);
}

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)