NavAreaBuildPath<SurvivorPathCost>
0x0096c920 · 2483 bytes · __cdecl
_Z16NavAreaBuildPathI16SurvivorPathCostEbP8CNavAreaS2_PK6VectorS5_RT_PS2_fib
Decompiled
bool (9 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* bool NavAreaBuildPath<SurvivorPathCost>(CNavArea*, CNavArea*, Vector const*, Vector const*,
SurvivorPathCost&, CNavArea**, float, int, bool) */
bool NavAreaBuildPath<SurvivorPathCost>
(CNavArea *param_1,CNavArea *param_2,Vector *param_3,Vector *param_4,
SurvivorPathCost *param_5,CNavArea **param_6,float param_7,int param_8,bool param_9)
{
uint *puVar1;
float fVar2;
float fVar3;
float fVar4;
float fVar5;
float fVar6;
float fVar7;
int iVar8;
int iVar9;
char cVar10;
CNavArea *pCVar11;
int iVar12;
int *piVar13;
int iVar14;
bool bVar15;
CNavArea *this;
longdouble lVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
float fVar21;
undefined1 auVar22 [16];
float fVar23;
float local_80;
int local_6c;
char local_66;
CNavArea *local_64;
int local_5c;
CFuncElevator *local_58;
CNavArea *local_54;
float local_50;
CNavLadder *local_4c;
int local_48;
int local_40;
undefined4 local_34;
undefined4 local_30;
undefined4 local_28;
undefined4 local_24;
int local_20;
local_34 = 0;
local_30 = 0;
if (_towlower == 0) {
local_20 = 0;
}
else {
(**(code **)(_towlower + 0x50))
(_towlower,&local_34,0,0,0,0,"/data/src/game/server/nav_pathfind.h",0x67,
&NavAreaBuildPath<SurvivorPathCost>(CNavArea*,CNavArea*,Vector_const*,Vector_const*,SurvivorPathCost&,CNavArea**,float,int,bool)
::tm_fmt,"(%s)%s","NavAreaBuildPath","NavAreaBuildPath");
local_20 = _towlower;
}
iVar9 = _DAT_0105db00;
local_28 = local_34;
local_24 = local_30;
/* try { // try from 0096ccce to 0096cd2e has its CatchHandler @ 0096d340 */
if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
(iVar12 = ThreadGetCurrentId(), iVar9 == iVar12)) {
if ((char *)*_DAT_0105d15c != "NavAreaBuildPath") {
_DAT_0105d15c =
(int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xca5c91,(char *)0x0,0xca5c91);
}
puVar1 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
*puVar1 = *puVar1 | 4;
CVProfNode::EnterScope();
DAT_0105d158 = '\0';
}
if (param_6 != (CNavArea **)0x0) {
*param_6 = param_1;
}
iVar9 = g_DebugPathfindCounter;
g_DebugPathfindCounter = g_DebugPathfindCounter + -1;
if (param_1 != (CNavArea *)0x0) {
/* try { // try from 0096ca1e to 0096cc52 has its CatchHandler @ 0096d31f */
if ((param_2 == (CNavArea *)0x0) ||
(local_66 = CNavArea::IsBlocked(param_2,param_8,param_9), local_66 == '\0')) {
local_66 = param_2 == (CNavArea *)0x0;
if ((bool)local_66) goto LAB_0096cda1;
}
else {
param_2 = (CNavArea *)0x0;
if (local_66 != '\0') {
LAB_0096cda1:
if (param_4 == (Vector *)0x0) goto LAB_0096cc65;
}
}
*(undefined4 *)(param_1 + 0x78) = 0;
param_1[0x7c] = (CNavArea)((byte)param_1[0x7c] & 0xf0 | 9);
if (param_1 == param_2) {
LAB_0096d2dd:
bVar15 = true;
goto LAB_0096cc67;
}
pCVar11 = param_1 + 0x2c;
if (param_3 != (Vector *)0x0) {
pCVar11 = (CNavArea *)param_3;
}
fVar2 = *(float *)pCVar11;
fVar3 = *(float *)(pCVar11 + 8);
fVar4 = *(float *)(pCVar11 + 4);
pCVar11 = param_2 + 0x2c;
if (param_4 != (Vector *)0x0) {
pCVar11 = (CNavArea *)param_4;
}
fVar5 = *(float *)pCVar11;
fVar6 = *(float *)(pCVar11 + 4);
fVar7 = *(float *)(pCVar11 + 8);
CNavArea::ClearSearchLists();
*(float *)(param_1 + 0x40) =
SQRT((*(float *)(param_1 + 0x30) - fVar6) * (*(float *)(param_1 + 0x30) - fVar6) +
(*(float *)(param_1 + 0x34) - fVar7) * (*(float *)(param_1 + 0x34) - fVar7) +
(*(float *)(param_1 + 0x2c) - fVar5) * (*(float *)(param_1 + 0x2c) - fVar5));
lVar16 = (longdouble)
SurvivorPathCost::operator()
(param_5,param_1,(CNavArea *)0x0,(CNavLadder *)0x0,(CFuncElevator *)0x0,-1.0)
;
if (0.0 <= (float)lVar16) {
*(float *)(param_1 + 0x44) = (float)lVar16;
*(undefined4 *)(param_1 + 0x80) = 0;
CNavArea::AddToOpenList(param_1);
if (param_6 != (CNavArea **)0x0) {
*param_6 = param_1;
}
fVar17 = fVar5 - fVar2;
fVar23 = fVar7 - fVar3;
fVar19 = fVar6 - fVar4;
local_80 = *(float *)(param_1 + 0x40);
LAB_0096cc5b:
do {
pCVar11 = CNavArea::m_openList;
if (CNavArea::m_openList == (CNavArea *)0x0) break;
CNavArea::RemoveFromOpenList(CNavArea::m_openList);
*(undefined4 *)(pCVar11 + 0x4c) = 0;
*(undefined4 *)(pCVar11 + 0x48) = 0;
if (0 < iVar9) {
(**(code **)(*(int *)pCVar11 + 0x54))(pCVar11,0,0xff,0,0x80,0x41f00000,1);
}
cVar10 = CNavArea::IsBlocked(pCVar11,param_8,param_9);
if (cVar10 == '\0') {
if ((param_2 != pCVar11) &&
(((local_66 == '\0' || (param_4 == (Vector *)0x0)) ||
(cVar10 = CNavArea::Contains(pCVar11,param_4), cVar10 == '\0')))) {
local_54 = pCVar11 + 0x58;
local_6c = 0;
iVar12 = 0;
local_64 = (CNavArea *)0x0;
bVar15 = true;
local_48 = 0;
local_40 = 0;
LAB_0096cdf0:
if (local_40 != 0) goto LAB_0096cfe8;
do {
piVar13 = *(int **)local_54;
if (*piVar13 <= iVar12) {
do {
local_48 = local_48 + 1;
if (local_48 == 4) {
local_64 = pCVar11 + 0x68;
local_6c = 0;
iVar12 = 0;
local_40 = 1;
goto LAB_0096d0a0;
}
iVar12 = 0;
local_54 = pCVar11 + local_48 * 4 + 0x58;
piVar13 = *(int **)local_54;
} while (*piVar13 < 1);
}
this = (CNavArea *)piVar13[iVar12 * 2 + 1];
if ((param_1 == pCVar11) || (this == param_2)) {
if (param_1 == pCVar11) {
local_50 = SQRT(fVar17 * fVar17 + fVar23 * fVar23 + fVar19 * fVar19);
if (this == param_2) goto LAB_0096ce49;
fVar20 = *(float *)(this + 0x2c) - fVar2;
fVar18 = *(float *)(this + 0x30) - fVar4;
fVar21 = *(float *)(this + 0x34) - fVar3;
}
else {
fVar21 = fVar5 - *(float *)(pCVar11 + 0x2c);
fVar20 = fVar6 - *(float *)(pCVar11 + 0x30);
fVar18 = fVar7 - *(float *)(pCVar11 + 0x34);
}
local_50 = SQRT(fVar18 * fVar18 + fVar20 * fVar20 + fVar21 * fVar21);
}
else {
local_50 = (float)piVar13[iVar12 * 2 + 2];
}
LAB_0096ce49:
iVar12 = iVar12 + 1;
local_58 = (CFuncElevator *)0x0;
local_4c = (CNavLadder *)0x0;
local_5c = local_48;
while( true ) {
/* try { // try from 0096ce75 to 0096d300 has its CatchHandler @ 0096d31f */
if ((this == pCVar11) ||
(cVar10 = CNavArea::IsBlocked(this,param_8,param_9), cVar10 != '\0'))
goto LAB_0096cdf0;
lVar16 = (longdouble)
SurvivorPathCost::operator()
(param_5,this,pCVar11,local_4c,local_58,local_50);
fVar21 = (float)lVar16;
if (fVar21 < 0.0) goto LAB_0096cdf0;
if (0.0 < param_7) {
fVar18 = SQRT((*(float *)(this + 0x30) - *(float *)(pCVar11 + 0x30)) *
(*(float *)(this + 0x30) - *(float *)(pCVar11 + 0x30)) +
(*(float *)(this + 0x34) - *(float *)(pCVar11 + 0x34)) *
(*(float *)(this + 0x34) - *(float *)(pCVar11 + 0x34)) +
(*(float *)(this + 0x2c) - *(float *)(pCVar11 + 0x2c)) *
(*(float *)(this + 0x2c) - *(float *)(pCVar11 + 0x2c))) +
*(float *)(pCVar11 + 0x80);
if (param_7 < fVar18) goto LAB_0096cdf0;
*(float *)(this + 0x80) = fVar18;
}
iVar14 = *(int *)(this + 0x50);
if (((iVar14 == CNavArea::m_masterMarker) ||
(CNavArea::m_masterMarker == *(int *)(this + 0x3c))) &&
(*(float *)(this + 0x44) <= fVar21)) goto LAB_0096cdf0;
fVar18 = (*(float *)(this + 0x34) - fVar7) * (*(float *)(this + 0x34) - fVar7) +
(*(float *)(this + 0x2c) - fVar5) * (*(float *)(this + 0x2c) - fVar5) +
(*(float *)(this + 0x30) - fVar6) * (*(float *)(this + 0x30) - fVar6);
fVar20 = 0.0;
if (0.0 < fVar18) {
auVar22 = rsqrtss(ZEXT416((uint)fVar18),ZEXT416((uint)fVar18));
fVar20 = auVar22._0_4_ * fVar18;
}
if ((fVar20 < local_80) && (param_6 != (CNavArea **)0x0)) {
*param_6 = this;
iVar14 = *(int *)(this + 0x50);
local_80 = fVar20;
}
iVar8 = CNavArea::m_masterMarker;
*(float *)(this + 0x44) = fVar21;
*(float *)(this + 0x40) = fVar21 + fVar20;
if (iVar14 == iVar8) {
CNavArea::UpdateOnOpenList(this);
}
else {
CNavArea::AddToOpenList(this);
}
*(CNavArea **)(this + 0x78) = pCVar11;
this[0x7c] = (CNavArea)((byte)this[0x7c] & 0xf0 | (byte)local_5c & 0xf);
if (local_40 == 0) break;
LAB_0096cfe8:
if (local_40 == 1) {
LAB_0096d0a0:
do {
piVar13 = *(int **)local_64;
if (*piVar13 <= iVar12) {
do {
if (!bVar15) {
iVar12 = 0;
local_40 = 2;
goto LAB_0096cff2;
}
local_64 = pCVar11 + 0x6c;
iVar12 = 0;
bVar15 = false;
piVar13 = *(int **)local_64;
} while (*piVar13 < 1);
}
local_4c = (CNavLadder *)piVar13[iVar12 + 1];
if (bVar15) {
if (local_6c == 0) {
this = *(CNavArea **)(local_4c + 0x24);
}
else if (local_6c == 1) {
this = *(CNavArea **)(local_4c + 0x28);
}
else {
if (local_6c != 2) {
iVar12 = iVar12 + 1;
local_6c = 0;
goto LAB_0096d0a0;
}
this = *(CNavArea **)(local_4c + 0x2c);
}
local_6c = local_6c + 1;
local_5c = 4;
}
else {
this = *(CNavArea **)(local_4c + 0x34);
iVar12 = iVar12 + 1;
local_5c = 5;
}
} while (this == (CNavArea *)0x0);
local_58 = (CFuncElevator *)0x0;
local_50 = -1.0;
}
else {
LAB_0096cff2:
if (((byte)pCVar11[0x57] & 0x40) == 0) {
LAB_0096d1e7:
*(int *)(pCVar11 + 0x3c) = CNavArea::m_masterMarker;
goto LAB_0096cc5b;
}
if (CNavArea::GetElevatorAreas()::empty == '\0') {
iVar14 = __cxa_guard_acquire(&CNavArea::GetElevatorAreas()::empty);
if (iVar14 != 0) {
if ((CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
::StaticData()::staticData == '\0') &&
(iVar14 = __cxa_guard_acquire(&
CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
::StaticData()::staticData), iVar14 != 0)) {
__cxa_guard_release(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
::StaticData()::staticData);
}
CNavArea::GetElevatorAreas()::empty =
&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
::StaticData()::staticData;
__cxa_guard_release(&CNavArea::GetElevatorAreas()::empty);
__cxa_atexit(CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
::~CUtlVectorUltraConservative,
&CNavArea::GetElevatorAreas()::empty,&__dso_handle);
}
if ((*(uint *)(pCVar11 + 0x54) & 0x40000000) == 0) goto LAB_0096d1e7;
}
local_58 = *(CFuncElevator **)(pCVar11 + 0x84);
if ((local_58 == (CFuncElevator *)0x0) || (**(int **)(pCVar11 + 0x88) <= iVar12))
goto LAB_0096d1e7;
this = (CNavArea *)(*(int **)(pCVar11 + 0x88))[iVar12 * 2 + 1];
iVar12 = iVar12 + 1;
local_4c = (CNavLadder *)0x0;
if (*(float *)(this + 0x34) < *(float *)(pCVar11 + 0x34) ||
*(float *)(this + 0x34) == *(float *)(pCVar11 + 0x34)) {
local_5c = 8;
local_50 = -1.0;
}
else {
local_5c = 7;
local_50 = -1.0;
}
}
}
} while( true );
}
if (param_6 == (CNavArea **)0x0) goto LAB_0096d2dd;
bVar15 = true;
*param_6 = pCVar11;
goto LAB_0096cc67;
}
} while( true );
}
}
LAB_0096cc65:
bVar15 = false;
LAB_0096cc67:
iVar9 = _DAT_0105db00;
if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
(iVar12 = ThreadGetCurrentId(), iVar9 == iVar12)) {
cVar10 = CVProfNode::ExitScope();
if (cVar10 != '\0') {
_DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
}
DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
}
if (local_20 != 0) {
(**(code **)(local_20 + 0x54))(local_20,local_28,local_24,0,0,0);
}
return bVar15;
}
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.