TerrorNavMesh::PostCustomAnalysis
0x00982670 · 2148 bytes · __thiscall
_ZN13TerrorNavMesh18PostCustomAnalysisEv
Decompiled
undefined (1 param)
/* TerrorNavMesh::PostCustomAnalysis() */
void __thiscall TerrorNavMesh::PostCustomAnalysis(TerrorNavMesh *this)
{
TerrorNavArea *this_00;
char cVar1;
int iVar2;
int *piVar3;
int *piVar4;
CNavArea *pCVar5;
int iVar6;
int iVar7;
CBaseEntity *pCVar8;
int iVar9;
int iVar10;
TerrorNavArea *pTVar11;
CSurvivorRescue *this_01;
TerrorNavArea *pTVar12;
float fVar13;
int local_7c;
int local_78;
int local_74;
int local_70;
CBaseEntity *local_6c;
TerrorNavArea *local_68;
int local_64;
TerrorNavArea *local_60;
float local_5c;
float local_58;
float local_54;
float local_50;
float local_4c;
float local_48;
int *local_44;
float local_40;
float local_3c;
float local_38;
int *local_34;
float local_30 [8];
iVar9 = DAT_00fe6000;
if (DAT_00fe6000 < 1) {
local_74 = 999999999;
local_78 = 0;
local_70 = 0;
}
else {
local_7c = 0;
local_74 = 999999999;
local_78 = 0;
local_70 = 0;
do {
this_00 = (TerrorNavArea *)TheNavAreas[local_7c];
iVar10 = *(int *)(this_00 + 0x13c);
local_70 = local_70 + iVar10;
if (iVar10 < local_74) {
local_74 = iVar10;
}
if (iVar10 <= local_78) {
iVar10 = local_78;
}
if (this_00[0x144] == (TerrorNavArea)0x0) {
pTVar12 = (TerrorNavArea *)0x0;
local_44 = (int *)0x0;
local_40 = 0.0;
local_3c = 0.0;
local_38 = 0.0;
local_68 = this_00;
do {
piVar3 = *(int **)(local_68 + 0x58);
iVar9 = *piVar3;
if (0 < iVar9) {
iVar7 = 0;
iVar6 = iVar9;
do {
if (iVar6 < 1) {
LAB_00982743:
local_60 = (TerrorNavArea *)0x0;
pTVar11 = pTRam00000130;
if (pTRam00000130 == (TerrorNavArea *)0x0) goto LAB_00982757;
LAB_00982752:
local_60 = pTVar11;
if (this_00 != pTVar11) goto LAB_00982757;
}
else {
iVar2 = 0;
if (iVar7 != 0) {
do {
iVar2 = iVar2 + 1;
if (iVar2 == iVar6) goto LAB_00982743;
} while (iVar2 != iVar7);
}
local_60 = (TerrorNavArea *)piVar3[iVar2 * 2 + 1];
pTVar11 = *(TerrorNavArea **)(local_60 + 0x130);
if (*(TerrorNavArea **)(local_60 + 0x130) != (TerrorNavArea *)0x0)
goto LAB_00982752;
LAB_00982757:
/* try { // try from 00982764 to 009827f3 has its CatchHandler @ 00982b9b */
piVar3 = (int *)TerrorNavArea::ComputeVisibilityDelta(this_00,local_60);
if (pTVar12 == (TerrorNavArea *)0x0) {
iVar6 = piVar3[2];
}
else {
iVar6 = piVar3[2];
if ((int)local_3c <= iVar6) goto LAB_00982787;
}
local_3c = 0.0;
pTVar12 = local_60;
if (iVar6 != 0) {
local_3c = 0.0;
CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
::GrowVector((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
*)&local_44,iVar6);
CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
::ShiftElementsRight
((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
*)&local_44,0,iVar6);
if (0 < iVar6) {
iVar2 = 0;
do {
if ((undefined2 *)((int)local_44 + iVar2) != (undefined2 *)0x0) {
*(undefined2 *)((int)local_44 + iVar2) = 0;
}
iVar2 = iVar2 + 2;
} while (iVar2 != iVar6 * 2);
iVar2 = 0;
do {
*(undefined2 *)((int)local_44 + iVar2) = *(undefined2 *)(*piVar3 + iVar2);
iVar2 = iVar2 + 2;
} while (iVar2 != iVar6 * 2);
}
}
}
LAB_00982787:
iVar7 = iVar7 + 1;
if (iVar7 == iVar9) break;
piVar3 = *(int **)(local_68 + 0x58);
iVar6 = *piVar3;
} while( true );
}
fVar13 = local_3c;
local_68 = local_68 + 4;
} while (local_68 != this_00 + 0x10);
if (((pTVar12 == (TerrorNavArea *)0x0) ||
(*(int *)(NavMaxVisDeltaListLength._28_4_ + 0x30) < (int)local_3c)) ||
(this_00 == pTVar12)) {
*(undefined4 *)(this_00 + 0x130) = 0;
}
else {
*(TerrorNavArea **)(this_00 + 0x130) = pTVar12;
*(undefined4 *)(this_00 + 0x13c) = 0;
if (local_3c != 0.0) {
CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
::GrowVector((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
*)(this_00 + 0x134),(int)local_3c);
/* try { // try from 00982b28 to 00982b2c has its CatchHandler @ 00982b9b */
CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
::ShiftElementsRight
((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
*)(this_00 + 0x134),0,(int)fVar13);
if (0 < (int)fVar13) {
iVar9 = *(int *)(this_00 + 0x134);
iVar6 = 0;
do {
if ((undefined2 *)(iVar9 + iVar6) != (undefined2 *)0x0) {
*(undefined2 *)(iVar9 + iVar6) = 0;
iVar9 = *(int *)(this_00 + 0x134);
}
iVar6 = iVar6 + 2;
} while (iVar6 != (int)fVar13 * 2);
iVar6 = 0;
while( true ) {
*(undefined2 *)(iVar9 + iVar6) = *(undefined2 *)((int)local_44 + iVar6);
iVar6 = iVar6 + 2;
if ((int)fVar13 * 2 == iVar6) break;
iVar9 = *(int *)(this_00 + 0x134);
}
}
}
pTVar12[0x144] = (TerrorNavArea)0x1;
}
local_3c = 0.0;
free(local_44);
iVar9 = DAT_00fe6000;
}
local_7c = local_7c + 1;
local_78 = iVar10;
} while (local_7c < iVar9);
}
if (iVar9 != 0) {
local_70 = local_70 / iVar9;
}
pCVar8 = (CBaseEntity *)0x0;
Msg("NavMesh Visibility List Lengths: min = %d, avg = %d, max = %d\n",local_74,local_70,local_78)
;
while (pCVar8 = (CBaseEntity *)
CGlobalEntityList::FindEntityByClassname
((CGlobalEntityList *)gEntList,pCVar8,"func_nav_attribute_region"),
pCVar8 != (CBaseEntity *)0x0) {
local_44 = (int *)0x0;
local_38 = -NAN;
local_34 = (int *)0x0;
(**(code **)(*(int *)pCVar8 + 0xb4))(pCVar8,"ApplyNavAttributes",0,0,&local_44,0);
}
pCVar8 = (CBaseEntity *)0x0;
while (pCVar8 = (CBaseEntity *)
CGlobalEntityList::FindEntityByClassname
((CGlobalEntityList *)gEntList,pCVar8,"point_nav_attribute_region"),
pCVar8 != (CBaseEntity *)0x0) {
local_44 = (int *)0x0;
local_38 = -NAN;
local_34 = (int *)0x0;
(**(code **)(*(int *)pCVar8 + 0xb4))(pCVar8,"ApplyNavAttributes",0,0,&local_44,0);
}
piVar3 = TheNavAreas + DAT_00fe6000;
piVar4 = TheNavAreas;
if (0 < DAT_00fe6000) {
do {
iVar9 = *piVar4;
piVar4 = piVar4 + 1;
*(uint *)(iVar9 + 300) = *(uint *)(iVar9 + 300) & 0xfffeffff;
} while (piVar4 != piVar3);
}
this_01 = (CSurvivorRescue *)0x0;
while (this_01 = (CSurvivorRescue *)
CGlobalEntityList::FindEntityByClassname
((CGlobalEntityList *)gEntList,(CBaseEntity *)this_01,
"info_survivor_rescue"), this_01 != (CSurvivorRescue *)0x0) {
local_44 = (int *)0x0;
local_40 = 0.0;
local_3c = 0.0;
local_38 = 0.0;
local_34 = (int *)0x0;
local_30[0] = 0.0;
local_30[1] = 0.0;
local_30[2] = 0.0;
local_30[3] = 0.0;
local_30[4] = 0.0;
/* try { // try from 00982a5c to 00982a8b has its CatchHandler @ 00982bb7 */
pCVar5 = (CNavArea *)CSurvivorRescue::GetRescueNavArea(this_01);
SearchSurroundingAreas<RescueAreaCollector>
(pCVar5,(Vector *)(pCVar5 + 0x2c),(RescueAreaCollector *)&local_44,300.0,0,-1);
if (0 < (int)local_38) {
piVar3 = local_44;
do {
iVar9 = *piVar3;
piVar3 = piVar3 + 1;
*(uint *)(iVar9 + 300) = *(uint *)(iVar9 + 300) | 0x10000;
} while (piVar3 != local_44 + (int)local_38);
}
local_30[3] = 0.0;
CUtlMemory<CBasePropDoor*,int>::Purge((CUtlMemory<CBasePropDoor*,int> *)local_30);
local_30[4] = local_30[0];
CUtlMemory<CBasePropDoor*,int>::Purge((CUtlMemory<CBasePropDoor*,int> *)local_30);
local_38 = 0.0;
CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_44);
local_34 = local_44;
CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_44);
}
iVar9 = 0;
if (0 < DAT_00fe6000) {
do {
pCVar5 = (CNavArea *)TheNavAreas[iVar9];
cVar1 = CNavArea::HasNodes(pCVar5);
if (cVar1 != '\0') {
*(uint *)(pCVar5 + 300) = *(uint *)(pCVar5 + 300) & 0xfffeffff;
}
iVar9 = iVar9 + 1;
CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>::
Sort((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
*)(pCVar5 + 0x134),AreaSortFunc);
} while (iVar9 < DAT_00fe6000);
}
local_6c = (CBaseEntity *)0x0;
do {
do {
do {
local_6c = (CBaseEntity *)
CGlobalEntityList::FindEntityByClassname
((CGlobalEntityList *)gEntList,local_6c,"info_changelevel");
if (local_6c == (CBaseEntity *)0x0) {
return;
}
CCollisionProperty::CollisionAABBToWorldAABB
((CCollisionProperty *)(local_6c + 0x194),(Vector *)(local_6c + 0x19c),
(Vector *)(local_6c + 0x1a8),(Vector *)&local_5c,(Vector *)&local_50);
} while (*(int *)(this + 0x18) == 0);
if ((CNavMesh::ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
::searchMarker == '\0') &&
(iVar9 = __cxa_guard_acquire(&CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
::searchMarker), iVar9 != 0)) {
/* try { // try from 00982f0b to 00982f0f has its CatchHandler @ 00982f6b */
CNavMesh::ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
searchMarker = RandomInt(0,0x100000);
__cxa_guard_release(&CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
::searchMarker);
}
iVar9 = CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
searchMarker + 1;
if (CNavMesh::ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
::searchMarker + 1 == 0) {
iVar9 = CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
searchMarker + 2;
}
CNavMesh::ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
searchMarker = iVar9;
fVar13 = 1.0 / *(float *)(this + 0x20);
iVar9 = (int)((local_5c - *(float *)(this + 0x2c)) * fVar13);
if (iVar9 < 0) {
local_64 = 0;
}
else {
local_64 = *(int *)(this + 0x24) + -1;
if (iVar9 < *(int *)(this + 0x24)) {
local_64 = iVar9;
}
}
iVar9 = (int)((local_50 - *(float *)(this + 0x2c)) * fVar13);
if (iVar9 < 0) {
local_70 = 0;
}
else {
local_70 = *(int *)(this + 0x24) + -1;
if (iVar9 < *(int *)(this + 0x24)) {
local_70 = iVar9;
}
}
iVar9 = (int)((local_58 - *(float *)(this + 0x30)) * fVar13);
if (iVar9 < 0) {
local_74 = 0;
}
else {
local_74 = *(int *)(this + 0x28) + -1;
if (iVar9 < *(int *)(this + 0x28)) {
local_74 = iVar9;
}
}
iVar9 = (int)((local_4c - *(float *)(this + 0x30)) * fVar13);
if (iVar9 < 0) {
local_68 = (TerrorNavArea *)0x0;
}
else {
local_68 = (TerrorNavArea *)(*(int *)(this + 0x28) + -1);
if (iVar9 < *(int *)(this + 0x28)) {
local_68 = (TerrorNavArea *)iVar9;
}
}
} while (local_70 < local_64);
do {
if (local_74 <= (int)local_68) {
iVar9 = local_74 * *(int *)(this + 0x24) + local_64;
if (*(int *)(this + 0x18) <= iVar9) {
LAB_00982e82:
if (CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
__executeCount < 10) {
CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
__executeCount =
CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
__executeCount + 1;
Warning("** Walked off of the CNavMesh::m_grid in ForAllAreasOverlappingExtent()\n");
}
break;
}
local_60 = (TerrorNavArea *)local_74;
while( true ) {
iVar10 = 0;
piVar3 = (int *)(*(int *)(this + 0xc) + iVar9 * 0x14);
if (0 < piVar3[3]) {
do {
pCVar5 = *(CNavArea **)(*piVar3 + iVar10 * 4);
if (*(int *)(pCVar5 + 0x74) !=
CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
searchMarker) {
*(int *)(pCVar5 + 0x74) =
CNavMesh::
ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
::searchMarker;
CNavArea::GetExtent(pCVar5,(Extent *)&local_44);
if ((((local_5c <= local_38) && ((float)local_44 <= local_50)) &&
((local_58 <= (float)local_34 &&
(((local_40 <= local_4c && (local_54 <= local_30[0])) && (local_3c <= local_48)
))))) && (cVar1 = CNavArea::HasNodes(pCVar5), cVar1 != '\0')) {
*(uint *)(pCVar5 + 300) = *(uint *)(pCVar5 + 300) | 0x800;
}
}
iVar10 = iVar10 + 1;
} while (iVar10 < piVar3[3]);
}
local_60 = (TerrorNavArea *)((int)local_60 + 1);
if ((int)local_68 < (int)local_60) break;
iVar9 = (int)local_60 * *(int *)(this + 0x24) + local_64;
if (*(int *)(this + 0x18) <= iVar9) goto LAB_00982e82;
}
}
local_64 = local_64 + 1;
} while (local_64 <= local_70);
} 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.