L L4D2node

ZombieManager::BuildEscapeRoute

0x00a5bd80 · 859 bytes · __thiscall

_ZNK13ZombieManager16BuildEscapeRouteEP13TerrorNavArea

Decompiled

undefined (2 params)

/* ZombieManager::BuildEscapeRoute(TerrorNavArea*) const */

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

{
  CNavArea *pCVar1;
  bool bVar2;
  CEscapeRoute *this_00;
  int iVar3;
  TerrorNavArea *pTVar4;
  int local_30 [4];
  MainPathCost local_1d [13];
  
  if ((BuildEscapeRoute(TerrorNavArea*)::escapeRouteStr == '\0') &&
     (iVar3 = __cxa_guard_acquire(&BuildEscapeRoute(TerrorNavArea*)::escapeRouteStr), iVar3 != 0)) {
    DAT_01028524 = 0;
    BuildEscapeRoute(TerrorNavArea*)::escapeRouteStr = 0;
    DAT_01028520 = "escape_route";
    __cxa_guard_release(&BuildEscapeRoute(TerrorNavArea*)::escapeRouteStr);
    __cxa_atexit(CGameString::~CGameString,&BuildEscapeRoute(TerrorNavArea*)::escapeRouteStr,
                 &__dso_handle);
  }
  if (((BuildEscapeRoute(TerrorNavArea*)::escapeRouteStr == 0) ||
      (iVar3 = BuildEscapeRoute(TerrorNavArea*)::escapeRouteStr,
      DAT_01028524 != CGameString::gm_iSerialNumber)) && (iVar3 = 0, DAT_01028520 != (char *)0x0)) {
    AllocPooledString((char *)local_30);
    BuildEscapeRoute(TerrorNavArea*)::escapeRouteStr = local_30[0];
    DAT_01028524 = CGameString::gm_iSerialNumber;
    iVar3 = local_30[0];
  }
  this_00 = (CEscapeRoute *)
            CGlobalEntityList::FindEntityByClassnameFast((CGlobalEntityList *)gEntList,0,iVar3);
  if (this_00 == (CEscapeRoute *)0x0) {
    this_00 = (CEscapeRoute *)
              CBaseEntity::Create("escape_route",(Vector *)&vec3_origin,(QAngle *)&vec3_angle,
                                  (CBaseEntity *)0x0);
  }
  CEscapeRoute::ResetPath(this_00);
  pCVar1 = *(CNavArea **)(TheNavMesh + 0x608);
  if ((param_1 == (TerrorNavArea *)0x0) || (pCVar1 == (CNavArea *)0x0)) {
    if (param_1 == (TerrorNavArea *)0x0) {
      if (pCVar1 == (CNavArea *)0x0) {
        Warning("ERROR: BuildEscapeRoute failed. The start and end area were both NULL\n");
      }
      else {
        Warning("ERROR: BuildEscapeRoute failed. The start area was NULL. endArea = #%p\n",pCVar1);
        if (*(int *)(ZombieDebugEscapeRoute._28_4_ + 0x30) != 0) {
          CNavMesh::AddToSelectedSet(TheNavMesh,pCVar1);
        }
      }
    }
    else {
      Warning("ERROR: BuildEscapeRoute failed. The end area was NULL. zeroFlowArea = #%p\n",param_1)
      ;
      if (*(int *)(ZombieDebugEscapeRoute._28_4_ + 0x30) != 0) {
        CNavMesh::AddToSelectedSet(TheNavMesh,(CNavArea *)param_1);
        return;
      }
    }
  }
  else {
    if (*(int *)(ZombieDebugEscapeRoute._28_4_ + 0x30) != 0) {
      g_DebugPathfindCounter = 1;
    }
    bVar2 = NavAreaBuildPath<MainPathCost>
                      ((CNavArea *)param_1,pCVar1,(Vector *)0x0,(Vector *)0x0,local_1d,
                       (CNavArea **)0x0,0.0,2,true);
    if ((!bVar2) &&
       (Warning("ERROR: BuildEscapeRoute failed. No path from start to end. zeroFlowArea = #%d, endArea = #%d.\n"
                ,*(undefined4 *)(param_1 + 0x8c),*(undefined4 *)(pCVar1 + 0x8c)),
       *(int *)(ZombieDebugEscapeRoute._28_4_ + 0x30) != 0)) {
      CNavMesh::AddToSelectedSet(TheNavMesh,(CNavArea *)param_1);
      CNavMesh::AddToSelectedSet(TheNavMesh,pCVar1);
    }
    iVar3 = 0x400;
    pTVar4 = (TerrorNavArea *)pCVar1;
    do {
      CEscapeRoute::AddArea(this_00,pTVar4);
      if (*(int *)(ZombieDebugEscapeRoute._28_4_ + 0x30) != 0) {
        CNavMesh::AddToSelectedSet(TheNavMesh,(CNavArea *)pTVar4);
      }
      iVar3 = iVar3 + -1;
      if (iVar3 == 0) {
        Warning("ERROR: BuildEscapeRoute failed. Distance to end of map is too far. Infected population incomplete. zeroFlowArea = #%d, endArea = #%d.\n"
                ,*(undefined4 *)(param_1 + 0x8c),*(undefined4 *)(pCVar1 + 0x8c));
        if (*(int *)(ZombieDebugEscapeRoute._28_4_ + 0x30) != 0) {
          CNavMesh::AddToSelectedSet(TheNavMesh,(CNavArea *)param_1);
          CNavMesh::AddToSelectedSet(TheNavMesh,pCVar1);
        }
        break;
      }
      pTVar4 = *(TerrorNavArea **)(pTVar4 + 0x78);
    } while (pTVar4 != (TerrorNavArea *)0x0);
    CEscapeRoute::FinishPath(this_00);
  }
  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)