CNavMesh::SimplifySelectedAreas
0x00747fa0 · 1825 bytes · __thiscall
_ZN8CNavMesh21SimplifySelectedAreasEv
Decompiled
undefined (1 param)
/* CNavMesh::SimplifySelectedAreas() */
void __thiscall CNavMesh::SimplifySelectedAreas(CNavMesh *this)
{
CNavArea *pCVar1;
char cVar2;
int iVar3;
int iVar4;
int iVar5;
longdouble lVar6;
float fVar7;
undefined4 uVar8;
CUtlMemory<CNavArea*,int> *local_98;
int local_90;
CNavArea *local_84;
CNavArea *local_80;
float local_7c;
float local_78;
float local_74;
undefined4 local_70;
undefined4 local_6c;
undefined4 local_68;
char local_64;
int *local_60;
undefined4 local_5c;
undefined4 local_58;
int local_54;
int *local_50;
float local_4c [6];
Vector local_34 [8];
float local_2c;
float afStack_28 [6];
*(undefined4 *)(this + 0x528) = 3;
ConVar::SetValue(0xfe5ee0);
ConVar::SetValue(2.3360385e-38);
ConVar::SetValue(2.336052e-38);
uVar8 = 1;
ConVar::SetValue(0xfe6580);
(**(code **)(*(int *)this + 0x84))(this,uVar8);
SetMarkedArea(this,(CNavArea *)0x0);
local_60 = (int *)0x0;
local_5c = 0;
local_58 = 0;
local_54 = 0;
local_50 = (int *)0x0;
local_64 = '\0';
/* try { // try from 007480ae to 00748660 has its CatchHandler @ 007486ea */
cVar2 = IsSelectedSetEmpty(this);
iVar4 = local_54;
if (cVar2 == '\0') {
if (0 < *(int *)(this + 0x4e0)) {
iVar5 = 0;
do {
local_84 = *(CNavArea **)(*(int *)(this + 0x4d4) + iVar5 * 4);
if ((local_64 == '\0') || (iVar4 < 1)) {
LAB_00748118:
CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&local_60,iVar4,&local_84);
iVar4 = local_54;
}
else if (local_84 != (CNavArea *)*local_60) {
iVar3 = 0;
do {
iVar3 = iVar3 + 1;
if (iVar3 == iVar4) goto LAB_00748118;
} while (local_84 != (CNavArea *)local_60[iVar3]);
if (iVar3 < 0) goto LAB_00748118;
}
iVar5 = iVar5 + 1;
} while (iVar5 < *(int *)(this + 0x4e0));
}
LAB_0074813f:
local_4c[0] = 3.4028235e+38;
*(undefined4 *)(this + 0x564) = 0;
local_4c[1] = 3.4028235e+38;
local_4c[2] = 3.4028235e+38;
local_4c[3] = -3.4028235e+38;
local_4c[4] = -3.4028235e+38;
local_4c[5] = -3.4028235e+38;
if (iVar4 < 1) goto LAB_007482b5;
}
else {
pCVar1 = *(CNavArea **)(this + 0x474);
if (pCVar1 == (CNavArea *)0x0) goto LAB_0074813f;
local_80 = pCVar1;
if ((local_64 == '\0') || (local_54 < 1)) {
LAB_00748488:
CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&local_60,local_54,&local_80);
iVar4 = local_54;
goto LAB_0074813f;
}
if (pCVar1 != (CNavArea *)*local_60) {
iVar4 = 0;
do {
iVar4 = iVar4 + 1;
if (iVar4 == local_54) goto LAB_00748488;
} while (pCVar1 != (CNavArea *)local_60[iVar4]);
if (iVar4 < 0) goto LAB_00748488;
}
*(undefined4 *)(this + 0x564) = 0;
}
local_4c[5] = -3.4028235e+38;
local_4c[4] = -3.4028235e+38;
local_4c[3] = -3.4028235e+38;
local_4c[2] = 3.4028235e+38;
local_4c[1] = 3.4028235e+38;
local_4c[0] = 3.4028235e+38;
local_90 = 0;
do {
pCVar1 = (CNavArea *)local_60[local_90];
CNavArea::GetExtent(pCVar1,(Extent *)local_34);
iVar4 = 0;
local_2c = local_2c - 35.5;
afStack_28[2] = afStack_28[2] + 142.0;
do {
fVar7 = *(float *)((Extent *)local_34 + iVar4 * 4);
if (local_4c[iVar4] <= fVar7) {
if (local_4c[iVar4 + 3] <= fVar7 && fVar7 != local_4c[iVar4 + 3]) {
local_4c[iVar4 + 3] = fVar7;
}
}
else {
local_4c[iVar4] = fVar7;
}
iVar4 = iVar4 + 1;
} while (iVar4 != 3);
iVar4 = 0;
do {
fVar7 = afStack_28[iVar4];
if (local_4c[iVar4] <= fVar7) {
if (local_4c[iVar4 + 3] <= fVar7 && fVar7 != local_4c[iVar4 + 3]) {
local_4c[iVar4 + 3] = fVar7;
}
}
else {
local_4c[iVar4] = fVar7;
}
iVar4 = iVar4 + 1;
} while (iVar4 != 3);
local_7c = *(float *)(pCVar1 + 0x2c);
local_78 = *(float *)(pCVar1 + 0x30);
local_74 = *(float *)(pCVar1 + 0x34);
lVar6 = (longdouble)SnapToGrid(this,local_7c,false);
local_7c = (float)lVar6;
lVar6 = (longdouble)SnapToGrid(this,local_78,false);
local_78 = (float)lVar6;
cVar2 = FindGroundForNode(this,(Vector *)&local_7c,(Vector *)&local_70);
if (cVar2 != '\0') {
AddWalkableSeed(this,(Vector *)&local_7c,(Vector *)&local_70);
iVar4 = 0;
local_74 = local_74 + 71.0;
fVar7 = local_7c;
if (local_4c[0] <= local_7c) goto LAB_00748544;
do {
local_4c[iVar4] = fVar7;
while( true ) {
iVar4 = iVar4 + 1;
if (iVar4 == 3) goto LAB_0074829f;
fVar7 = *(float *)((Vector *)&local_7c + iVar4 * 4);
if (fVar7 < local_4c[iVar4]) break;
LAB_00748544:
if (local_4c[iVar4 + 3] <= fVar7 && fVar7 != local_4c[iVar4 + 3]) {
local_4c[iVar4 + 3] = fVar7;
}
}
} while( true );
}
LAB_0074829f:
local_90 = local_90 + 1;
} while (local_90 < local_54);
LAB_007482b5:
local_98 = (CUtlMemory<CNavArea*,int> *)&local_60;
RemoveNodes();
GenerateNodes(this,(Extent *)local_4c);
*(undefined4 *)(this + 0x564) = 0;
iVar4 = 0;
if (0 < local_54) {
do {
ReduceToComponentAreas((CNavArea *)local_60[iVar4],true);
iVar4 = iVar4 + 1;
} while (iVar4 < local_54);
}
if (0 < *(int *)(this + 0x4e0)) {
local_90 = 0;
do {
pCVar1 = *(CNavArea **)(*(int *)(this + 0x4d4) + local_90 * 4);
local_6c = *(undefined4 *)(pCVar1 + 8);
local_68 = *(undefined4 *)(pCVar1 + 0x24);
local_70 = *(undefined4 *)(pCVar1 + 0x10);
cVar2 = FindGroundForNode(this,(Vector *)&local_70,local_34);
if (cVar2 == '\0') {
if (*(int *)(pCVar1 + 0xf0) != 0) goto LAB_0074832e;
LAB_00748428:
Warning("Area %d didn\'t get any nodes!\n",*(undefined4 *)(pCVar1 + 0x8c));
}
else {
iVar4 = CNavNode::GetNode((Vector *)&local_70);
*(int *)(pCVar1 + 0xf0) = iVar4;
if (iVar4 == 0) goto LAB_00748428;
iVar5 = *(int *)(iVar4 + 0x24);
*(int *)(pCVar1 + 0xec) = iVar5;
iVar4 = *(int *)(iVar4 + 0x20);
*(int *)(pCVar1 + 0xf4) = iVar4;
if (iVar4 != 0) {
iVar4 = *(int *)(iVar4 + 0x24);
*(int *)(pCVar1 + 0xf8) = iVar4;
if (((iVar5 != 0) && (iVar4 != 0)) &&
(CNavArea::AssignNodes(pCVar1,pCVar1), *(int *)(pCVar1 + 0xf0) == 0))
goto LAB_00748428;
}
LAB_0074832e:
if (((*(int *)(pCVar1 + 0xec) == 0) || (*(int *)(pCVar1 + 0xf4) == 0)) ||
(*(int *)(pCVar1 + 0xf8) == 0)) goto LAB_00748428;
}
local_90 = local_90 + 1;
} while (local_90 < *(int *)(this + 0x4e0));
}
MergeGeneratedAreas();
SquareUpAreas();
MarkJumpAreas(this);
SplitAreasUnderOverhangs();
MarkStairAreas();
StichAndRemoveJumpAreas(this);
HandleObstacleTopAreas(this);
FixUpGeneratedAreas(this);
ClearSelectedSet(this);
iVar4 = 0;
if (0 < DAT_00fe6000) {
do {
while( true ) {
pCVar1 = *(CNavArea **)(TheNavAreas + iVar4 * 4);
cVar2 = CNavArea::HasNodes(pCVar1);
if (cVar2 == '\0') break;
AddToSelectedSet(this,pCVar1);
iVar4 = iVar4 + 1;
if (DAT_00fe6000 <= iVar4) goto LAB_007485ee;
}
iVar4 = iVar4 + 1;
} while (iVar4 < DAT_00fe6000);
}
LAB_007485ee:
RemoveNodes();
*(undefined4 *)(this + 0x528) = 0;
ConVar::SetValue(0xfe5ee0);
ConVar::SetValue(2.3360385e-38);
ConVar::SetValue(2.336052e-38);
ConVar::SetValue(0xfe6580);
local_54 = 0;
CUtlMemory<CNavArea*,int>::Purge(local_98);
local_50 = local_60;
CUtlMemory<CNavArea*,int>::Purge(local_98);
return;
}
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.