ZombieManager::AddToPositionalSpawnSet
0x00a5c650 · 662 bytes · __thiscall
_ZN13ZombieManager23AddToPositionalSpawnSetEbRK6Vectorf
Decompiled
undefined (4 params)
/* ZombieManager::AddToPositionalSpawnSet(bool, Vector const&, float) */
void __thiscall
ZombieManager::AddToPositionalSpawnSet
(ZombieManager *this,bool param_1,Vector *param_2,float param_3)
{
int *piVar1;
int iVar2;
int iVar3;
int iVar4;
int iVar5;
int iVar6;
int iVar7;
int iVar8;
float fVar9;
CNavArea *local_20 [4];
if (param_1) {
*(undefined4 *)(this + 0x270) = 0;
}
iVar3 = TheNavMesh;
if ((CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)::
searchMarker == '\0') &&
(iVar4 = __cxa_guard_acquire(&CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
::searchMarker), iVar4 != 0)) {
/* try { // try from 00a5c8c3 to 00a5c8c7 has its CatchHandler @ 00a5c8ec */
CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)::
searchMarker = RandomInt(0,0x100000);
__cxa_guard_release(&CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
::searchMarker);
}
iVar4 = CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)::
searchMarker + 1;
if (CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)::
searchMarker + 1 == 0) {
iVar4 = CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
::searchMarker + 2;
}
CNavMesh::ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
::searchMarker = iVar4;
fVar9 = 1.0 / *(float *)(iVar3 + 0x20);
iVar4 = (int)((*(float *)param_2 - *(float *)(iVar3 + 0x2c)) * fVar9);
if (iVar4 < 0) {
iVar4 = 0;
}
else if (*(int *)(iVar3 + 0x24) <= iVar4) {
iVar4 = *(int *)(iVar3 + 0x24) + -1;
}
iVar7 = (int)((*(float *)(param_2 + 4) - *(float *)(iVar3 + 0x30)) * fVar9);
if (iVar7 < 0) {
iVar7 = 0;
}
else if (*(int *)(iVar3 + 0x28) <= iVar7) {
iVar7 = *(int *)(iVar3 + 0x28) + -1;
}
iVar6 = (int)(fVar9 * param_3);
if ((float)iVar6 < fVar9 * param_3) {
iVar6 = iVar6 + 1;
}
if (param_3 == 0.0) {
iVar6 = *(int *)(iVar3 + 0x28);
if (*(int *)(iVar3 + 0x28) < *(int *)(iVar3 + 0x24)) {
iVar6 = *(int *)(iVar3 + 0x24);
}
}
iVar5 = iVar4 - iVar6;
do {
if (iVar4 + iVar6 < iVar5) {
return;
}
if ((-1 < iVar5) && (iVar2 = iVar7 - iVar6, iVar5 < *(int *)(iVar3 + 0x24))) {
for (; iVar2 <= iVar6 + iVar7; iVar2 = iVar2 + 1) {
if (((-1 < iVar2) && (iVar2 < *(int *)(iVar3 + 0x28))) &&
(piVar1 = (int *)(*(int *)(iVar3 + 0xc) + (*(int *)(iVar3 + 0x24) * iVar2 + iVar5) * 0x14
), 0 < piVar1[3])) {
iVar8 = 0;
do {
while ((local_20[0] = *(CNavArea **)(*piVar1 + iVar8 * 4),
*(int *)(local_20[0] + 0x74) !=
CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
::searchMarker &&
((*(int *)(local_20[0] + 0x74) =
CNavMesh::
ForAllAreasInRadius<CollectPositionalAreas>(CollectPositionalAreas&,Vector_const&,float)
::searchMarker,
(*(float *)(local_20[0] + 0x2c) - *(float *)param_2) *
(*(float *)(local_20[0] + 0x2c) - *(float *)param_2) +
(*(float *)(local_20[0] + 0x34) - *(float *)(param_2 + 8)) *
(*(float *)(local_20[0] + 0x34) - *(float *)(param_2 + 8)) +
(*(float *)(local_20[0] + 0x30) - *(float *)(param_2 + 4)) *
(*(float *)(local_20[0] + 0x30) - *(float *)(param_2 + 4)) <= param_3 * param_3
|| (param_3 * param_3 == 0.0))))) {
iVar8 = iVar8 + 1;
CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)(this + 0x264),
*(int *)(this + 0x270),local_20);
if (piVar1[3] <= iVar8) goto LAB_00a5c86f;
}
iVar8 = iVar8 + 1;
} while (iVar8 < piVar1[3]);
}
LAB_00a5c86f:
}
}
iVar5 = iVar5 + 1;
} while( true );
}
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.