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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.