L L4D2node

ZombieManager::OnFlowDistancesInitialized

0x00a62050 · 1978 bytes · __thiscall

_ZN13ZombieManager26OnFlowDistancesInitializedEP13TerrorNavArea

Decompiled

undefined (2 params)

/* ZombieManager::OnFlowDistancesInitialized(TerrorNavArea*) */

void __thiscall
ZombieManager::OnFlowDistancesInitialized(ZombieManager *this,TerrorNavArea *param_1)

{
  undefined4 *puVar1;
  TerrorNavArea *pTVar2;
  TerrorNavArea *this_00;
  CNavArea *pCVar3;
  int *piVar4;
  void *pvVar5;
  char cVar6;
  int iVar7;
  undefined4 uVar8;
  int iVar9;
  int iVar10;
  int iVar11;
  longdouble lVar12;
  longdouble lVar13;
  longdouble lVar14;
  float fVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  float local_90;
  CUtlMemory<TerrorNavArea*,int> *local_8c;
  float local_88;
  float local_84;
  int local_7c;
  int local_78;
  float local_70;
  TerrorNavArea *local_64;
  TerrorNavArea *local_60;
  int *local_5c;
  undefined4 local_58;
  undefined4 local_54;
  int local_50;
  int *local_4c;
  int local_48;
  undefined4 local_44;
  undefined4 local_40;
  int local_3c;
  int local_38;
  uint local_34;
  void *local_30;
  float local_2c;
  undefined4 local_28;
  int local_24;
  void *local_20;
  
  DevMsg("%3.2f: OnFlowDistancesInitialized()\n",(double)*(float *)(gpGlobals + 0xc));
  pTVar2 = *(TerrorNavArea **)(TheNavMesh + 0x608);
  if (pTVar2 == (TerrorNavArea *)0x0) {
    Warning("ERROR: OnFlowDistancesInitialized failed. The end area was NULL\n");
  }
  else {
    iVar9 = 0;
    if (0 < DAT_00fe6000) {
      do {
        this_00 = *(TerrorNavArea **)(TheNavAreas + iVar9 * 4);
        iVar9 = iVar9 + 1;
        TerrorNavArea::RemoveSpawnAttributes(this_00,0x4000);
        iVar10 = DAT_00fe6000;
        *(undefined4 *)(this_00 + 0x128) = 0;
      } while (iVar9 < iVar10);
    }
    BuildEscapeRoute(this,param_1);
    if (param_1 == (TerrorNavArea *)0x0) {
      Warning("ERROR: OnFlowDistancesInitialized failed. The start and/or end area was NULL\n");
    }
    else {
      local_5c = (int *)0x0;
      local_58 = 0;
      local_54 = 0;
      local_50 = 0;
      local_4c = (int *)0x0;
      local_64 = pTVar2;
      do {
                    /* try { // try from 00a6216a to 00a6233b has its CatchHandler @ 00a62830 */
        CUtlVector<TerrorNavArea*,CUtlMemory<TerrorNavArea*,int>>::InsertBefore
                  ((CUtlVector<TerrorNavArea*,CUtlMemory<TerrorNavArea*,int>> *)&local_5c,0,
                   &local_64);
        local_64 = *(TerrorNavArea **)(local_64 + 0x78);
      } while (local_64 != (TerrorNavArea *)0x0);
      lVar12 = (longdouble)
               CDirector::GetScriptValue
                         (TheDirector,"ZombieSpawnRange",*(float *)(ZombieSpawnRange._28_4_ + 0x2c))
      ;
      lVar13 = (longdouble)RandomFloat(0,0x3f800000);
      fVar16 = *(float *)(DirectorThreatMaxSeparation._28_4_ + 0x2c);
      local_84 = *(float *)(DirectorThreatMinSeparation._28_4_ + 0x2c);
      if (local_50 < 2) {
        fVar15 = 0.0;
        local_90 = 0.0;
      }
      else {
        local_90 = 0.0;
        iVar9 = 1;
        piVar4 = local_5c;
        do {
          local_64 = (TerrorNavArea *)piVar4[1];
          iVar9 = iVar9 + 1;
          iVar10 = *piVar4;
          fVar15 = *(float *)(local_64 + 0x2c) - *(float *)(iVar10 + 0x2c);
          fVar18 = *(float *)(local_64 + 0x30) - *(float *)(iVar10 + 0x30);
          fVar17 = *(float *)(local_64 + 0x34) - *(float *)(iVar10 + 0x34);
          local_90 = local_90 + SQRT(fVar15 * fVar15 + fVar18 * fVar18 + fVar17 * fVar17);
          piVar4 = piVar4 + 1;
        } while (iVar9 != local_50);
        fVar15 = (float)(int)local_90;
      }
      iVar9 = *(int *)(DirectorMaxThreatAreas._28_4_ + 0x30);
      local_7c = (int)(fVar15 / ((local_84 + fVar16) * 0.5));
      local_88 = fVar16;
      if (iVar9 < local_7c) {
        local_88 = local_90 / (float)iVar9;
        local_84 = local_88;
        local_7c = iVar9;
      }
      cVar6 = CTerrorGameRules::IsVersusMode();
      if (cVar6 == '\0') {
        lVar14 = (longdouble)RandomFloat(0x3f4ccccd,0x3f800000);
        local_84 = (float)lVar14 * local_84;
        lVar14 = (longdouble)RandomFloat(0x3f800000,0x3f99999a);
        local_88 = (float)lVar14 * local_88;
        local_70 = (float)lVar12 + (float)lVar12 + (float)lVar13 * fVar16;
      }
      else {
        iVar9 = CDirector::GetMapArcValue(TheDirector);
        if (iVar9 == 0) {
                    /* try { // try from 00a627ef to 00a627f3 has its CatchHandler @ 00a62830 */
          lVar12 = (longdouble)
                   RandomFloat(*(undefined4 *)
                                (vs_threat_initial_distance_first_map_min._28_4_ + 0x2c),
                               *(undefined4 *)
                                (vs_threat_initial_distance_first_map_max._28_4_ + 0x2c));
        }
        else {
          lVar12 = (longdouble)
                   RandomFloat(*(undefined4 *)(vs_threat_initial_distance_min._28_4_ + 0x2c),
                               *(undefined4 *)(vs_threat_initial_distance_max._28_4_ + 0x2c));
        }
        local_70 = (float)lVar12;
      }
      local_48 = 0;
      local_44 = 0;
      local_40 = 0;
      local_3c = 0;
      local_38 = 0;
      if (1 < local_50) {
        iVar9 = 1;
        local_78 = 0;
        do {
          pCVar3 = (CNavArea *)local_5c[iVar9];
          iVar10 = local_5c[iVar9 + -1];
          fVar17 = *(float *)(pCVar3 + 0x2c) - *(float *)(iVar10 + 0x2c);
          fVar16 = *(float *)(pCVar3 + 0x34) - *(float *)(iVar10 + 0x34);
          fVar15 = *(float *)(pCVar3 + 0x30) - *(float *)(iVar10 + 0x30);
          local_70 = local_70 - SQRT(fVar16 * fVar16 + fVar17 * fVar17 + fVar15 * fVar15);
          if (local_70 <= 0.0) {
            local_28 = 0;
            local_24 = 0;
            local_34 = local_34 & 0xffffff00;
            local_2c = 3.58732e-43;
            local_30 = malloc(0x400);
            local_20 = local_30;
                    /* try { // try from 00a6248e to 00a6259e has its CatchHandler @ 00a62857 */
            SearchSurroundingAreas<NavAreaCollector>
                      (pCVar3,(Vector *)(pCVar3 + 0x2c),(NavAreaCollector *)&local_34,240.0,0,-1);
            if (0 < local_24) {
              iVar10 = 0;
              do {
                iVar7 = RandomInt(0,local_24 + -1);
                iVar11 = local_24;
                pvVar5 = local_30;
                puVar1 = (undefined4 *)((int)local_30 + iVar10 * 4);
                iVar10 = iVar10 + 1;
                uVar8 = *puVar1;
                *puVar1 = *(undefined4 *)((int)local_30 + iVar7 * 4);
                *(undefined4 *)((int)local_30 + iVar7 * 4) = uVar8;
              } while (iVar10 < local_24);
              if (0 < local_24) {
                iVar10 = 0;
                do {
                  iVar7 = *(int *)((int)pvVar5 + iVar10 * 4);
                  if (iVar7 == 0) {
                    local_60 = (TerrorNavArea *)0x0;
                  }
                  else {
                    local_60 = (TerrorNavArea *)
                               __dynamic_cast(iVar7,&CNavArea::typeinfo,&TerrorNavArea::typeinfo,0);
                  }
                  if (((((byte)local_60[0x12e] & 8) == 0) &&
                      (24.0 <= *(float *)(local_60 + 0x10) - *(float *)(local_60 + 4))) &&
                     (24.0 <= *(float *)(local_60 + 0x14) - *(float *)(local_60 + 8))) {
                    CUtlVector<TerrorNavArea*,CUtlMemory<TerrorNavArea*,int>>::InsertBefore
                              ((CUtlVector<TerrorNavArea*,CUtlMemory<TerrorNavArea*,int>> *)
                               &local_48,local_3c,&local_60);
                    local_78 = local_78 + 1;
                    lVar12 = (longdouble)RandomFloat(local_84,local_88);
                    local_70 = (float)lVar12;
                    break;
                  }
                  iVar10 = iVar10 + 1;
                } while (iVar10 != iVar11);
              }
            }
            local_24 = 0;
            CUtlMemory<CNavArea*,int>::Purge((CUtlMemory<CNavArea*,int> *)&local_30);
            local_20 = local_30;
            CUtlMemory<CNavArea*,int>::Purge((CUtlMemory<CNavArea*,int> *)&local_30);
          }
        } while ((local_78 != local_7c) && (iVar9 = iVar9 + 1, iVar9 < local_50));
        if (0 < local_3c) {
          iVar9 = 0;
          do {
                    /* try { // try from 00a62605 to 00a62775 has its CatchHandler @ 00a62845 */
            while (TerrorNavArea::SetSpawnAttributes
                             (*(TerrorNavArea **)(local_48 + iVar9 * 4),0x4000),
                  *(int *)(DirectorDebugThreatPlacement._28_4_ + 0x30) == 0) {
              iVar9 = iVar9 + 1;
              if (local_3c <= iVar9) goto LAB_00a62692;
            }
            local_34 = *(uint *)(local_64 + 0x2c);
            local_30 = *(void **)(local_64 + 0x30);
            local_2c = *(float *)(local_64 + 0x34) + 1000.0;
            NDebugOverlay::VertArrow
                      ((Vector *)&local_34,(Vector *)(local_64 + 0x2c),20.0,0,0xff,0,0xff,true,
                       9999.9);
            iVar9 = iVar9 + 1;
          } while (iVar9 < local_3c);
        }
      }
LAB_00a62692:
      local_8c = (CUtlMemory<TerrorNavArea*,int> *)&local_48;
      if (*(int *)(DirectorDebugThreatPlacement._28_4_ + 0x30) != 0) {
        DevMsg("Escape route length is %f\n",(double)local_90);
      }
      lVar12 = (longdouble)CDirector::GetWanderingZombieDensityModifier(TheDirector);
      iVar10 = (int)((float)lVar12 * local_90 + 0.5);
      iVar11 = 0;
      iVar9 = iVar10;
      while (iVar11 < 1000) {
        while( true ) {
          if (iVar9 < 1) goto LAB_00a62757;
          iVar7 = RandomInt(0,DAT_00fe6000 + -1);
          pTVar2 = *(TerrorNavArea **)(TheNavAreas + iVar7 * 4);
          cVar6 = TerrorNavArea::IsValidForWanderingPopulation(pTVar2);
          iVar11 = iVar11 + 1;
          if (cVar6 == '\0') break;
          *(int *)(pTVar2 + 0x128) = *(int *)(pTVar2 + 0x128) + 1;
          uVar8 = 0;
          if (-1 < *(int *)(pTVar2 + 0x128)) {
            uVar8 = *(undefined4 *)(pTVar2 + 0x128);
          }
          iVar11 = 0;
          iVar9 = iVar9 + -1;
          *(undefined4 *)(pTVar2 + 0x128) = uVar8;
        }
      }
LAB_00a62757:
      if (*(int *)(DirectorDebugThreatPlacement._28_4_ + 0x30) != 0) {
        DevMsg("Total wandering zombie population = %d wanderers\n",iVar10);
      }
      local_3c = 0;
      CUtlMemory<TerrorNavArea*,int>::Purge(local_8c);
      local_38 = local_48;
      CUtlMemory<TerrorNavArea*,int>::Purge(local_8c);
      local_50 = 0;
      CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_5c);
      local_4c = local_5c;
      CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_5c);
    }
    cVar6 = CDirector::IsBackgroundMap();
    if (cVar6 == '\0') {
      TerrorNavMesh::MaintainWanderingPopulation(TheNavMesh,true);
    }
  }
  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)