ZombieManager::ChooseMobSpawnAreas
0x00a607d0 · 3169 bytes · __thiscall
_ZN13ZombieManager19ChooseMobSpawnAreasEv
Decompiled
undefined (1 param)
/* ZombieManager::ChooseMobSpawnAreas() */
void __thiscall ZombieManager::ChooseMobSpawnAreas(ZombieManager *this)
{
float fVar1;
float fVar2;
float fVar3;
int iVar4;
CBaseEntity *pCVar5;
char cVar6;
int iVar7;
int iVar8;
int iVar9;
void *pvVar10;
CBaseEntity *pCVar11;
int iVar12;
uint uVar13;
int iVar14;
int in_GS_OFFSET;
longdouble lVar15;
float fVar16;
float fVar17;
float fVar18;
float fVar19;
char *pcVar20;
int local_2b8;
CUtlMemory<CTerrorPlayer*,int> *local_2b4;
int *local_2ac;
float local_2a8;
int local_2a4;
float local_2a0;
float local_298;
float local_294;
CBaseEntity *local_290;
undefined4 local_28c;
undefined4 local_288;
undefined4 local_284;
int local_280;
undefined4 local_27c;
int local_278 [5];
CNavArea *local_264;
undefined4 local_260;
undefined4 local_25c;
undefined4 local_258;
CNavArea local_254 [16];
int local_244;
CNavArea *local_240;
undefined1 *local_23c;
undefined4 local_238;
undefined4 local_234;
undefined4 local_230;
undefined1 local_22c [512];
undefined4 local_2c;
undefined1 *local_28;
Color local_24;
undefined1 local_23;
undefined1 local_22;
undefined1 local_21;
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (*(int *)(ZombieSpawnMobsFromSelectedSet._28_4_ + 0x30) == 0) {
local_2ac = (int *)CollectSpawnAreas(this,*(undefined4 *)(this + 0x214));
}
else {
local_2ac = (int *)CNavMesh::GetSelectedSet(TheNavMesh);
}
*(undefined4 *)(this + 0x1dc) = 0;
if (1 < *(int *)(ZombieDebugMobSpawn._28_4_ + 0x30)) {
CNavMesh::ClearSelectedSet(TheNavMesh);
}
if (local_2ac[3] == 0) {
pcVar20 = (char *)TheDirector;
if (*(int *)(this + 0x214) == 0) {
cVar6 = CDirector::IsFinale(TheDirector);
if (((cVar6 != '\0') ||
(pcVar20 = (char *)TheDirector, cVar6 = CDirector::AreAllSurvivorsInFinaleArea(),
cVar6 == '\0')) && (**(char **)(TheDirector + 0x640) == '\0')) {
DevMsg("(MOB) %3.2f: MOB SPAWN ERROR: ANYWHERE = Empty spawn area set\n",
(double)*(float *)(gpGlobals + 0xc));
pcVar20 = "(MOB) %3.2f: MOB SPAWN ERROR: ANYWHERE = Empty spawn area set\n";
UTIL_LogPrintf("(MOB) %3.2f: MOB SPAWN ERROR: ANYWHERE = Empty spawn area set\n",
(double)*(float *)(gpGlobals + 0xc));
}
*(undefined4 *)(this + 0x1f0) = 0;
}
else {
cVar6 = CDirector::IsFinale(TheDirector);
if (((cVar6 != '\0') ||
(pcVar20 = (char *)TheDirector, cVar6 = CDirector::AreAllSurvivorsInFinaleArea(),
cVar6 == '\0')) && (**(char **)(TheDirector + 0x640) == '\0')) {
DevMsg("(MOB) %3.2f: MOB SPAWN ERROR: Empty spawn area set, switching to ANYWHERE\n",
(double)*(float *)(gpGlobals + 0xc));
pcVar20 = "(MOB) %3.2f: MOB SPAWN ERROR: Empty spawn area set, switching to ANYWHERE\n";
UTIL_LogPrintf("(MOB) %3.2f: MOB SPAWN ERROR: Empty spawn area set, switching to ANYWHERE\n"
,(double)*(float *)(gpGlobals + 0xc));
}
*(undefined4 *)(this + 0x214) = 0;
*(undefined4 *)(this + 0x1f0) = 0;
}
}
else {
local_23c = local_22c;
local_2c = 0;
local_230 = 0;
local_238 = 0x80;
local_234 = 0xffffffff;
local_28 = local_23c;
/* try { // try from 00a60a0a to 00a60a0e has its CatchHandler @ 00a614d9 */
CUtlVector<float,CUtlMemoryFixedGrowable<float,128u,int>>::EnsureCount
((CUtlVector<float,CUtlMemoryFixedGrowable<float,128u,int>> *)&local_23c,local_2ac[3])
;
local_28c = 0;
local_288 = 0;
local_284 = 0;
local_280 = 0;
local_27c = 0;
/* try { // try from 00a60eb3 to 00a60eb7 has its CatchHandler @ 00a60eae */
if (((*(int *)(this + 0x214) == 9) &&
(ForEachSurvivor<SurvivorCollector>((SurvivorCollector *)&local_28c),
*(int *)(this + 0x214) == 9)) && (local_280 != 0)) {
local_278[0] = 0;
local_278[1] = 0;
local_278[2] = 0;
local_278[3] = 0;
local_278[4] = 0;
/* try { // try from 00a60f14 to 00a60f18 has its CatchHandler @ 00a614d5 */
ForEachSurvivor<SurvivorCollector>((SurvivorCollector *)local_278);
local_264 = local_254;
local_260 = 4;
local_25c = 0xffffffff;
local_258 = 0;
local_244 = 0;
local_240 = local_264;
if (0 < local_278[3]) {
iVar7 = 0;
do {
iVar12 = iVar7 * 4;
pCVar11 = (CBaseEntity *)
CDirectorTacticalServices::GetClosestSurvivor
(*(CDirectorTacticalServices **)(TheDirector + 0x628),
*(CBaseCombatCharacter **)(local_278[0] + iVar7 * 4),true,true);
if (pCVar11 == (CBaseEntity *)0x0) {
LAB_00a6100f:
/* try { // try from 00a61032 to 00a6132f has its CatchHandler @ 00a61456 */
CUtlVector<CTerrorPlayer*,CUtlMemoryFixedGrowable<CTerrorPlayer*,4u,int>>::InsertBefore
((CUtlVector<CTerrorPlayer*,CUtlMemoryFixedGrowable<CTerrorPlayer*,4u,int>> *)
&local_264,local_244,(CTerrorPlayer **)(iVar12 + local_278[0]));
}
else {
pCVar5 = *(CBaseEntity **)(local_278[0] + iVar12);
if (((byte)pCVar5[0x14d] & 8) == 0) {
if (((byte)pCVar11[0x14d] & 8) == 0) goto LAB_00a60f85;
LAB_00a610b6:
CBaseEntity::CalcAbsolutePosition(pCVar11);
local_294 = (*(float *)(pCVar11 + 0x2e4) - *(float *)(pCVar5 + 0x2e4)) *
(*(float *)(pCVar11 + 0x2e4) - *(float *)(pCVar5 + 0x2e4)) +
(*(float *)(pCVar11 + 0x2e0) - *(float *)(pCVar5 + 0x2e0)) *
(*(float *)(pCVar11 + 0x2e0) - *(float *)(pCVar5 + 0x2e0));
if (((byte)pCVar11[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar11);
}
}
else {
CBaseEntity::CalcAbsolutePosition(pCVar5);
if (((byte)pCVar11[0x14d] & 8) != 0) goto LAB_00a610b6;
LAB_00a60f85:
local_294 = (*(float *)(pCVar11 + 0x2e4) - *(float *)(pCVar5 + 0x2e4)) *
(*(float *)(pCVar11 + 0x2e4) - *(float *)(pCVar5 + 0x2e4)) +
(*(float *)(pCVar11 + 0x2e0) - *(float *)(pCVar5 + 0x2e0)) *
(*(float *)(pCVar11 + 0x2e0) - *(float *)(pCVar5 + 0x2e0));
}
fVar16 = *(float *)(pCVar11 + 0x2e8);
pCVar11 = *(CBaseEntity **)(local_278[0] + iVar12);
if (((byte)pCVar11[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar11);
}
if ((1e+06 < local_294) || (120.0 < ABS(fVar16 - *(float *)(pCVar11 + 0x2e8))))
goto LAB_00a6100f;
}
iVar7 = iVar7 + 1;
} while (iVar7 < local_278[3]);
}
local_2b4 = (CUtlMemory<CTerrorPlayer*,int> *)&local_264;
if (local_2ac[3] < 1) {
local_2a8 = 0.0;
}
else {
local_2b8 = 0;
local_2a8 = 0.0;
do {
iVar12 = local_2b8 * 4;
iVar7 = *(int *)(*local_2ac + local_2b8 * 4);
fVar16 = *(float *)(iVar7 + 0x14);
fVar1 = *(float *)(iVar7 + 0x10);
fVar2 = *(float *)(iVar7 + 8);
fVar3 = *(float *)(iVar7 + 4);
if (local_278[3] < 1) {
local_2a4 = 0;
fVar19 = *(float *)(iVar7 + 0x34);
fVar17 = 1.0;
local_2a0 = 1.1754944e-38;
}
else {
local_2a4 = 0;
iVar14 = 0;
local_2a0 = 1.1754944e-38;
local_298 = 3.4028235e+38;
do {
iVar8 = iVar14 * 4;
pCVar11 = *(CBaseEntity **)(local_278[0] + iVar14 * 4);
if ((*(uint *)(pCVar11 + 0x14c) & 0x800) == 0) {
if (local_2a0 < *(float *)(pCVar11 + 0x2e8)) {
uVar13 = 0;
local_290 = pCVar11;
goto LAB_00a611e0;
}
}
else {
CBaseEntity::CalcAbsolutePosition(pCVar11);
local_290 = *(CBaseEntity **)(local_278[0] + iVar8);
uVar13 = *(uint *)(local_290 + 0x14c) & 0x800;
pCVar5 = pCVar11 + 0x2e8;
pCVar11 = local_290;
if (local_2a0 < *(float *)pCVar5) {
if (uVar13 != 0) {
CBaseEntity::CalcAbsolutePosition(local_290);
pCVar11 = *(CBaseEntity **)(local_278[0] + iVar8);
uVar13 = *(uint *)(pCVar11 + 0x14c) & 0x800;
}
LAB_00a611e0:
local_2a0 = *(float *)(local_290 + 0x2e8);
}
if (uVar13 != 0) {
CBaseEntity::CalcAbsolutePosition(pCVar11);
}
}
fVar18 = *(float *)(iVar7 + 0x2c) - *(float *)(pCVar11 + 0x2e0);
fVar17 = *(float *)(iVar7 + 0x30) - *(float *)(pCVar11 + 0x2e4);
fVar19 = *(float *)(iVar7 + 0x34);
fVar17 = SQRT(fVar17 * fVar17 + fVar18 * fVar18 +
(fVar19 - *(float *)(pCVar11 + 0x2e8)) *
(fVar19 - *(float *)(pCVar11 + 0x2e8)));
if (fVar17 < local_298) {
local_2a4 = *(int *)(local_278[0] + iVar8);
local_298 = fVar17;
}
iVar14 = iVar14 + 1;
} while (iVar14 < local_278[3]);
if (local_298 <= 0.1) {
local_298 = 0.1;
}
if (1600.0 <= local_298) {
local_298 = 1600.0;
}
fVar17 = local_298 * -0.0025 + 5.0;
}
if (0 < local_244) {
if (local_2a4 != *(int *)local_264) {
iVar7 = 0;
do {
iVar7 = iVar7 + 1;
if (iVar7 == local_244) goto LAB_00a61390;
} while (local_2a4 != *(int *)(local_264 + iVar7 * 4));
if (iVar7 == -1) goto LAB_00a61390;
}
fVar17 = fVar17 * 5.0;
}
LAB_00a61390:
if (ABS(fVar19 - local_2a0) < 120.0) {
fVar17 = fVar17 * 5.0;
}
fVar17 = fVar17 * (fVar1 - fVar3) * (fVar16 - fVar2);
local_2b8 = local_2b8 + 1;
*(float *)(local_23c + iVar12) = fVar17;
local_2a8 = fVar17 + local_2a8;
} while (local_2b8 < local_2ac[3]);
}
local_244 = 0;
CUtlMemory<CTerrorPlayer*,int>::Purge(local_2b4);
local_240 = local_264;
CUtlMemory<CTerrorPlayer*,int>::Purge(local_2b4);
CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>>::~CUtlVector
((CUtlVector<CTerrorPlayer*,CUtlMemory<CTerrorPlayer*,int>> *)local_278);
}
else {
iVar7 = 0;
local_2a8 = 0.0;
if (0 < local_2ac[3]) {
local_2a8 = 0.0;
do {
iVar12 = *(int *)(*local_2ac + iVar7 * 4);
fVar16 = (*(float *)(iVar12 + 0x14) - *(float *)(iVar12 + 8)) *
(*(float *)(iVar12 + 0x10) - *(float *)(iVar12 + 4));
*(float *)(local_23c + iVar7 * 4) = fVar16;
iVar7 = iVar7 + 1;
local_2a8 = local_2a8 + fVar16;
} while (iVar7 < local_2ac[3]);
}
}
local_298 = 0.0;
iVar7 = *(int *)(this + 0x214);
*(undefined4 *)(this + 0x1f0) = 0;
do {
/* try { // try from 00a60b1f to 00a60b23 has its CatchHandler @ 00a60eae */
lVar15 = (longdouble)RandomFloat(0,local_2a8);
if (0 < local_2ac[3]) {
fVar16 = 0.0;
iVar12 = *(int *)(this + 0x1f0);
iVar14 = 0;
while( true ) {
local_264 = *(CNavArea **)(*local_2ac + iVar14 * 4);
if (iVar12 < 1) break;
if (local_264 != (CNavArea *)**(int **)(this + 0x1e4)) {
iVar8 = 0;
do {
iVar8 = iVar8 + 1;
if (iVar8 == iVar12) goto LAB_00a60b9c;
} while (local_264 != (CNavArea *)(*(int **)(this + 0x1e4))[iVar8 * 2]);
}
LAB_00a60bb6:
iVar14 = iVar14 + 1;
if (iVar14 == local_2ac[3]) goto LAB_00a60bc1;
}
LAB_00a60b9c:
fVar16 = fVar16 + *(float *)(local_23c + iVar14 * 4);
if (fVar16 < (float)lVar15) goto LAB_00a60bb6;
iVar8 = iVar12 + 1;
iVar9 = *(int *)(this + 0x1e8);
if (iVar8 <= iVar9) {
pvVar10 = *(void **)(this + 0x1e4);
goto LAB_00a60c63;
}
iVar4 = *(int *)(this + 0x1ec);
if (iVar4 < 0) {
pvVar10 = *(void **)(this + 0x1e4);
goto LAB_00a60c63;
}
if (iVar4 != 0) {
for (iVar9 = (iVar12 / iVar4 + 1) * iVar4; iVar9 < iVar8; iVar9 = (iVar9 + iVar8) / 2) {
}
goto LAB_00a60dde;
}
if (iVar9 != 0) goto LAB_00a60e2e;
if (iVar8 < 5) {
iVar9 = 4;
}
else {
iVar9 = 4;
LAB_00a60e2e:
do {
iVar9 = iVar9 * 2;
} while (iVar9 < iVar8);
}
LAB_00a60dde:
*(int *)(this + 0x1e8) = iVar9;
if (*(void **)(this + 0x1e4) == (void *)0x0) {
pvVar10 = malloc(iVar9 << 3);
*(void **)(this + 0x1e4) = pvVar10;
}
else {
pvVar10 = realloc(*(void **)(this + 0x1e4),iVar9 << 3);
*(void **)(this + 0x1e4) = pvVar10;
iVar8 = *(int *)(this + 0x1f0) + 1;
}
LAB_00a60c63:
*(int *)(this + 0x1f0) = iVar8;
*(void **)(this + 500) = pvVar10;
iVar8 = (iVar8 - iVar12) + -1;
iVar12 = iVar12 * 8;
if (0 < iVar8) {
_V_memmove((void *)((int)pvVar10 + iVar12 + 8),(void *)((int)pvVar10 + iVar12),iVar8 * 8);
pvVar10 = *(void **)(this + 0x1e4);
}
*(CNavArea **)((int)pvVar10 + iVar12) = local_264;
*(int *)(*(int *)(this + 0x1e4) + 4 + iVar12) =
(int)((*(float *)(local_264 + 0x10) - *(float *)(local_264 + 4)) *
(*(float *)(local_264 + 0x14) - *(float *)(local_264 + 8)) *
*(float *)(ZombieMobPopulationDensity._28_4_ + 0x2c));
/* try { // try from 00a60ceb to 00a60d9c has its CatchHandler @ 00a60e60 */
CUtlVector<TerrorNavArea*,CUtlMemory<TerrorNavArea*,int>>::InsertBefore
((CUtlVector<TerrorNavArea*,CUtlMemory<TerrorNavArea*,int>> *)(this + 0x1d0),
*(int *)(this + 0x1dc),(TerrorNavArea **)&local_264);
if (*(int *)(ZombieDebugMobSpawn._28_4_ + 0x30) != 0) {
if (1 < *(int *)(ZombieDebugMobSpawn._28_4_ + 0x30)) {
CNavMesh::AddToSelectedSet(TheNavMesh,local_264);
}
local_24 = 0xff;
local_23 = 0x80;
local_22 = 0;
local_21 = 0xff;
ConColorMsg(&local_24,
"ChooseMobSpawnAreas: m_mobSpawnAreas[%d].pArea %d has %d population\n");
}
local_2a8 = local_2a8 - *(float *)(local_23c + iVar14 * 4);
}
LAB_00a60bc1:
local_298 = (float)((int)local_298 + 1);
} while ((int)local_298 < (int)((uint)(iVar7 == 9) * 2 + 2));
local_280 = 0;
CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)&local_28c);
local_27c = local_28c;
CUtlMemory<CTerrorPlayer*,int>::Purge((CUtlMemory<CTerrorPlayer*,int> *)&local_28c);
local_2c = 0;
CUtlMemory<float,int>::Purge((CUtlMemory<float,int> *)&local_23c);
local_28 = local_23c;
pcVar20 = (char *)&local_23c;
CUtlMemory<float,int>::Purge((CUtlMemory<float,int> *)pcVar20);
}
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail(pcVar20);
}
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.