JumpConnector::TryToConnect
0x0072f030 · 3419 bytes · __thiscall
_ZN13JumpConnector12TryToConnectEP8CNavAreaPK27CUtlVectorUltraConservativeI10NavConnect36CUtlVectorUltraConservativeAllocatorES7_10NavDirType
Decompiled
undefined (5 params)
/* JumpConnector::TryToConnect(CNavArea*, CUtlVectorUltraConservative<NavConnect,
CUtlVectorUltraConservativeAllocator> const*, CUtlVectorUltraConservative<NavConnect,
CUtlVectorUltraConservativeAllocator> const*, NavDirType) */
void __thiscall
JumpConnector::TryToConnect
(JumpConnector *this,undefined4 param_1,undefined4 *param_2,undefined4 *param_3,
uint param_5)
{
CNavArea *this_00;
CNavArea *this_01;
CFuncNavConnectionBlocker *this_02;
float fVar1;
float fVar2;
float fVar3;
char cVar4;
int *piVar5;
int iVar6;
int iVar7;
int iVar8;
int iVar9;
float local_120;
float local_11c;
Vector local_118 [12];
float local_10c;
float local_108;
float local_104;
float local_100;
float local_fc;
float local_f8;
float local_f4;
float local_f0;
float local_ec;
float local_e8;
float local_e4;
float local_e0;
CTraceFilterSimple local_dc [16];
float local_cc;
float local_c8;
float local_c4;
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;
Vector local_70 [12];
Vector local_64 [8];
float local_5c;
float local_44;
char local_39;
iVar8 = 0;
piVar5 = (int *)*param_2;
if (*piVar5 < 1) {
return;
}
LAB_0072f0c5:
do {
this_00 = (CNavArea *)piVar5[iVar8 * 2 + 1];
cVar4 = CNavArea::IsConnected(this_00,param_1,param_5);
if (cVar4 != '\0') {
if (((byte)this_00[0x54] & 2) == 0) {
piVar5 = (int *)*param_3;
if (0 < *piVar5) {
iVar9 = 0;
LAB_0072f11b:
this_01 = (CNavArea *)piVar5[iVar9 * 2 + 1];
if (((byte)this_01[0x54] & 2) != 0) goto LAB_0072f110;
CNavArea::ComputePortal(this_00,this_01,param_5,local_118,&local_11c);
if (0.0 < local_11c) {
CNavArea::GetClosestPointOnArea(this_00,local_118,(Vector *)&local_10c);
CNavArea::GetClosestPointOnArea(this_01,local_118,(Vector *)&local_100);
if ((((((byte)this_00[0x55] & 0x10) == 0) || (local_f8 <= local_104 + 18.0)) &&
(local_104 - local_f8 < 400.0)) && (64.0 < local_104 - local_f8)) {
local_120 = 1.0;
iVar7 = 200;
do {
local_ec = local_104;
local_bc = 0.0;
local_e0 = local_120 + local_104;
local_b8 = 0.0;
local_f0 = local_108;
local_e4 = local_108;
local_b4 = local_e0 - local_104;
local_8c = 0;
local_94 = (DAT_00fe6ba8 - DAT_00fe6bb4) * 0.5;
local_f4 = local_10c;
local_e8 = local_10c;
local_a4 = (DAT_00fe6ba8 + DAT_00fe6bb4) * 0.5;
local_87 = local_b4 * local_b4 != 0.0;
local_9c = (NavTraceMaxs - NavTraceMins) * 0.5;
local_c4 = local_104 + local_a4;
local_98 = (DAT_00fe6ba4 - DAT_00fe6bb0) * 0.5;
local_ac = (NavTraceMaxs + NavTraceMins) * 0.5;
local_cc = local_10c + local_ac;
local_a8 = (DAT_00fe6ba4 + DAT_00fe6bb0) * 0.5;
local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
local_ac = -local_ac;
local_a4 = -local_a4;
local_c8 = local_108 + local_a8;
local_a8 = -local_a8;
CTraceFilterSimple::CTraceFilterSimple
(local_dc,(IHandleEntity *)0x0,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
(**(code **)(*enginetrace + 0x14))(enginetrace,&local_cc,0x2420b,local_dc,local_70);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_70,local_64,0xff,0xff,0,true,-1.0);
}
if ((0.0 < local_44) && (local_39 == '\0')) {
local_b4 = 0.0;
local_8c = 0;
local_f0 = local_108;
local_f4 = local_10c;
local_e4 = local_fc;
local_b8 = local_fc - local_108;
local_e8 = local_100;
local_bc = local_100 - local_10c;
local_ec = local_5c - 0.5;
local_9c = (NavTraceMaxs - NavTraceMins) * 0.5;
local_ac = (NavTraceMaxs + NavTraceMins) * 0.5;
local_87 = local_b8 * local_b8 + local_bc * local_bc != 0.0;
local_98 = (DAT_00fe6ba4 - DAT_00fe6bb0) * 0.5;
local_94 = (DAT_00fe6ba8 - DAT_00fe6bb4) * 0.5;
local_a8 = (DAT_00fe6ba4 + DAT_00fe6bb0) * 0.5;
local_a4 = (DAT_00fe6ba8 + DAT_00fe6bb4) * 0.5;
local_c8 = local_108 + local_a8;
local_c4 = local_ec + local_a4;
local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06
;
local_cc = local_10c + local_ac;
local_ac = -local_ac;
local_a8 = -local_a8;
local_a4 = -local_a4;
local_e0 = local_ec;
CTraceFilterSimple::CTraceFilterSimple
(local_dc,(IHandleEntity *)0x0,0,(_func_bool_IHandleEntity_ptr_int *)0x0
);
(**(code **)(*enginetrace + 0x14))
(enginetrace,&local_cc,0x2420b,local_dc,local_70);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_70,local_64,0xff,0xff,0,true,-1.0);
}
fVar3 = local_e0;
fVar2 = local_e4;
fVar1 = local_e8;
if ((local_44 == 1.0) && (local_39 == '\0')) {
if (local_120 <= 200.0) {
local_f4 = local_e8;
local_f0 = local_e4;
local_ec = local_e0;
local_e0 = local_f8 + 2.0;
UTIL_TraceHull((Vector *)&local_f4,(Vector *)&local_e8,(Vector *)&NavTraceMins
,(Vector *)&NavTraceMaxs,0x2420b,(IHandleEntity *)0x0,0,
(CGameTrace *)local_70);
if (((0.0 < local_44) && (local_39 == '\0')) && (local_5c <= local_e0 + 18.0))
{
iVar7 = *(int *)(TheNavMesh + 0x44);
if (iVar7 < 1) goto LAB_0072fd14;
iVar6 = 0;
goto LAB_0072f805;
}
}
break;
}
}
iVar7 = iVar7 + -1;
local_120 = local_120 + 1.0;
} while (iVar7 != 0);
}
}
goto LAB_0072fd50;
}
}
else {
iVar9 = 0;
if (param_5 < 4) {
iVar9 = (&CSWTCH_1514)[param_5];
}
TryToConnect(this,param_1,this_00 + iVar9 * 4 + 0x114,param_3,param_5);
TryToConnect(this,param_1,this_00 + iVar9 * 4 + 0x58,param_3,param_5);
}
}
iVar8 = iVar8 + 1;
piVar5 = (int *)*param_2;
if (*piVar5 <= iVar8) {
return;
}
} while( true );
LAB_0072f805:
do {
this_02 = *(CFuncNavConnectionBlocker **)(*(int *)(TheNavMesh + 0x38) + iVar6 * 4);
if (this_02 != (CFuncNavConnectionBlocker *)0x0) {
local_bc = 0.0;
local_b4 = fVar3 - local_104;
local_b8 = 0.0;
local_8c = 0;
local_9c = (NavTraceMaxs - NavTraceMins) * 0.5;
local_87 = local_b4 * local_b4 != 0.0;
local_94 = (DAT_00fe6ba8 - DAT_00fe6bb4) * 0.5;
local_98 = (DAT_00fe6ba4 - DAT_00fe6bb0) * 0.5;
local_ac = (NavTraceMaxs + NavTraceMins) * 0.5;
local_a8 = (DAT_00fe6ba4 + DAT_00fe6bb0) * 0.5;
local_a4 = (DAT_00fe6ba8 + DAT_00fe6bb4) * 0.5;
local_cc = local_10c + local_ac;
local_c8 = local_108 + local_a8;
local_ac = -local_ac;
local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
local_c4 = local_104 + local_a4;
local_a8 = -local_a8;
local_a4 = -local_a4;
cVar4 = CFuncNavConnectionBlocker::CollideWithRay(this_02,(Ray_t *)&local_cc);
if (cVar4 == '\0') {
local_b4 = 0.0;
local_8c = 0;
local_bc = fVar1 - local_10c;
local_b8 = fVar2 - local_108;
local_87 = local_b8 * local_b8 + local_bc * local_bc != 0.0;
local_94 = (DAT_00fe6ba8 - DAT_00fe6bb4) * 0.5;
local_9c = (NavTraceMaxs - NavTraceMins) * 0.5;
local_98 = (DAT_00fe6ba4 - DAT_00fe6bb0) * 0.5;
local_ac = (NavTraceMaxs + NavTraceMins) * 0.5;
local_a8 = (DAT_00fe6ba4 + DAT_00fe6bb0) * 0.5;
local_a4 = (DAT_00fe6ba8 + DAT_00fe6bb4) * 0.5;
local_cc = local_10c + local_ac;
local_ac = -local_ac;
local_c8 = local_108 + local_a8;
local_88 = local_94 * local_94 + local_98 * local_98 + local_9c * local_9c < 1e-06;
local_c4 = fVar3 + local_a4;
local_a8 = -local_a8;
local_a4 = -local_a4;
cVar4 = CFuncNavConnectionBlocker::CollideWithRay(this_02,(Ray_t *)&local_cc);
if (cVar4 == '\0') {
local_8c = 0;
local_b8 = local_fc - fVar2;
local_bc = local_100 - fVar1;
local_b4 = (local_f8 + 2.0) - fVar3;
local_ac = (NavTraceMaxs + NavTraceMins) * 0.5;
local_9c = (NavTraceMaxs - NavTraceMins) * 0.5;
local_87 = local_b8 * local_b8 + local_bc * local_bc + local_b4 * local_b4 != 0.0;
local_98 = (DAT_00fe6ba4 - DAT_00fe6bb0) * 0.5;
local_a8 = (DAT_00fe6ba4 + DAT_00fe6bb0) * 0.5;
local_94 = (DAT_00fe6ba8 - DAT_00fe6bb4) * 0.5;
local_a4 = (DAT_00fe6ba8 + DAT_00fe6bb4) * 0.5;
local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
local_cc = fVar1 + local_ac;
local_c8 = fVar2 + local_a8;
local_ac = -local_ac;
local_a8 = -local_a8;
local_c4 = fVar3 + local_a4;
local_a4 = -local_a4;
cVar4 = CFuncNavConnectionBlocker::CollideWithRay(this_02,(Ray_t *)&local_cc);
if (cVar4 == '\0') goto LAB_0072fcfd;
}
}
piVar5 = (int *)*param_3;
goto LAB_0072f110;
}
LAB_0072fcfd:
iVar6 = iVar6 + 1;
} while (iVar6 != iVar7);
LAB_0072fd14:
cVar4 = IsValidJumpDownConnection(this_00,this_01,param_5);
if (cVar4 != '\0') {
CNavArea::ConnectTo(this_00,this_01,param_5);
}
LAB_0072fd50:
iVar9 = iVar9 + 1;
piVar5 = (int *)*param_3;
if (*piVar5 <= iVar9) goto LAB_0072fd60;
goto LAB_0072f11b;
LAB_0072f110:
iVar9 = iVar9 + 1;
if (*piVar5 <= iVar9) goto LAB_0072fd60;
goto LAB_0072f11b;
LAB_0072fd60:
piVar5 = (int *)*param_2;
iVar8 = iVar8 + 1;
if (*piVar5 <= iVar8) {
return;
}
goto LAB_0072f0c5;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.