SelectAreasWithNonWalkableConnections
0x0098e0a0 · 4550 bytes · __regparm3
_ZL37SelectAreasWithNonWalkableConnectionsP16NavAreaCollector
Decompiled
undefined (1 param)
/* SelectAreasWithNonWalkableConnections(NavAreaCollector*) */
void __regparm3 SelectAreasWithNonWalkableConnections(NavAreaCollector *param_1)
{
int iVar1;
CNavArea *pCVar2;
CNavArea *pCVar3;
float fVar4;
char cVar5;
int iVar6;
CNavArea **ppCVar7;
int iVar8;
int iVar9;
int *piVar10;
float fVar11;
float fVar12;
float fVar13;
Vector *pVVar14;
float fVar15;
CTraceFilterSimple *this;
CTraceFilterSimple *pCVar16;
Vector *pVVar17;
float in_stack_fffffdc8;
int local_22c;
byte local_221;
CUtlMemory<CNavArea*,int> *local_220;
CNavArea *local_214;
int local_210;
byte local_20c;
int local_1f0;
CBaseEntity *local_1ec;
undefined1 local_1e8 [4];
CNavArea *local_1e4;
CNavArea *local_1e0;
CNavArea *local_1dc;
float local_1d8;
float local_1d4;
float local_1d0;
float local_1cc;
float local_1c8;
float local_1c4;
float local_1c0;
float local_1bc;
float local_1b8;
float local_1b4;
float local_1b0;
float local_1ac;
int local_1a8 [5];
int *local_194;
undefined4 local_190;
undefined4 local_18c;
int local_188;
int *local_184;
undefined **local_180 [4];
undefined4 local_170;
float local_16c;
float local_168;
float local_164;
float local_15c;
float local_158;
float local_154;
float local_14c;
float local_148;
float local_144;
float local_13c;
float local_138;
float local_134;
undefined4 local_12c;
undefined1 local_128;
undefined1 local_127;
float local_11c;
float local_118;
float local_114;
float local_10c;
float local_108;
undefined4 local_104;
float local_fc;
float local_f8;
float local_f4;
float local_ec;
float local_e8;
float local_e4;
undefined4 local_dc;
undefined1 local_d8;
undefined1 local_d7;
float local_cc;
float local_c8;
float local_c4;
float local_c0;
float local_bc;
float local_b8;
float local_b4;
float local_ac;
float local_a8;
float local_a4;
float local_9c;
float local_98;
float local_94;
undefined4 local_8c;
undefined1 local_88;
undefined1 local_87;
CNavArea *local_70;
float local_6c;
float local_68;
float local_64;
float local_60;
float local_5c;
float local_44;
char local_39;
local_1a8[0] = 0;
iVar1 = *(int *)(param_1 + 0x10);
local_1a8[1] = 0;
local_1a8[2] = 0;
local_1a8[3] = 0;
local_1a8[4] = 0;
local_1ec = (CBaseEntity *)0x0;
while (local_1ec = (CBaseEntity *)
CGlobalEntityList::FindEntityByClassname
((CGlobalEntityList *)gEntList,local_1ec,"func_nav_blocker"),
local_1ec != (CBaseEntity *)0x0) {
/* try { // try from 0098e11f to 0098e141 has its CatchHandler @ 0098e82c */
CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)local_1a8,local_1a8[3],
&local_1ec);
}
local_194 = (int *)0x0;
local_190 = 0;
local_18c = 0;
local_188 = 0;
local_184 = (int *)0x0;
local_1ec = (CBaseEntity *)0x0;
if (DAT_00fe6000 < 1) {
local_1d0 = 17.5;
local_1d8 = WalkableTraceMaxs;
local_1d4 = DAT_0101692c;
}
else {
local_1f0 = 0;
do {
pCVar2 = *(CNavArea **)(TheNavAreas + local_1f0 * 4);
/* try { // try from 0098e1d3 to 0098e7c3 has its CatchHandler @ 0098e8a6 */
if ((*(int *)(pCVar2 + 0x70) < *(int *)(gpGlobals + 0x18)) &&
(cVar5 = CNavArea::IsBlocked(pCVar2,-1,false), cVar5 == '\0')) {
CNavArea::GetExtent(pCVar2,(Extent *)&local_cc);
iVar9 = 0;
if (0 < local_1a8[3]) {
do {
iVar6 = *(int *)(local_1a8[0] + iVar9 * 4);
(**(code **)(*(int *)(iVar6 + 0x194) + 0x3c))(iVar6 + 0x194,&local_70,&local_64);
local_64 = local_64 + 100.0;
local_70 = (CNavArea *)((float)local_70 - 100.0);
local_6c = local_6c - 100.0;
local_68 = local_68 - 100.0;
local_60 = local_60 + 100.0;
local_5c = local_5c + 100.0;
if (((((local_cc <= local_64) && ((float)local_70 <= local_c0)) &&
(local_c8 <= local_60)) && ((local_6c <= local_bc && (local_c4 <= local_5c)))) &&
(local_68 <= local_b8)) goto LAB_0098e2fb;
iVar9 = iVar9 + 1;
} while (iVar9 < local_1a8[3]);
}
if ((*(uint *)(pCVar2 + 0x54) & 0x30000) != 0) goto LAB_0098e2fb;
}
else {
LAB_0098e2fb:
local_70 = pCVar2;
CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&local_194,local_188,&local_70
);
}
local_1f0 = local_1f0 + 1;
} while (local_1f0 < DAT_00fe6000);
local_1d0 = 17.5;
local_1d8 = WalkableTraceMaxs;
local_1d4 = DAT_0101692c;
if (0 < DAT_00fe6000) {
local_22c = 0;
do {
pCVar2 = *(CNavArea **)(TheNavAreas + local_22c * 4);
if (s_testNavID < 1) {
local_221 = IsAreaTestable(pCVar2);
}
else {
local_221 = s_testNavID == *(int *)(pCVar2 + 0x8c);
}
if (local_221 != 0) {
if (local_188 < 1) {
LAB_0098e3d2:
local_20c = 0;
}
else if (pCVar2 == (CNavArea *)*local_194) {
local_20c = local_221;
}
else {
iVar9 = 0;
do {
iVar9 = iVar9 + 1;
if (iVar9 == local_188) goto LAB_0098e3d2;
} while (pCVar2 != (CNavArea *)local_194[iVar9]);
local_20c = (byte)~(byte)((uint)iVar9 >> 0x18) >> 7;
}
local_210 = 0;
local_214 = pCVar2 + 0x58;
do {
if ((local_214 != (CNavArea *)0x0) && (piVar10 = *(int **)local_214, 0 < *piVar10)) {
iVar9 = 0;
do {
pCVar3 = (CNavArea *)piVar10[iVar9 * 2 + 1];
if (pCVar3 != (CNavArea *)0x0) {
if (local_188 < 1) {
LAB_0098e450:
local_1f0._0_1_ = 0;
}
else {
if (pCVar3 == (CNavArea *)*local_194) {
local_1f0._0_1_ = local_221;
}
else {
iVar6 = 0;
do {
iVar6 = iVar6 + 1;
if (iVar6 == local_188) goto LAB_0098e450;
} while (pCVar3 != (CNavArea *)local_194[iVar6]);
local_1f0._0_1_ = (byte)~(byte)((uint)iVar6 >> 0x18) >> 7;
}
if (((byte)local_1f0 != 0) && (local_20c != 0)) goto LAB_0098e7e8;
}
this = (CTraceFilterSimple *)local_180;
CTraceFilterSimple::CTraceFilterSimple
(this,(IHandleEntity *)0x0,8,(_func_bool_IHandleEntity_ptr_int *)0x0);
local_180[0] = &PTR_ShouldHitEntity_00ca1b68;
local_170 = 0xf;
if (local_20c == 0) {
local_1c0 = *(float *)(pCVar2 + 0x2c);
local_1bc = *(float *)(pCVar2 + 0x30);
local_1b8 = *(float *)(pCVar2 + 0x34) + 18.0;
/* try { // try from 0098ea5a to 0098f0e6 has its CatchHandler @ 0098e8a6 */
CNavArea::ComputePortal(pCVar2,pCVar3,local_210,&local_1cc,local_1e8);
local_1b4 = local_1cc;
local_1b0 = local_1c8;
local_1ac = local_1c4 + 18.0;
iVar6 = *(int *)(CSWTCH_1258 + local_210 * 4);
if (iVar6 == 1) {
local_1b4 = local_1cc + local_1d8;
}
else if (iVar6 < 2) {
if (iVar6 == 0) {
local_1b0 = local_1c8 - local_1d8;
}
}
else if (iVar6 == 2) {
local_1b0 = local_1c8 + local_1d8;
}
else if (iVar6 == 3) {
local_1b4 = local_1cc - local_1d8;
}
local_12c = 0;
local_15c = local_1b4 - local_1c0;
local_158 = local_1b0 - local_1bc;
local_154 = local_1ac - local_1b8;
local_13c = (local_1d8 - WalkableTraceMins) * 0.5;
local_14c = (local_1d8 + WalkableTraceMins) * 0.5;
local_127 = local_158 * local_158 + local_15c * local_15c +
local_154 * local_154 != 0.0;
local_138 = (local_1d4 - DAT_01016938) * 0.5;
local_16c = local_1c0 + local_14c;
local_14c = -local_14c;
local_134 = (local_1d0 - DAT_0101693c) * 0.5;
local_148 = (local_1d4 + DAT_01016938) * 0.5;
local_144 = (local_1d0 + DAT_0101693c) * 0.5;
local_168 = local_1bc + local_148;
local_148 = -local_148;
local_128 = local_138 * local_138 + local_13c * local_13c +
local_134 * local_134 < 1e-06;
local_164 = local_1b8 + local_144;
local_144 = -local_144;
pVVar14 = (Vector *)&local_16c;
fVar15 = 2.29743e-41;
pCVar16 = this;
pVVar17 = (Vector *)&local_70;
(**(code **)(*enginetrace + 0x14))(enginetrace);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
pVVar14 = (Vector *)&local_64;
in_stack_fffffdc8 = 1.4013e-45;
pVVar17 = (Vector *)0x0;
pCVar16 = (CTraceFilterSimple *)0xff;
fVar15 = 3.57331e-43;
DebugDrawLine((Vector *)&local_70,pVVar14,0xff,0xff,0,true,-1.0);
}
DrawTroubleSweptHull
(pCVar2,(Vector *)&local_1c0,(Vector *)&local_1b4,(Vector *)&local_1d8
,pVVar14,fVar15,(float)pCVar16,(float)pVVar17,in_stack_fffffdc8);
if ((local_39 != '\0') || (local_44 < 1.0)) {
local_1e4 = pCVar2;
if (*param_1 == (NavAreaCollector)0x0) {
iVar6 = *(int *)(param_1 + 0x10);
}
else {
iVar6 = *(int *)(param_1 + 0x10);
if (0 < iVar6) {
if (pCVar2 != (CNavArea *)**(int **)(param_1 + 4)) {
iVar8 = 0;
do {
iVar8 = iVar8 + 1;
if (iVar8 == iVar6) goto LAB_0098f15e;
} while (pCVar2 != (CNavArea *)(*(int **)(param_1 + 4))[iVar8]);
if (iVar8 < 0) goto LAB_0098f15e;
}
goto LAB_0098e49e;
}
}
LAB_0098f15e:
ppCVar7 = &local_1e4;
LAB_0098f057:
CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)(param_1 + 4),
iVar6,ppCVar7);
}
else {
CNavArea::ComputePortal(pCVar3,pCVar2,iVar6,&local_cc,local_1e8);
fVar4 = local_1b0;
fVar15 = local_1b4;
if (local_c4 + 18.0 < local_1c4) {
local_1c0 = local_1b4;
local_1bc = local_1b0;
local_1b8 = local_1ac;
if (local_210 == 2) {
fVar11 = local_1b0 + 32.0;
LAB_0098edd7:
local_108 = fVar11 - local_1b0;
fVar13 = 0.0;
local_10c = 0.0;
fVar12 = local_108 * local_108;
local_1b0 = fVar11;
}
else {
if (local_210 == 3) {
fVar11 = local_1b4 - 32.0;
}
else {
if (local_210 != 1) {
fVar11 = local_1b0 - 32.0;
goto LAB_0098edd7;
}
fVar11 = local_1b4 + 32.0;
}
local_10c = fVar11 - local_1b4;
fVar12 = 0.0;
local_108 = 0.0;
fVar13 = local_10c * local_10c;
local_1b4 = fVar11;
}
local_d7 = fVar12 + fVar13 != 0.0;
local_104 = 0;
local_dc = 0;
local_e4 = (local_1d0 - DAT_0101693c) * 0.5;
local_e8 = (local_1d4 - DAT_01016938) * 0.5;
local_ec = (local_1d8 - WalkableTraceMins) * 0.5;
local_f8 = (local_1d4 + DAT_01016938) * 0.5;
local_fc = (local_1d8 + WalkableTraceMins) * 0.5;
local_f4 = (local_1d0 + DAT_0101693c) * 0.5;
local_118 = fVar4 + local_f8;
local_f8 = -local_f8;
local_11c = fVar15 + local_fc;
local_fc = -local_fc;
local_114 = local_1ac + local_f4;
local_f4 = -local_f4;
local_d8 = local_e4 * local_e4 + local_ec * local_ec + local_e8 * local_e8 <
1e-06;
pVVar14 = (Vector *)&local_11c;
fVar15 = 2.29743e-41;
pCVar16 = this;
pVVar17 = (Vector *)&local_70;
(**(code **)(*enginetrace + 0x14))(enginetrace);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
pVVar14 = (Vector *)&local_64;
in_stack_fffffdc8 = 1.4013e-45;
pVVar17 = (Vector *)0x0;
pCVar16 = (CTraceFilterSimple *)0xff;
fVar15 = 3.57331e-43;
DebugDrawLine((Vector *)&local_70,pVVar14,0xff,0xff,0,true,-1.0);
}
DrawTroubleSweptHull
(pCVar2,(Vector *)&local_1c0,(Vector *)&local_1b4,
(Vector *)&local_1d8,pVVar14,fVar15,(float)pCVar16,(float)pVVar17
,in_stack_fffffdc8);
if ((local_39 != '\0') || (local_44 < 1.0)) {
local_1e0 = pCVar2;
if (*param_1 == (NavAreaCollector)0x0) {
iVar6 = *(int *)(param_1 + 0x10);
}
else {
iVar6 = *(int *)(param_1 + 0x10);
if (0 < iVar6) {
if (pCVar2 != (CNavArea *)**(int **)(param_1 + 4)) {
iVar8 = 0;
do {
iVar8 = iVar8 + 1;
if (iVar8 == iVar6) goto LAB_0098f051;
} while (pCVar2 != (CNavArea *)(*(int **)(param_1 + 4))[iVar8]);
if (iVar8 < 0) goto LAB_0098f051;
}
goto LAB_0098e49e;
}
}
LAB_0098f051:
ppCVar7 = &local_1e0;
goto LAB_0098f057;
}
}
}
}
LAB_0098e49e:
if (((byte)local_1f0 == 0) &&
(*(int *)(nav_trouble_walkable_backtrace._28_4_ + 0x30) != 0)) {
local_16c = *(float *)(pCVar3 + 0x2c);
local_168 = *(float *)(pCVar3 + 0x30);
local_164 = *(float *)(pCVar3 + 0x34) + 18.0;
CNavArea::ComputePortal
(pCVar3,pCVar2,*(undefined4 *)(CSWTCH_1258 + local_210 * 4),&local_1cc
,local_1e8);
local_11c = local_1cc;
local_118 = local_1c8;
local_114 = local_1c4 + 18.0;
if (local_210 == 2) {
local_118 = local_1c8 + local_1d8;
}
else if (local_210 == 3) {
local_11c = local_1cc - local_1d8;
}
else if (local_210 == 1) {
local_11c = local_1cc + local_1d8;
}
else {
local_118 = local_1c8 - local_1d8;
}
local_8c = 0;
local_b8 = local_118 - local_168;
local_bc = local_11c - local_16c;
local_b4 = local_114 - local_164;
local_87 = local_b8 * local_b8 + local_bc * local_bc + local_b4 * local_b4 !=
0.0;
local_98 = (local_1d4 - DAT_01016938) * 0.5;
local_94 = (local_1d0 - DAT_0101693c) * 0.5;
local_9c = (local_1d8 - WalkableTraceMins) * 0.5;
local_a8 = (local_1d4 + DAT_01016938) * 0.5;
local_ac = (local_1d8 + WalkableTraceMins) * 0.5;
local_a4 = (local_1d0 + DAT_0101693c) * 0.5;
local_c8 = local_168 + local_a8;
local_a8 = -local_a8;
local_cc = local_16c + local_ac;
local_ac = -local_ac;
local_c4 = local_164 + local_a4;
local_88 = local_94 * local_94 + local_98 * local_98 + local_9c * local_9c <
1e-06;
local_a4 = -local_a4;
pVVar14 = (Vector *)&local_cc;
fVar15 = 2.29743e-41;
pVVar17 = (Vector *)&local_70;
(**(code **)(*enginetrace + 0x14))(enginetrace);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
pVVar14 = (Vector *)&local_64;
in_stack_fffffdc8 = 1.4013e-45;
pVVar17 = (Vector *)0x0;
this = (CTraceFilterSimple *)0xff;
fVar15 = 3.57331e-43;
DebugDrawLine((Vector *)&local_70,pVVar14,0xff,0xff,0,true,-1.0);
}
DrawTroubleSweptHull
(pCVar2,(Vector *)&local_16c,(Vector *)&local_11c,(Vector *)&local_1d8
,pVVar14,fVar15,(float)this,(float)pVVar17,in_stack_fffffdc8);
if ((local_39 != '\0') || (local_44 < 1.0)) {
local_1dc = pCVar2;
if (*param_1 == (NavAreaCollector)0x0) {
iVar6 = *(int *)(param_1 + 0x10);
}
else {
iVar6 = *(int *)(param_1 + 0x10);
if (0 < iVar6) {
if (pCVar2 != (CNavArea *)**(int **)(param_1 + 4)) {
iVar8 = 0;
do {
iVar8 = iVar8 + 1;
if (iVar8 == iVar6) goto LAB_0098f0c8;
} while (pCVar2 != (CNavArea *)(*(int **)(param_1 + 4))[iVar8]);
if (iVar8 < 0) goto LAB_0098f0c8;
}
goto LAB_0098e7e0;
}
}
LAB_0098f0c8:
CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)(param_1 + 4),
iVar6,&local_1dc);
}
}
LAB_0098e7e0:
piVar10 = *(int **)local_214;
}
LAB_0098e7e8:
iVar9 = iVar9 + 1;
} while (iVar9 < *piVar10);
}
local_210 = local_210 + 1;
local_214 = local_214 + 4;
} while (local_210 != 4);
}
local_22c = local_22c + 1;
} while (local_22c < DAT_00fe6000);
}
}
local_220 = (CUtlMemory<CNavArea*,int> *)&local_194;
local_188 = 0;
CUtlMemory<CNavArea*,int>::Purge(local_220);
local_184 = local_194;
CUtlMemory<CNavArea*,int>::Purge(local_220);
local_1a8[3] = 0;
CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)local_1a8);
local_1a8[4] = local_1a8[0];
CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)local_1a8);
if (iVar1 < *(int *)(param_1 + 0x10)) {
Warning("%s found %d areas\n","Areas with non-walkable connections check",
*(int *)(param_1 + 0x10) - iVar1);
}
else {
Msg("%s passed\n","Areas with non-walkable connections check");
}
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.