TerrorNavMesh::ComputeDirectedFlowDistances
0x0097dd20 · 2856 bytes · __thiscall
_ZN13TerrorNavMesh28ComputeDirectedFlowDistancesEN13TerrorNavArea8FlowTypeEPS0_S2_
Decompiled
undefined (4 params)
/* TerrorNavMesh::ComputeDirectedFlowDistances(TerrorNavArea::FlowType, TerrorNavArea*,
TerrorNavArea*) */
undefined4 __thiscall
TerrorNavMesh::ComputeDirectedFlowDistances
(TerrorNavMesh *this,int param_2,CNavArea *param_3,CNavArea *param_4)
{
float fVar1;
CNavArea CVar2;
CNavArea *pCVar3;
undefined4 *puVar4;
NavConnect *pNVar5;
int iVar6;
CNavArea *pCVar7;
bool bVar8;
char cVar9;
int iVar10;
int *piVar11;
int iVar12;
undefined4 uVar13;
byte bVar14;
uint uVar15;
undefined *puVar16;
CNavArea *pCVar17;
int iVar18;
int iVar19;
CNavArea *pCVar20;
bool bVar21;
longdouble lVar22;
float fVar23;
float fVar24;
float fVar25;
float local_1a4;
float local_194;
float local_184;
NavConnect *local_174 [16];
undefined1 *local_134;
undefined4 local_130;
undefined4 local_12c;
undefined4 local_128;
undefined1 local_124 [256];
int local_24;
undefined1 *local_20;
*(CNavArea **)(this + 0x600) = param_3;
CNavArea::ClearSearchLists();
pCVar17 = param_3;
pCVar7 = param_4;
if (param_2 != 1) {
pCVar17 = param_4;
pCVar7 = param_3;
}
iVar10 = param_2 + 0x54;
*(undefined4 *)(pCVar17 + iVar10 * 4 + 4) = 0;
CNavArea::AddToOpenList(pCVar17);
local_24 = 0;
local_130 = 0x40;
local_12c = 0xffffffff;
local_128 = 0;
*(int *)(pCVar17 + 0x3c) = CNavArea::m_masterMarker;
local_134 = local_124;
bVar8 = false;
local_1a4 = 1e+09;
fVar25 = *(float *)(NavFlowMaxSurvivorClimbHeight._28_4_ + 0x2c);
fVar1 = *(float *)(NavFlowMaxSurvivorDropHeight._28_4_ + 0x2c);
local_20 = local_134;
while (iVar12 = DAT_00fe6000, iVar19 = TheNavAreas, pCVar17 = CNavArea::m_openList,
iVar18 = CNavArea::m_masterMarker, CNavArea::m_openList != (CNavArea *)0x0) {
/* try { // try from 0097de0c to 0097e88f has its CatchHandler @ 0097e895 */
CNavArea::RemoveFromOpenList(CNavArea::m_openList);
*(undefined4 *)(pCVar17 + 0x4c) = 0;
*(undefined4 *)(pCVar17 + 0x48) = 0;
if (((*(uint *)(pCVar17 + 0x54) & 0x70000) == 0) &&
(cVar9 = CNavArea::IsBlocked(pCVar17,2,true), cVar9 == '\0')) {
if (pCVar7 == pCVar17) {
bVar8 = true;
local_1a4 = *(float *)(pCVar7 + iVar10 * 4 + 4);
}
local_24 = 0;
pCVar20 = pCVar17;
if (param_2 == 1) {
local_184 = 0.0;
iVar18 = 0;
do {
piVar11 = *(int **)(pCVar20 + 0x114);
if (0 < *piVar11) {
iVar19 = 0;
do {
while ((*(byte *)(piVar11[iVar19 * 2 + 1] + 0x56) & 4) == 0) {
local_174[0] = (NavConnect *)(piVar11 + iVar19 * 2 + 1);
CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>::
InsertBefore((CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>
*)&local_134,iVar18,local_174);
piVar11 = *(int **)(pCVar20 + 0x114);
iVar19 = iVar19 + 1;
iVar18 = local_24;
if (*piVar11 <= iVar19) goto LAB_0097e5c8;
}
iVar19 = iVar19 + 1;
} while (iVar19 < *piVar11);
}
LAB_0097e5c8:
piVar11 = *(int **)(pCVar20 + 0x58);
if (0 < *piVar11) {
iVar19 = 0;
do {
while ((*(byte *)(piVar11[iVar19 * 2 + 1] + 0x56) & 4) == 0) {
local_174[0] = (NavConnect *)(piVar11 + iVar19 * 2 + 1);
CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>::
InsertBefore((CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>
*)&local_134,iVar18,local_174);
piVar11 = *(int **)(pCVar20 + 0x58);
iVar19 = iVar19 + 1;
iVar18 = local_24;
if (*piVar11 <= iVar19) goto LAB_0097e61d;
}
iVar19 = iVar19 + 1;
} while (iVar19 < *piVar11);
}
LAB_0097e61d:
local_184 = (float)((int)local_184 + 1);
pCVar20 = pCVar20 + 4;
} while (local_184 != 5.60519e-45);
}
else {
do {
piVar11 = *(int **)(pCVar20 + 0x114);
iVar18 = 0;
if (0 < *piVar11) {
do {
while ((*(byte *)(piVar11[iVar18 * 2 + 1] + 0x56) & 4) == 0) {
local_174[0] = (NavConnect *)(piVar11 + iVar18 * 2 + 1);
CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>::
InsertBefore((CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>
*)&local_134,local_24,local_174);
piVar11 = *(int **)(pCVar20 + 0x114);
iVar18 = iVar18 + 1;
if (*piVar11 <= iVar18) goto LAB_0097ded8;
}
iVar18 = iVar18 + 1;
} while (iVar18 < *piVar11);
}
LAB_0097ded8:
piVar11 = *(int **)(pCVar20 + 0x58);
iVar18 = 0;
if (0 < *piVar11) {
do {
pCVar3 = (CNavArea *)piVar11[iVar18 * 2 + 1];
cVar9 = CNavArea::IsConnected(pCVar3,pCVar17,4);
if ((cVar9 != '\0') && (((byte)pCVar3[0x56] & 4) == 0)) {
local_174[0] = (NavConnect *)(*(int *)(pCVar20 + 0x58) + 4 + iVar18 * 8);
CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>::
InsertBefore((CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>
*)&local_134,local_24,local_174);
}
piVar11 = *(int **)(pCVar20 + 0x58);
iVar18 = iVar18 + 1;
} while (iVar18 < *piVar11);
}
pCVar20 = pCVar20 + 4;
iVar18 = local_24;
} while (pCVar20 != pCVar17 + 0x10);
}
CVar2 = pCVar17[0x7c];
bVar14 = (byte)CVar2 >> 4 & 3;
if (bVar14 == 1) {
local_184 = *(float *)(pCVar17 + 0x24);
if ((byte)CVar2 >> 6 == 1) goto LAB_0097e667;
LAB_0097dfa6:
if ((byte)CVar2 >> 6 == 2) {
local_194 = *(float *)(pCVar17 + 0x18);
}
else if ((byte)CVar2 >> 6 == 0) {
local_194 = *(float *)(pCVar17 + 0xc);
}
else {
local_194 = *(float *)(pCVar17 + 0x28);
}
}
else {
if (bVar14 == 2) {
local_184 = *(float *)(pCVar17 + 0x18);
}
else if (((byte)CVar2 >> 4 & 3) == 0) {
local_184 = *(float *)(pCVar17 + 0xc);
}
else {
local_184 = *(float *)(pCVar17 + 0x28);
}
if ((byte)CVar2 >> 6 != 1) goto LAB_0097dfa6;
LAB_0097e667:
local_194 = *(float *)(pCVar17 + 0x24);
}
iVar19 = 0;
if (0 < iVar18) {
do {
while( true ) {
puVar4 = *(undefined4 **)(local_134 + iVar19 * 4);
pCVar20 = (CNavArea *)*puVar4;
if (param_2 != 0) break;
CVar2 = pCVar20[0x7c];
bVar14 = (byte)CVar2 >> 4 & 3;
if (bVar14 == 1) {
fVar24 = *(float *)(pCVar20 + 0x24);
if ((byte)CVar2 >> 6 == 1) goto LAB_0097e34c;
LAB_0097e022:
if ((byte)CVar2 >> 6 == 2) {
fVar23 = *(float *)(pCVar20 + 0x18);
}
else if ((byte)CVar2 >> 6 == 0) {
fVar23 = *(float *)(pCVar20 + 0xc);
}
else {
fVar23 = *(float *)(pCVar20 + 0x28);
}
}
else {
if (bVar14 == 2) {
fVar24 = *(float *)(pCVar20 + 0x18);
}
else if (((byte)CVar2 >> 4 & 3) == 0) {
fVar24 = *(float *)(pCVar20 + 0xc);
}
else {
fVar24 = *(float *)(pCVar20 + 0x28);
}
if ((byte)CVar2 >> 6 != 1) goto LAB_0097e022;
LAB_0097e34c:
fVar23 = *(float *)(pCVar20 + 0x24);
}
if ((local_184 - fVar23 <= fVar25) && (fVar24 - local_194 <= fVar1)) break;
if ((local_194 - fVar24 <= fVar25) && (fVar23 - local_184 <= fVar1)) {
lVar22 = (longdouble)CNavArea::GetZDeltaAtEdgeToArea(pCVar20,pCVar17);
if (((float)lVar22 <= fVar25) && (-(float)lVar22 <= fVar1)) break;
}
LAB_0097e090:
iVar19 = iVar19 + 1;
if (local_24 <= iVar19) goto LAB_0097e110;
}
fVar24 = *(float *)(pCVar17 + iVar10 * 4 + 4) + (float)puVar4[1];
if ((*(float *)(pCVar20 + param_2 * 4 + 0x154) <= fVar24) &&
(0.0 <= *(float *)(pCVar20 + param_2 * 4 + 0x154))) goto LAB_0097e090;
*(float *)(pCVar20 + param_2 * 4 + 0x154) = fVar24;
bVar21 = *(int *)(pCVar20 + 0x50) == CNavArea::m_masterMarker;
*(int *)(pCVar20 + 0x3c) = CNavArea::m_masterMarker;
if (bVar21) goto LAB_0097e090;
CNavArea::AddToOpenListTail(pCVar20);
iVar19 = iVar19 + 1;
} while (iVar19 < local_24);
}
LAB_0097e110:
iVar18 = 0;
iVar19 = 0;
piVar11 = *(int **)(pCVar17 + 0x68);
if (0 < *piVar11) {
do {
while( true ) {
iVar12 = piVar11[iVar18 + 1];
uVar15 = *(uint *)(iVar12 + 0x38);
if ((((uVar15 != 0xffffffff) &&
(puVar16 = g_pEntityList + (uVar15 & 0xfff) * 0x10,
puVar16 != (undefined *)0xfffffffc)) && (*(uint *)(puVar16 + 8) == uVar15 >> 0xc))
&& ((*(CBaseEntity **)(puVar16 + 4) != (CBaseEntity *)0x0 &&
(uVar15 = CBaseEntity::GetTeamNumber(*(CBaseEntity **)(puVar16 + 4)),
(uVar15 & 0xfffffffd) != 0)))) break;
if (*(NavConnect **)(iVar12 + 0x24) == (NavConnect *)0x0) {
LAB_0097e146:
if (*(NavConnect **)(iVar12 + 0x28) != (NavConnect *)0x0) {
if (0xf < iVar19) goto LAB_0097e172;
local_174[iVar19] = *(NavConnect **)(iVar12 + 0x28);
iVar19 = iVar19 + 1;
}
if ((*(NavConnect **)(iVar12 + 0x2c) != (NavConnect *)0x0) && (iVar19 < 0x10)) {
local_174[iVar19] = *(NavConnect **)(iVar12 + 0x2c);
iVar19 = iVar19 + 1;
}
}
else if (iVar19 < 0x10) {
local_174[iVar19] = *(NavConnect **)(iVar12 + 0x24);
iVar19 = iVar19 + 1;
goto LAB_0097e146;
}
LAB_0097e172:
iVar18 = iVar18 + 1;
piVar11 = *(int **)(pCVar17 + 0x68);
if (*piVar11 <= iVar18) goto LAB_0097e1dc;
}
iVar18 = iVar18 + 1;
piVar11 = *(int **)(pCVar17 + 0x68);
} while (iVar18 < *piVar11);
}
LAB_0097e1dc:
iVar18 = 0;
piVar11 = *(int **)(pCVar17 + 0x6c);
if (0 < *piVar11) {
do {
while( true ) {
iVar12 = piVar11[iVar18 + 1];
uVar15 = *(uint *)(iVar12 + 0x38);
if ((((uVar15 != 0xffffffff) &&
(puVar16 = g_pEntityList + (uVar15 & 0xfff) * 0x10,
puVar16 != (undefined *)0xfffffffc)) && (*(uint *)(puVar16 + 8) == uVar15 >> 0xc))
&& ((*(CBaseEntity **)(puVar16 + 4) != (CBaseEntity *)0x0 &&
(uVar15 = CBaseEntity::GetTeamNumber(*(CBaseEntity **)(puVar16 + 4)),
(uVar15 & 0xfffffffd) != 0)))) break;
pNVar5 = *(NavConnect **)(iVar12 + 0x34);
if ((pNVar5 != (NavConnect *)0x0) && (iVar19 < 0x10)) {
local_174[iVar19] = pNVar5;
iVar19 = iVar19 + 1;
}
iVar18 = iVar18 + 1;
piVar11 = *(int **)(pCVar17 + 0x6c);
if (*piVar11 <= iVar18) goto LAB_0097e268;
}
iVar18 = iVar18 + 1;
piVar11 = *(int **)(pCVar17 + 0x6c);
} while (iVar18 < *piVar11);
}
LAB_0097e268:
iVar18 = 0;
while( true ) {
if ((CNavArea::GetElevatorAreas()::empty == '\0') &&
(iVar12 = __cxa_guard_acquire(&CNavArea::GetElevatorAreas()::empty), iVar12 != 0)) {
if ((CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::
StaticData()::staticData == '\0') &&
(iVar12 = __cxa_guard_acquire(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
::StaticData()::staticData), iVar12 != 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);
}
uVar15 = *(uint *)(pCVar17 + 0x54) & 0x40000000;
pCVar20 = (CNavArea *)&CNavArea::GetElevatorAreas()::empty;
if (uVar15 != 0) {
pCVar20 = pCVar17 + 0x88;
}
if (**(int **)pCVar20 <= iVar18) break;
if (CNavArea::GetElevatorAreas()::empty == '\0') {
iVar12 = __cxa_guard_acquire(&CNavArea::GetElevatorAreas()::empty);
if (iVar12 != 0) {
if ((CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::
StaticData()::staticData == '\0') &&
(iVar12 = __cxa_guard_acquire(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
::StaticData()::staticData), iVar12 != 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);
}
uVar15 = *(uint *)(pCVar17 + 0x54) & 0x40000000;
}
pCVar20 = (CNavArea *)&CNavArea::GetElevatorAreas()::empty;
if (uVar15 != 0) {
pCVar20 = pCVar17 + 0x88;
}
pNVar5 = *(NavConnect **)(*(int *)pCVar20 + 4 + iVar18 * 8);
if ((iVar19 < 0x10) && (pNVar5 != (NavConnect *)0x0)) {
local_174[iVar19] = pNVar5;
iVar19 = iVar19 + 1;
}
iVar18 = iVar18 + 1;
}
iVar18 = 0;
if (iVar19 != 0) {
do {
pCVar20 = (CNavArea *)local_174[iVar18];
fVar24 = SQRT((*(float *)(pCVar20 + 0x30) - *(float *)(pCVar17 + 0x30)) *
(*(float *)(pCVar20 + 0x30) - *(float *)(pCVar17 + 0x30)) +
(*(float *)(pCVar20 + 0x34) - *(float *)(pCVar17 + 0x34)) *
(*(float *)(pCVar20 + 0x34) - *(float *)(pCVar17 + 0x34)) +
(*(float *)(pCVar20 + 0x2c) - *(float *)(pCVar17 + 0x2c)) *
(*(float *)(pCVar20 + 0x2c) - *(float *)(pCVar17 + 0x2c))) +
*(float *)(pCVar17 + iVar10 * 4 + 4);
if ((fVar24 < *(float *)(pCVar20 + param_2 * 4 + 0x154)) ||
(*(float *)(pCVar20 + param_2 * 4 + 0x154) < 0.0)) {
*(float *)(pCVar20 + param_2 * 4 + 0x154) = fVar24;
bVar21 = *(int *)(pCVar20 + 0x50) != CNavArea::m_masterMarker;
*(int *)(pCVar20 + 0x3c) = CNavArea::m_masterMarker;
if (bVar21) {
CNavArea::AddToOpenListTail(pCVar20);
}
}
iVar18 = iVar18 + 1;
} while (iVar18 != iVar19);
}
}
}
if (bVar8) {
if ((param_2 == 0) && (0 < DAT_00fe6000)) {
iVar10 = 0;
LAB_0097e727:
do {
iVar6 = *(int *)(iVar19 + iVar10 * 4);
if (*(int *)(iVar6 + 0x3c) == iVar18) {
fVar25 = local_1a4 - *(float *)(iVar6 + 0x154);
*(float *)(iVar6 + 0x154) = fVar25;
if (*(float *)(this + 0x5f4) <= fVar25 && fVar25 != *(float *)(this + 0x5f4)) {
*(float *)(this + 0x5f4) = fVar25;
}
if ((*(float *)(this + 0x5f8) <= fVar25 && fVar25 != *(float *)(this + 0x5f8)) &&
((*(byte *)(iVar6 + 0x12d) & 8) == 0)) {
iVar10 = iVar10 + 1;
*(float *)(this + 0x5f8) = fVar25;
if (iVar12 <= iVar10) break;
goto LAB_0097e727;
}
}
else {
*(undefined4 *)(iVar6 + 0x154) = 0xc61c3c00;
}
iVar10 = iVar10 + 1;
} while (iVar10 < iVar12);
}
uVar13 = 1;
}
else {
ZombieDebugPrint(1,"Flow Error: Goal not reached...\n");
if (param_2 == 1) {
ZombieDebugPrint(2,"Started at start...");
}
else {
ZombieDebugPrint(2,"Started at goal...");
}
ZombieDebugPrint(2,"Start %d(%f %f %f), End %d(%f %f %f)\n",*(undefined4 *)(param_3 + 0x8c),
(double)*(float *)(param_3 + 0x2c),(double)*(float *)(param_3 + 0x30),
(double)*(float *)(param_3 + 0x34),*(undefined4 *)(param_4 + 0x8c),
(double)*(float *)(param_4 + 0x2c),(double)*(float *)(param_4 + 0x30),
(double)*(float *)(param_4 + 0x34));
uVar13 = 0;
}
local_24 = 0;
CUtlMemory<NavConnect_const*,int>::Purge((CUtlMemory<NavConnect_const*,int> *)&local_134);
local_20 = local_134;
CUtlMemory<NavConnect_const*,int>::Purge((CUtlMemory<NavConnect_const*,int> *)&local_134);
return uVar13;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.