CNavMesh::CreateObstacleTopAreaIfNecessary
0x00729790 · 2075 bytes · __thiscall
_ZN8CNavMesh32CreateObstacleTopAreaIfNecessaryEP8CNavAreaS1_10NavDirTypeb
Decompiled
undefined (5 params)
/* CNavMesh::CreateObstacleTopAreaIfNecessary(CNavArea*, CNavArea*, NavDirType, bool) */
undefined4 __thiscall
CNavMesh::CreateObstacleTopAreaIfNecessary
(CNavMesh *this,CNavArea *param_1,CNavArea *param_2,uint param_4,char param_5)
{
Vector *pVVar1;
Vector *pVVar2;
char cVar3;
undefined4 uVar4;
Vector *pVVar5;
undefined4 uVar6;
int iVar7;
longdouble lVar8;
float fVar9;
float fVar10;
float fVar11;
float fVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
float local_74;
float local_70;
float local_68;
float local_64;
float local_60;
CNavArea *local_5c;
float local_58;
float local_54;
float local_4c;
float local_48;
float local_44;
float local_40;
float local_3c;
float local_38;
float local_34;
float local_30;
float local_2c;
float local_28;
float local_24;
float local_20;
local_64 = 0.0;
local_68 = 25.0;
CNavArea::ComputePortal(param_1,param_2,param_4,&local_58,&local_60);
fVar15 = 0.0;
if (local_60 <= 0.0) {
return 0;
}
iVar7 = (int)(param_4 + 1) % 4;
pVVar5 = *(Vector **)(param_1 + param_4 * 4 + 0xec);
pVVar1 = *(Vector **)(param_1 + iVar7 * 4 + 0xec);
if (pVVar5 == (Vector *)0x0) {
return 0;
}
local_74 = 0.0;
local_70 = 0.0;
fVar16 = 3.4028235e+38;
fVar11 = fVar15;
fVar14 = fVar15;
fVar9 = fVar15;
do {
if ((*(float *)(pVVar5 + 4) - local_54) * (*(float *)(pVVar5 + 4) - local_54) +
(*(float *)pVVar5 - local_58) * (*(float *)pVVar5 - local_58) <
(local_60 + 1.0) * (local_60 + 1.0)) {
fVar10 = *(float *)(pVVar5 + param_4 * 4 + 0x38);
fVar12 = *(float *)(pVVar5 + param_4 * 4 + 0x48);
if (param_5 == '\0') {
fVar9 = *(float *)(pVVar5 + 8);
fVar11 = *(float *)(pVVar5 + param_4 * 4 + 0x28);
}
else {
cVar3 = CNavArea::Contains(param_2,pVVar5);
if (cVar3 == '\0') {
pVVar2 = *(Vector **)(pVVar5 + param_4 * 4 + 0x18);
fVar9 = *(float *)(pVVar5 + 8);
fVar11 = fVar15;
if ((pVVar2 != (Vector *)0x0) && (fVar13 = *(float *)(pVVar2 + 8) - fVar9, 18.0 < fVar13))
{
cVar3 = CNavArea::Contains(param_2,pVVar2);
if (((cVar3 != '\0') &&
(lVar8 = (longdouble)CNavArea::GetZ(param_2,*(float *)pVVar2,*(float *)(pVVar2 + 4))
, ABS(*(float *)(pVVar2 + 8) - (float)lVar8) < 2.0)) ||
((pVVar2 = *(Vector **)(pVVar2 + param_4 * 4 + 0x18), pVVar2 == (Vector *)0x0 ||
(cVar3 = CNavArea::Contains(param_2,pVVar2), cVar3 == '\0')))) goto LAB_00729d70;
fVar9 = *(float *)(pVVar5 + 8);
if (ABS(fVar9 - *(float *)(pVVar2 + 8)) <= 18.0) {
fVar12 = 30.0;
fVar10 = 20.0;
fVar11 = fVar13;
}
}
}
else {
LAB_00729d70:
fVar9 = *(float *)(pVVar5 + 8);
fVar11 = fVar15;
}
}
if (fVar11 <= fVar16) {
fVar16 = fVar11;
}
if (local_68 <= fVar10) {
fVar10 = local_68;
}
if (fVar12 <= local_64) {
fVar12 = local_64;
}
if (fVar14 <= fVar11) {
fVar14 = fVar11;
}
local_68 = fVar10;
local_64 = fVar12;
if (local_70 == 0.0) {
local_74 = fVar9;
local_70 = fVar11;
}
}
} while ((pVVar5 != pVVar1) &&
(pVVar5 = *(Vector **)(pVVar5 + iVar7 * 4 + 0x18), pVVar5 != (Vector *)0x0));
uVar6 = CONCAT31((int3)((uint)pVVar5 >> 8),18.0 < fVar16 && 18.0 < fVar14);
if (18.0 >= fVar16 || 18.0 >= fVar14) {
return 0;
}
if ((fVar11 < fVar14) && (local_70 < fVar14)) {
fVar11 = fVar14;
local_70 = fVar14;
}
fVar15 = fVar11;
fVar14 = fVar9;
if (param_4 - 2 < 2) {
fVar15 = local_70;
fVar14 = local_74;
local_74 = fVar9;
local_70 = fVar11;
}
fVar9 = 25.0;
if (param_5 != '\0') {
fVar9 = 50.0;
}
AdjustObstacleDistances(&local_68,&local_64,fVar9);
fVar9 = (local_64 - local_68) * 0.5;
fVar11 = local_68 + fVar9;
if (param_4 == 1) {
local_58 = fVar11 + local_58;
LAB_00729a57:
local_38 = fVar15 + fVar14;
local_4c = local_58 - fVar9;
local_40 = local_58 + fVar9;
local_44 = local_70 + local_74;
local_48 = local_54 - local_60;
local_30 = local_54 + local_60;
local_3c = local_48;
local_34 = local_40;
local_2c = local_38;
local_28 = local_4c;
local_24 = local_30;
local_20 = local_44;
}
else {
if ((int)param_4 < 2) {
if (param_4 == 0) {
local_54 = local_54 - fVar11;
}
else {
LAB_00729e90:
if (param_4 == 1) goto LAB_00729a57;
if ((int)param_4 < 2) {
if (param_4 != 0) goto LAB_00729abe;
}
else if (param_4 != 2) {
if (param_4 != 3) goto LAB_00729abe;
goto LAB_00729a57;
}
}
}
else {
if (param_4 != 2) {
if (param_4 != 3) goto LAB_00729e90;
local_58 = local_58 - fVar11;
goto LAB_00729a57;
}
local_54 = fVar11 + local_54;
}
local_38 = fVar15 + fVar14;
local_48 = local_54 - fVar9;
local_30 = local_54 + fVar9;
local_44 = local_70 + local_74;
local_4c = local_58 - local_60;
local_40 = local_58 + local_60;
local_3c = local_48;
local_34 = local_40;
local_2c = local_38;
local_28 = local_4c;
local_24 = local_30;
local_20 = local_44;
}
LAB_00729abe:
local_5c = (CNavArea *)(**(code **)(*(int *)this + 0x14))(this);
CNavArea::Build(local_5c,(Vector *)&local_4c,(Vector *)&local_40,(Vector *)&local_34,
(Vector *)&local_28);
uVar4 = CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&TheNavAreas,DAT_00fe6000,
&local_5c);
*(undefined4 *)(local_5c + 0x90) = uVar4;
AddNavArea(this,local_5c);
Msg("Created new fencetop area %d(%x) between %d(%x) and %d(%x)\n",
*(undefined4 *)(local_5c + 0x8c),*(undefined4 *)(local_5c + 0x90),
*(undefined4 *)(param_1 + 0x8c),*(undefined4 *)(param_1 + 0x90),
*(undefined4 *)(param_2 + 0x8c),*(undefined4 *)(param_2 + 0x90));
*(undefined4 *)(local_5c + 0x54) = *(undefined4 *)(param_1 + 0x54);
*(uint *)(local_5c + 0x54) = *(uint *)(param_1 + 0x54) | 0x6000;
CNavArea::Disconnect(param_1,param_2);
CNavArea::ConnectTo(param_1,local_5c,param_4);
if (param_4 < 4) {
uVar4 = (&CSWTCH_1514)[param_4];
CNavArea::ConnectTo(local_5c,param_1,uVar4);
CNavArea::ConnectTo(local_5c,param_2,param_4);
}
else {
uVar4 = 0;
CNavArea::ConnectTo(local_5c,param_1,0);
CNavArea::ConnectTo(local_5c,param_2,param_4);
}
cVar3 = CNavArea::IsConnected(param_2,param_1,uVar4);
if (cVar3 != '\0') {
CNavArea::Disconnect(param_2,param_1);
uVar4 = 0;
if (param_4 < 4) {
uVar4 = (&CSWTCH_1514)[param_4];
}
CNavArea::ConnectTo(param_2,local_5c,uVar4);
return uVar6;
}
return uVar6;
}
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.