L L4D2node

SelectOrphanFinaleAreas

0x0098f850 · 494 bytes · __regparm3

_ZL23SelectOrphanFinaleAreasP16NavAreaCollector

Decompiled

undefined (1 param)

/* SelectOrphanFinaleAreas(NavAreaCollector*) */

void __regparm3 SelectOrphanFinaleAreas(NavAreaCollector *param_1)

{
  int iVar1;
  char cVar2;
  Checkpoint *this;
  CNavArea *pCVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  CNavArea *local_3c [11];
  
  iVar1 = *(int *)(param_1 + 0x10);
                    /* try { // try from 0098f874 to 0098f9ce has its CatchHandler @ 0098fa61 */
  CNavMesh::ClearSelectedSet(TheNavMesh);
  for (iVar6 = 0; iVar4 = TerrorNavMesh::GetCheckpointCount((TerrorNavMesh *)TheNavMesh),
      iVar6 < iVar4; iVar6 = iVar6 + 1) {
    this = (Checkpoint *)TerrorNavMesh::GetCheckpoint((TerrorNavMesh *)TheNavMesh,iVar6);
    if (this != (Checkpoint *)0x0) {
      pCVar3 = (CNavArea *)Checkpoint::GetLargestArea(this);
      FloodSelectCollector::FloodSelectCollector
                ((FloodSelectCollector *)local_3c,(TerrorNavArea *)pCVar3,0,0x40,0xffff,0.0,1.0,-1.0
                );
      SearchSurroundingAreas<FloodSelectCollector>
                (pCVar3,(Vector *)(pCVar3 + 0x2c),(FloodSelectCollector *)local_3c,-1.0,3,-1);
    }
  }
  iVar6 = 0;
  if (0 < DAT_00fe6000) {
    do {
      while( true ) {
        pCVar3 = *(CNavArea **)(TheNavAreas + iVar6 * 4);
        cVar2 = CNavMesh::IsInSelectedSet(TheNavMesh,pCVar3);
        if ((cVar2 == '\0') && (((byte)pCVar3[300] & 0x40) == 0)) break;
LAB_0098f940:
        iVar6 = iVar6 + 1;
        if (DAT_00fe6000 <= iVar6) goto LAB_0098f9e0;
      }
      if (s_testNavID < 1) {
        cVar2 = IsAreaTestable(pCVar3);
      }
      else {
        cVar2 = s_testNavID == *(int *)(pCVar3 + 0x8c);
      }
      if (cVar2 == '\0') goto LAB_0098f940;
      local_3c[0] = pCVar3;
      if (*param_1 == (NavAreaCollector)0x0) {
        iVar4 = *(int *)(param_1 + 0x10);
      }
      else {
        iVar4 = *(int *)(param_1 + 0x10);
        if (0 < iVar4) {
          if (pCVar3 != (CNavArea *)**(int **)(param_1 + 4)) {
            iVar5 = 0;
            do {
              iVar5 = iVar5 + 1;
              if (iVar5 == iVar4) goto LAB_0098f9bc;
            } while (pCVar3 != (CNavArea *)(*(int **)(param_1 + 4))[iVar5]);
            if (iVar5 < 0) goto LAB_0098f9bc;
          }
          goto LAB_0098f940;
        }
      }
LAB_0098f9bc:
      CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)(param_1 + 4),iVar4,local_3c);
      iVar6 = iVar6 + 1;
    } while (iVar6 < DAT_00fe6000);
  }
LAB_0098f9e0:
  if (iVar1 < *(int *)(param_1 + 0x10)) {
    Warning("%s found %d areas\n","Missing Finale check",*(int *)(param_1 + 0x10) - iVar1);
    return;
  }
  Msg("%s passed\n","Missing Finale check");
  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)