CNavMesh::FixCornerOnCornerAreas
0x0072a110 · 1997 bytes · __thiscall
_ZN8CNavMesh22FixCornerOnCornerAreasEv
Decompiled
undefined (1 param)
/* CNavMesh::FixCornerOnCornerAreas() */
void __thiscall CNavMesh::FixCornerOnCornerAreas(CNavMesh *this)
{
uint uVar1;
CNavArea *pCVar2;
bool bVar3;
char cVar4;
CNavArea *pCVar5;
int iVar6;
undefined4 uVar7;
CNavArea *pCVar8;
uint uVar9;
uint uVar10;
bool bVar11;
float fVar12;
float fVar13;
float fVar14;
float local_144;
float local_140;
uint local_12c;
int local_128;
float local_124;
float local_120;
CNavArea *local_110;
uint local_10c;
uint local_108;
uint local_104;
uint local_100;
float local_fc;
float local_f8;
float local_f4;
float local_f0;
float local_ec;
float local_e8;
Vector local_e4 [12];
Vector local_d8 [12];
Vector local_cc [12];
Vector local_c0 [12];
undefined **local_b4 [4];
undefined4 local_a4;
float local_a0;
float local_9c;
float local_98;
float local_94;
float local_90;
float local_8c;
float local_88;
float local_84;
float local_80;
float local_7c;
float local_78;
float local_74;
CGameTrace local_70 [12];
float local_64;
float local_60;
float local_5c;
local_128 = 0;
if (0 < DAT_00fe6000) {
do {
uVar10 = 0;
pCVar2 = *(CNavArea **)(TheNavAreas + local_128 * 4);
pCVar8 = pCVar2;
do {
local_10c = uVar10 + 3 & 3;
if ((((**(int **)(pCVar2 + local_10c * 4 + 0x58) < 1) && (**(int **)(pCVar8 + 0x58) < 1)) &&
(**(int **)(pCVar2 + local_10c * 4 + 0x114) < 1)) && (**(int **)(pCVar8 + 0x114) < 1)) {
if (uVar10 == 2) {
local_fc = *(float *)(pCVar2 + 0x10);
local_f8 = *(float *)(pCVar2 + 0x14);
local_f4 = *(float *)(pCVar2 + 0x18);
}
else if (uVar10 == 3) {
local_fc = *(float *)(pCVar2 + 4);
local_f8 = *(float *)(pCVar2 + 0x14);
local_f4 = *(float *)(pCVar2 + 0x28);
}
else if (uVar10 == 1) {
local_f8 = *(float *)(pCVar2 + 8);
local_fc = *(float *)(pCVar2 + 0x10);
local_f4 = *(float *)(pCVar2 + 0x24);
}
else {
local_fc = *(float *)(pCVar2 + 4);
local_f8 = *(float *)(pCVar2 + 8);
local_f4 = *(float *)(pCVar2 + 0xc);
}
local_12c = *(uint *)(CSWTCH_1516 + local_10c * 4);
local_100 = (&CSWTCH_1518)[uVar10];
uVar1 = uVar10 + 2 & 3;
iVar6 = local_10c - 1;
bVar3 = false;
bVar11 = false;
uVar9 = local_10c;
local_108 = uVar10;
local_104 = local_12c;
if (local_10c == 1) goto LAB_0072a370;
LAB_0072a27e:
if (bVar11 || SBORROW4(uVar9,1) != iVar6 < 0) {
if (uVar9 == 0) {
local_124 = 0.0;
local_120 = -12.5;
goto LAB_0072a2b1;
}
}
else {
if (uVar9 == 2) {
local_124 = 0.0;
local_120 = 12.5;
goto LAB_0072a2b1;
}
if (uVar9 == 3) {
local_120 = 0.0;
local_124 = -12.5;
goto LAB_0072a2b1;
}
}
local_120 = local_120 * 12.5;
local_124 = local_124 * 12.5;
LAB_0072a2b1:
do {
local_e8 = local_f4;
local_f0 = local_fc + local_124;
local_ec = local_f8 + local_120;
pCVar5 = (CNavArea *)GetNavArea(this,(Vector *)&local_f0,120.0);
if ((pCVar5 != (CNavArea *)0x0) &&
(cVar4 = TraceAdjacentNode(0,(Vector *)&local_fc,(Vector *)&local_f0,local_70,18.0),
cVar4 != '\0')) {
if (uVar1 == 2) {
fVar12 = *(float *)(pCVar5 + 0x10);
fVar13 = *(float *)(pCVar5 + 0x14);
fVar14 = *(float *)(pCVar5 + 0x18);
}
else if (uVar1 == 3) {
fVar12 = *(float *)(pCVar5 + 4);
fVar13 = *(float *)(pCVar5 + 0x14);
fVar14 = *(float *)(pCVar5 + 0x28);
}
else if (uVar1 == 1) {
fVar12 = *(float *)(pCVar5 + 0x10);
fVar13 = *(float *)(pCVar5 + 8);
fVar14 = *(float *)(pCVar5 + 0x24);
}
else {
fVar12 = *(float *)(pCVar5 + 4);
fVar13 = *(float *)(pCVar5 + 8);
fVar14 = *(float *)(pCVar5 + 0xc);
}
if (((fVar12 == local_fc) && (fVar13 == local_f8)) && (local_f4 == fVar14)) {
if (local_12c == 1) {
local_140 = 0.0;
local_144 = 12.5;
}
else if ((int)local_12c < 2) {
if (local_12c == 0) {
local_140 = -12.5;
local_144 = 0.0;
}
else {
LAB_0072a8b6:
local_140 = local_140 * 12.5;
local_144 = local_144 * 12.5;
}
}
else if (local_12c == 2) {
local_140 = 12.5;
local_144 = 0.0;
}
else {
if (local_12c != 3) goto LAB_0072a8b6;
local_140 = 0.0;
local_144 = -12.5;
}
local_94 = local_124 + fVar12;
local_7c = fVar12 + local_144;
local_90 = local_120 + fVar13;
local_a0 = local_144 + local_94;
local_78 = fVar13 + local_140;
local_98 = local_f4;
local_9c = local_140 + local_90;
local_8c = local_f4;
local_80 = local_f4;
local_74 = local_f4;
local_88 = fVar12;
local_84 = fVar13;
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)local_b4,(IHandleEntity *)0x0,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
local_b4[0] = &PTR_ShouldHitEntity_00ca1b68;
local_a4 = 0xf;
cVar4 = TraceAdjacentNode(0,(Vector *)&local_94,(Vector *)&local_a0,local_70,18.0);
if (((cVar4 != '\0') &&
(cVar4 = TraceAdjacentNode(0,(Vector *)&local_7c,(Vector *)&local_a0,local_70,
18.0), cVar4 != '\0')) &&
(iVar6 = GetNavArea(this,(Vector *)&local_a0,120.0), iVar6 == 0)) {
local_a0 = local_64;
local_9c = local_60;
local_98 = local_5c;
local_110 = (CNavArea *)(**(code **)(*(int *)this + 0x14))(this);
ClassifyCorners((Vector *)&local_a0,local_e4,local_d8,local_cc,local_c0);
CNavArea::Build(local_110,local_e4,local_d8,local_cc,local_c0);
uVar7 = CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&TheNavAreas
,DAT_00fe6000,&local_110);
*(undefined4 *)(local_110 + 0x90) = uVar7;
AddNavArea(this,local_110);
*(undefined4 *)(local_110 + 0x54) = *(undefined4 *)(pCVar2 + 0x54);
CNavArea::ConnectTo(pCVar2,local_110,uVar9);
uVar7 = 0;
if (uVar9 < 4) {
uVar7 = (&CSWTCH_1514)[uVar9];
}
CNavArea::ConnectTo(local_110,pCVar2,uVar7);
CNavArea::ConnectTo(pCVar5,local_110,local_12c);
uVar7 = 0;
if (local_12c < 4) {
uVar7 = (&CSWTCH_1514)[local_12c];
}
CNavArea::ConnectTo(local_110,pCVar5,uVar7);
}
}
}
if (bVar3) break;
bVar3 = true;
iVar6 = local_108 - 1;
bVar11 = iVar6 == 0;
local_12c = local_100;
uVar9 = local_108;
if (!bVar11) goto LAB_0072a27e;
LAB_0072a370:
local_120 = 0.0;
local_124 = 12.5;
} while( true );
}
uVar10 = uVar10 + 1;
pCVar8 = pCVar8 + 4;
} while (uVar10 != 4);
local_128 = local_128 + 1;
} while (local_128 < DAT_00fe6000);
}
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.