L L4D2node

ZombieManager::AddToPositionalSpawnSet

0x00a5c650 · 662 bytes · __thiscall

_ZN13ZombieManager23AddToPositionalSpawnSetEbRK6Vectorf

Decompiled

undefined (4 params)

/* ZombieManager::AddToPositionalSpawnSet(bool, Vector const&, float) */

void __thiscall
ZombieManager::AddToPositionalSpawnSet
          (ZombieManager *this,bool param_1,Vector *param_2,float param_3)

{
  int *piVar1;
  int iVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  int iVar7;
  int iVar8;
  float fVar9;
  CNavArea *local_20 [4];
  
  if (param_1) {
    *(undefined4 *)(this + 0x270) = 0;
  }
  iVar3 = TheNavMesh;
  if ((CNavMesh::
       ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)::
       searchMarker == '\0') &&
     (iVar4 = __cxa_guard_acquire(&CNavMesh::
                                   ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
                                   ::searchMarker), iVar4 != 0)) {
                    /* try { // try from 00a5c8c3 to 00a5c8c7 has its CatchHandler @ 00a5c8ec */
    CNavMesh::
    ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)::
    searchMarker = RandomInt(0,0x100000);
    __cxa_guard_release(&CNavMesh::
                         ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
                         ::searchMarker);
  }
  iVar4 = CNavMesh::
          ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)::
          searchMarker + 1;
  if (CNavMesh::
      ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)::
      searchMarker + 1 == 0) {
    iVar4 = CNavMesh::
            ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
            ::searchMarker + 2;
  }
  CNavMesh::ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
  ::searchMarker = iVar4;
  fVar9 = 1.0 / *(float *)(iVar3 + 0x20);
  iVar4 = (int)((*(float *)param_2 - *(float *)(iVar3 + 0x2c)) * fVar9);
  if (iVar4 < 0) {
    iVar4 = 0;
  }
  else if (*(int *)(iVar3 + 0x24) <= iVar4) {
    iVar4 = *(int *)(iVar3 + 0x24) + -1;
  }
  iVar7 = (int)((*(float *)(param_2 + 4) - *(float *)(iVar3 + 0x30)) * fVar9);
  if (iVar7 < 0) {
    iVar7 = 0;
  }
  else if (*(int *)(iVar3 + 0x28) <= iVar7) {
    iVar7 = *(int *)(iVar3 + 0x28) + -1;
  }
  iVar6 = (int)(fVar9 * param_3);
  if ((float)iVar6 < fVar9 * param_3) {
    iVar6 = iVar6 + 1;
  }
  if (param_3 == 0.0) {
    iVar6 = *(int *)(iVar3 + 0x28);
    if (*(int *)(iVar3 + 0x28) < *(int *)(iVar3 + 0x24)) {
      iVar6 = *(int *)(iVar3 + 0x24);
    }
  }
  iVar5 = iVar4 - iVar6;
  do {
    if (iVar4 + iVar6 < iVar5) {
      return;
    }
    if ((-1 < iVar5) && (iVar2 = iVar7 - iVar6, iVar5 < *(int *)(iVar3 + 0x24))) {
      for (; iVar2 <= iVar6 + iVar7; iVar2 = iVar2 + 1) {
        if (((-1 < iVar2) && (iVar2 < *(int *)(iVar3 + 0x28))) &&
           (piVar1 = (int *)(*(int *)(iVar3 + 0xc) + (*(int *)(iVar3 + 0x24) * iVar2 + iVar5) * 0x14
                            ), 0 < piVar1[3])) {
          iVar8 = 0;
          do {
            while ((local_20[0] = *(CNavArea **)(*piVar1 + iVar8 * 4),
                   *(int *)(local_20[0] + 0x74) !=
                   CNavMesh::
                   ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
                   ::searchMarker &&
                   ((*(int *)(local_20[0] + 0x74) =
                          CNavMesh::
                          ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
                          ::searchMarker,
                    (*(float *)(local_20[0] + 0x2c) - *(float *)param_2) *
                    (*(float *)(local_20[0] + 0x2c) - *(float *)param_2) +
                    (*(float *)(local_20[0] + 0x34) - *(float *)(param_2 + 8)) *
                    (*(float *)(local_20[0] + 0x34) - *(float *)(param_2 + 8)) +
                    (*(float *)(local_20[0] + 0x30) - *(float *)(param_2 + 4)) *
                    (*(float *)(local_20[0] + 0x30) - *(float *)(param_2 + 4)) <= param_3 * param_3
                    || (param_3 * param_3 == 0.0))))) {
              iVar8 = iVar8 + 1;
              CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                        ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)(this + 0x264),
                         *(int *)(this + 0x270),local_20);
              if (piVar1[3] <= iVar8) goto LAB_00a5c86f;
            }
            iVar8 = iVar8 + 1;
          } while (iVar8 < piVar1[3]);
        }
LAB_00a5c86f:
      }
    }
    iVar5 = iVar5 + 1;
  } while( true );
}

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)