CNavArea::FinishSplitEdit
0x00704890 · 1477 bytes · __thiscall
_ZN8CNavArea15FinishSplitEditEPS_10NavDirType
Decompiled
undefined (3 params)
/* CNavArea::FinishSplitEdit(CNavArea*, NavDirType) */
void __thiscall CNavArea::FinishSplitEdit(CNavArea *this,CNavArea *param_1,int param_3)
{
float fVar1;
float fVar2;
float fVar3;
float fVar4;
float fVar5;
float *pfVar6;
float *pfVar7;
char cVar8;
int iVar9;
int *piVar10;
undefined4 uVar11;
float *pfVar12;
CNavArea *pCVar13;
int iVar14;
int iVar15;
int iVar16;
int iVar17;
longdouble lVar18;
longdouble lVar19;
int local_2c;
CNavArea *local_20;
(**(code **)(*(int *)param_1 + 0x78))(param_1,this,0);
pCVar13 = param_1;
fVar1 = *(float *)(param_1 + 4);
fVar2 = *(float *)(param_1 + 0x10);
fVar3 = *(float *)(param_1 + 0x14);
fVar4 = *(float *)(param_1 + 8);
fVar5 = *(float *)(param_1 + 0x18);
*(float *)(param_1 + 0x2c) = (fVar1 + fVar2) * 0.5;
*(float *)(param_1 + 0x30) = (fVar3 + fVar4) * 0.5;
*(float *)(param_1 + 0x34) = (fVar5 + *(float *)(param_1 + 0xc)) * 0.5;
lVar18 = (longdouble)GetZ(this,fVar2,fVar4);
*(float *)(pCVar13 + 0x24) = (float)lVar18;
lVar19 = (longdouble)GetZ(this,fVar1,fVar3);
*(float *)(pCVar13 + 0x28) = (float)lVar19;
if ((*(float *)(this + 0x10) - *(float *)(this + 4) <= 0.0) ||
(*(float *)(this + 0x14) - *(float *)(this + 8) <= 0.0)) {
*(int *)(pCVar13 + 0x20) = 0;
*(int *)(pCVar13 + 0x1c) = 0;
}
else {
*(float *)(pCVar13 + 0x1c) = 1.0 / (fVar2 - fVar1);
*(float *)(pCVar13 + 0x20) = 1.0 / (fVar3 - fVar4);
}
if ((0.05 <= ABS((float)lVar18 - fVar5)) || (0.05 <= ABS(*(float *)(pCVar13 + 0x28) - fVar5))) {
*(uint *)(pCVar13 + 0x54) = *(uint *)(pCVar13 + 0x54) & 0xdfffffff;
}
else {
*(uint *)(pCVar13 + 0x54) = *(uint *)(pCVar13 + 0x54) | 0x20000000;
}
iVar16 = 0;
local_2c = param_3;
local_20 = this;
do {
if (param_3 != iVar16) {
piVar10 = *(int **)(local_20 + 0x58);
iVar15 = *piVar10;
if (0 < iVar15) {
iVar17 = 0;
iVar14 = iVar15;
do {
if (iVar14 < 1) {
LAB_00704a82:
pCVar13 = (CNavArea *)0x0;
}
else {
iVar9 = 0;
if (iVar17 != 0) {
do {
iVar9 = iVar9 + 1;
if (iVar9 == iVar14) goto LAB_00704a82;
} while (iVar9 != iVar17);
}
pCVar13 = (CNavArea *)piVar10[iVar9 * 2 + 1];
}
if (iVar16 == 1) {
LAB_00704aa2:
if ((*(float *)(param_1 + 0x14) < *(float *)(pCVar13 + 8) ||
*(float *)(param_1 + 0x14) == *(float *)(pCVar13 + 8)) ||
(*(float *)(pCVar13 + 0x14) < *(float *)(param_1 + 8) ||
*(float *)(pCVar13 + 0x14) == *(float *)(param_1 + 8))) goto LAB_00704b08;
LAB_00704abb:
ConnectTo(param_1,pCVar13,iVar16);
uVar11 = (&CSWTCH_1821)[iVar16];
cVar8 = IsConnected(pCVar13,this,uVar11);
if (cVar8 != '\0') {
ConnectTo(pCVar13,param_1,uVar11);
}
}
else if (iVar16 < 2) {
if (iVar16 == 0) goto LAB_00704bd0;
}
else if (iVar16 == 2) {
LAB_00704bd0:
if ((*(float *)(pCVar13 + 4) <= *(float *)(param_1 + 0x10) &&
*(float *)(param_1 + 0x10) != *(float *)(pCVar13 + 4)) &&
(*(float *)(param_1 + 4) <= *(float *)(pCVar13 + 0x10) &&
*(float *)(pCVar13 + 0x10) != *(float *)(param_1 + 4))) goto LAB_00704abb;
}
else if (iVar16 == 3) goto LAB_00704aa2;
LAB_00704b08:
iVar14 = 0;
piVar10 = *(int **)(local_20 + 0x114);
if (0 < *piVar10) {
do {
while (pCVar13 = (CNavArea *)piVar10[iVar14 * 2 + 1], iVar16 == 1) {
LAB_00704b2a:
if ((*(float *)(param_1 + 0x14) < *(float *)(pCVar13 + 8) ||
*(float *)(param_1 + 0x14) == *(float *)(pCVar13 + 8)) ||
(*(float *)(pCVar13 + 0x14) < *(float *)(param_1 + 8) ||
*(float *)(pCVar13 + 0x14) == *(float *)(param_1 + 8))) goto LAB_00704b68;
LAB_00704b43:
ConnectTo(pCVar13,param_1,(&CSWTCH_1821)[iVar16]);
piVar10 = *(int **)(local_20 + 0x114);
LAB_00704b68:
iVar14 = iVar14 + 1;
if (*piVar10 <= iVar14) goto LAB_00704ba0;
}
if (1 < iVar16) {
if (iVar16 == 2) goto LAB_00704b7e;
if (iVar16 == 3) goto LAB_00704b2a;
goto LAB_00704b68;
}
if (iVar16 != 0) goto LAB_00704b68;
LAB_00704b7e:
if (*(float *)(param_1 + 0x10) < *(float *)(pCVar13 + 4) ||
*(float *)(param_1 + 0x10) == *(float *)(pCVar13 + 4)) goto LAB_00704b68;
if (*(float *)(param_1 + 4) <= *(float *)(pCVar13 + 0x10) &&
*(float *)(pCVar13 + 0x10) != *(float *)(param_1 + 4)) goto LAB_00704b43;
iVar14 = iVar14 + 1;
} while (iVar14 < *piVar10);
}
LAB_00704ba0:
iVar17 = iVar17 + 1;
if (iVar17 == iVar15) break;
piVar10 = *(int **)(local_20 + 0x58);
iVar14 = *piVar10;
} while( true );
}
}
local_20 = local_20 + 4;
iVar16 = iVar16 + 1;
} while (iVar16 != 4);
uVar11 = CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&TheNavAreas,DAT_00fe6000,
¶m_1);
*(undefined4 *)(param_1 + 0x90) = uVar11;
CNavMesh::AddNavArea(TheNavMesh,param_1);
iVar16 = 0;
while (*(int *)(this + iVar16 * 4 + 0xec) == 0) {
iVar16 = iVar16 + 1;
if (iVar16 == 4) {
ComputeMinMaxCornerZ(param_1);
return;
}
}
pfVar6 = *(float **)(this + 0xec);
*(float **)(param_1 + 0xec) = pfVar6;
pfVar12 = *(float **)(this + 0xf0);
*(float **)(param_1 + 0xf0) = pfVar12;
*(undefined4 *)(param_1 + 0xf4) = *(undefined4 *)(this + 0xf4);
pfVar7 = *(float **)(this + 0xf8);
*(float **)(param_1 + 0xf8) = pfVar7;
if (param_3 == 1) {
iVar15 = 3;
iVar16 = 2;
goto LAB_00704cfb;
}
pfVar12 = pfVar6;
if (param_3 < 2) {
iVar16 = 1;
iVar15 = 2;
if (param_3 == 0) goto LAB_00704cfb;
}
else {
if (param_3 == 2) {
local_2c = 3;
iVar16 = 2;
iVar15 = 0;
pfVar12 = pfVar7;
goto LAB_00704cfb;
}
if (param_3 == 3) {
local_2c = 0;
iVar16 = 3;
iVar15 = 1;
goto LAB_00704cfb;
}
}
iVar16 = 4;
iVar15 = 4;
local_2c = 4;
pfVar12 = *(float **)(param_1 + 0xfc);
LAB_00704cfb:
fVar1 = *(float *)(param_1 + 4);
fVar2 = *(float *)(param_1 + 0x10);
fVar3 = *(float *)(param_1 + 8);
fVar4 = *(float *)(param_1 + 0x14);
while ((((*pfVar12 + 12.5 < fVar1 || (fVar2 < *pfVar12 - 12.5)) || (pfVar12[1] + 12.5 < fVar3)) ||
(fVar4 < pfVar12[1] - 12.5))) {
*(float *)(param_1 + local_2c * 4 + 0xec) = pfVar12[iVar15 + 6];
*(undefined4 *)(param_1 + iVar16 * 4 + 0xec) =
*(undefined4 *)(*(int *)(param_1 + iVar16 * 4 + 0xec) + 8 + (iVar15 + 4) * 4);
pfVar12 = *(float **)(param_1 + local_2c * 4 + 0xec);
}
iVar15 = *(int *)(param_1 + 0xec);
iVar16 = *(int *)(param_1 + 0xf8);
iVar14 = *(int *)(param_1 + 0xf0);
iVar17 = iVar16;
if (iVar15 != iVar16) {
do {
iVar17 = iVar15;
if (iVar14 != iVar15) {
do {
*(CNavArea **)(iVar17 + 0x74) = param_1;
piVar10 = (int *)(iVar17 + 0x1c);
iVar17 = *piVar10;
} while (iVar14 != *piVar10);
iVar16 = *(int *)(param_1 + 0xf8);
}
iVar15 = *(int *)(iVar15 + 0x20);
iVar14 = *(int *)(iVar14 + 0x20);
} while (iVar15 != iVar16);
iVar14 = *(int *)(param_1 + 0xf0);
iVar17 = *(int *)(param_1 + 0xec);
}
*(undefined4 *)(param_1 + 0x24) = *(undefined4 *)(iVar14 + 8);
*(undefined4 *)(param_1 + 0xc) = *(undefined4 *)(iVar17 + 8);
*(undefined4 *)(param_1 + 0x28) = *(undefined4 *)(iVar16 + 8);
*(undefined4 *)(param_1 + 0x18) = *(undefined4 *)(*(int *)(param_1 + 0xf4) + 8);
ComputeMinMaxCornerZ(param_1);
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.