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 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.