CNavMesh::GetNavAreasInRadius
0x007427e0 · 1166 bytes · __thiscall
_ZN8CNavMesh19GetNavAreasInRadiusERK6VectorfP9HSCRIPT__
Decompiled
undefined (4 params)
/* CNavMesh::GetNavAreasInRadius(Vector const&, float, HSCRIPT__*) */
void __thiscall
CNavMesh::GetNavAreasInRadius(CNavMesh *this,Vector *param_1,float param_2,HSCRIPT__ *param_3)
{
int *piVar1;
CNavArea *pCVar2;
code *pcVar3;
int iVar4;
int iVar5;
int iVar6;
int iVar7;
int iVar8;
int iVar9;
int iVar10;
int iVar11;
int in_GS_OFFSET;
float fVar12;
int local_16c;
CNavArea *local_154;
void *local_150 [2];
undefined2 local_148;
ushort local_146;
char local_144;
int *local_140;
undefined4 local_13c;
undefined4 local_138;
int local_134;
int *local_130;
CFmtStrN<256> local_12c [5];
undefined1 local_127 [263];
int local_20;
iVar11 = TheNavMesh;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (param_3 != (HSCRIPT__ *)0x0) {
local_140 = (int *)0x0;
local_13c = 0;
local_138 = 0;
local_134 = 0;
local_130 = (int *)0x0;
local_144 = '\0';
if ((ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::searchMarker
== '\0') &&
(iVar5 = __cxa_guard_acquire(&ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)
::searchMarker), iVar5 != 0)) {
/* try { // try from 00742c63 to 00742c67 has its CatchHandler @ 00742c8c */
ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::searchMarker =
RandomInt(0,0x100000);
__cxa_guard_release(&ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)
::searchMarker);
}
iVar5 = ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::
searchMarker + 1;
if (ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::searchMarker +
1 == 0) {
iVar5 = ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::
searchMarker + 2;
}
ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::searchMarker =
iVar5;
fVar12 = 1.0 / *(float *)(iVar11 + 0x20);
iVar5 = (int)((*(float *)param_1 - *(float *)(iVar11 + 0x2c)) * fVar12);
if (iVar5 < 0) {
iVar5 = 0;
}
else if (*(int *)(iVar11 + 0x24) <= iVar5) {
iVar5 = *(int *)(iVar11 + 0x24) + -1;
}
iVar9 = (int)((*(float *)(param_1 + 4) - *(float *)(iVar11 + 0x30)) * fVar12);
if (iVar9 < 0) {
iVar9 = 0;
}
else if (*(int *)(iVar11 + 0x28) <= iVar9) {
iVar9 = *(int *)(iVar11 + 0x28) + -1;
}
iVar7 = (int)(fVar12 * param_2);
if ((float)iVar7 < fVar12 * param_2) {
iVar7 = iVar7 + 1;
}
if (param_2 == 0.0) {
iVar7 = *(int *)(iVar11 + 0x28);
if (*(int *)(iVar11 + 0x28) < *(int *)(iVar11 + 0x24)) {
iVar7 = *(int *)(iVar11 + 0x24);
}
}
local_16c = local_134;
for (iVar6 = iVar5 - iVar7; iVar6 <= iVar5 + iVar7; iVar6 = iVar6 + 1) {
if ((-1 < iVar6) && (iVar4 = iVar9 - iVar7, iVar6 < *(int *)(iVar11 + 0x24))) {
for (; iVar4 <= iVar7 + iVar9; iVar4 = iVar4 + 1) {
if (((-1 < iVar4) && (iVar4 < *(int *)(iVar11 + 0x28))) &&
(piVar1 = (int *)(*(int *)(iVar11 + 0xc) +
(iVar4 * *(int *)(iVar11 + 0x24) + iVar6) * 0x14), 0 < piVar1[3])) {
iVar10 = 0;
LAB_007429f4:
do {
pCVar2 = *(CNavArea **)(*piVar1 + iVar10 * 4);
if ((*(int *)(pCVar2 + 0x74) !=
ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::
searchMarker) &&
((*(int *)(pCVar2 + 0x74) =
ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)
::searchMarker,
(*(float *)(pCVar2 + 0x30) - *(float *)(param_1 + 4)) *
(*(float *)(pCVar2 + 0x30) - *(float *)(param_1 + 4)) +
(*(float *)(pCVar2 + 0x2c) - *(float *)param_1) *
(*(float *)(pCVar2 + 0x2c) - *(float *)param_1) +
(*(float *)(pCVar2 + 0x34) - *(float *)(param_1 + 8)) *
(*(float *)(pCVar2 + 0x34) - *(float *)(param_1 + 8)) <= param_2 * param_2 ||
(param_2 * param_2 == 0.0)))) {
local_154 = pCVar2;
if ((local_144 == '\0') || (local_16c < 1)) {
LAB_00742a96:
/* try { // try from 00742ab3 to 00742b27 has its CatchHandler @ 00742cbc */
CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&local_140,local_16c
,&local_154);
iVar10 = iVar10 + 1;
local_16c = local_134;
if (piVar1[3] <= iVar10) break;
goto LAB_007429f4;
}
if (pCVar2 != (CNavArea *)*local_140) {
iVar8 = 0;
do {
iVar8 = iVar8 + 1;
if (iVar8 == local_16c) goto LAB_00742a96;
} while (pCVar2 != (CNavArea *)local_140[iVar8]);
if (iVar8 < 0) goto LAB_00742a96;
}
}
iVar10 = iVar10 + 1;
} while (iVar10 < piVar1[3]);
}
}
}
}
iVar11 = 0;
if (0 < local_16c) {
do {
pcVar3 = *(code **)(*g_pScriptVM + 0x78);
if ((TerrorNavArea *)local_140[iVar11] == (TerrorNavArea *)0x0) {
local_150[0] = (void *)0x0;
}
else {
local_150[0] = (void *)TerrorNavArea::GetScriptInstance
((TerrorNavArea *)local_140[iVar11]);
}
local_148 = 0x20;
local_146 = 0;
/* try { // try from 00742b5e to 00742b84 has its CatchHandler @ 00742cc0 */
CFmtStrN<256>::CFmtStrN(local_12c,"area%i",iVar11);
(*pcVar3)(g_pScriptVM,param_3,local_127,local_150);
if ((local_146 & 1) != 0) {
free(local_150[0]);
}
iVar11 = iVar11 + 1;
} while (iVar11 < local_134);
}
local_134 = 0;
CUtlMemory<CNavArea*,int>::Purge((CUtlMemory<CNavArea*,int> *)&local_140);
local_130 = local_140;
CUtlMemory<CNavArea*,int>::Purge((CUtlMemory<CNavArea*,int> *)&local_140);
}
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
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.