UTIL_FindClosestPassableSpace
0x00582330 · 2413 bytes · __cdecl
_Z29UTIL_FindClosestPassableSpaceRK6VectorS1_S1_P12ITraceFilterjjRS_
Decompiled
undefined (7 params)
/* UTIL_FindClosestPassableSpace(Vector const&, Vector const&, Vector const&, ITraceFilter*,
unsigned int, unsigned int, Vector&) */
undefined4
UTIL_FindClosestPassableSpace
(Vector *param_1,Vector *param_2,Vector *param_3,ITraceFilter *param_4,uint param_5,
uint param_6,Vector *param_7)
{
float fVar1;
byte bVar2;
int iVar3;
float *pfVar4;
uint uVar5;
uint uVar6;
int iVar7;
int iVar8;
byte bVar9;
undefined1 *puVar10;
float fVar11;
float fVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
float fVar17;
float local_294;
float local_290;
uint local_28c;
float local_288;
float local_284;
float local_280;
float local_27c;
uint local_260;
uint local_25c;
byte abStack_258 [8];
float local_250 [4];
float local_240;
float local_23c;
float local_238;
float local_234;
float local_230;
float local_22c;
float local_228 [7];
float afStack_20c [8];
float afStack_1ec [8];
float local_1cc;
float local_1c8;
float local_1c4;
float local_1bc;
float local_1b8;
float local_1b4;
undefined4 local_1ac;
undefined4 local_1a8;
undefined4 local_1a4;
float local_19c;
float local_198;
float local_194;
undefined1 local_188;
undefined1 local_187;
float local_17c;
float local_178;
float local_174;
float local_16c;
float local_168;
float local_164;
undefined4 local_15c;
undefined4 local_158;
undefined4 local_154;
float local_14c;
float local_148;
float local_144;
undefined1 local_138;
undefined1 local_137;
float local_124 [24];
undefined1 local_c4 [12];
undefined4 local_b8;
undefined4 local_b4;
undefined4 local_b0;
float local_98 [2];
char local_8d [73];
float local_44;
char local_39;
local_188 = 0;
local_187 = 1;
local_1ac = vec3_origin;
local_1a8 = DAT_01053d4c;
local_27c = *(float *)param_1;
local_1a4 = DAT_01053d50;
local_250[0] = *(float *)param_2;
local_250[1] = *(float *)(param_2 + 4);
local_284 = *(float *)(param_1 + 4);
local_290 = *(float *)param_2;
local_288 = *(float *)(param_2 + 4);
local_19c = local_290;
local_294 = *(float *)(param_2 + 8);
local_198 = local_288;
local_250[2] = *(float *)(param_2 + 8);
local_194 = local_294;
fVar16 = 1.0 / ((float)(param_6 + 1 >> 0x10) * 65536.0 + (float)(param_6 + 1 & 0xffff));
fVar15 = fVar16 * local_290;
fVar17 = fVar16 * local_288;
fVar16 = fVar16 * local_294;
fVar11 = local_250[1];
if (local_290 >= local_250[1]) {
fVar11 = local_290;
}
iVar3 = (uint)(local_290 < local_250[1]) << 2;
local_138 = 0;
if (fVar11 < *(float *)(param_2 + 8)) {
iVar3 = 8;
}
local_14c = fVar15;
local_137 = 1;
local_228[3] = 1.0 / *(float *)((int)local_250 + iVar3);
local_228[1] = (local_288 + local_288) * local_228[3];
local_228[0] = (local_290 + local_290) * local_228[3];
local_228[3] = (local_294 + local_294) * local_228[3];
local_22c = 0.0;
local_158 = DAT_01053d4c;
local_15c = vec3_origin;
fVar14 = local_228[3] * local_228[3];
local_154 = DAT_01053d50;
fVar11 = local_228[1] * local_228[1] + local_228[0] * local_228[0];
local_228[2] = SQRT(fVar11);
local_228[5] = SQRT(local_228[1] * local_228[1] + fVar14);
local_280 = *(float *)(param_1 + 8) + 0.001;
local_228[4] = SQRT(local_228[0] * local_228[0] + fVar14);
local_228[6] = SQRT(fVar11 + fVar14);
if (param_6 == 0) {
LAB_00582c6f:
*(float *)param_7 = local_27c;
*(undefined4 *)(param_7 + 4) = *(undefined4 *)(param_1 + 4);
*(undefined4 *)(param_7 + 8) = *(undefined4 *)(param_1 + 8);
return 0;
}
local_28c = 0;
local_148 = fVar17;
local_144 = fVar16;
do {
local_288 = local_288 - fVar17;
local_290 = local_290 - fVar15;
local_294 = local_294 - fVar16;
bVar9 = 0;
fVar13 = local_280 - local_294;
local_234 = local_294 + local_280;
local_23c = local_27c + local_290;
fVar14 = local_27c - local_290;
fVar12 = local_284 - local_288;
local_230 = local_288 + local_284;
uVar5 = 0;
pfVar4 = local_124;
fVar11 = local_22c;
local_250[3] = fVar13;
local_240 = fVar14;
local_238 = fVar12;
while( true ) {
*pfVar4 = fVar14;
pfVar4[1] = fVar12;
pfVar4[2] = fVar13;
iVar7 = *enginetrace;
afStack_20c[uVar5] = 0.0;
bVar2 = (**(code **)(iVar7 + 0x44))(enginetrace,pfVar4);
abStack_258[uVar5] = bVar2;
bVar9 = bVar9 | bVar2;
afStack_1ec[uVar5] = fVar11 * *(float *)(param_2 + iVar3);
uVar6 = uVar5 + 1;
if (uVar6 == 8) break;
fVar11 = local_250[uVar5 + 10];
fVar14 = local_250[(uVar6 & 1) + 4];
fVar12 = local_250[(uVar6 & 2) + 6];
fVar13 = local_250[(uVar6 & 4) + 3];
uVar5 = uVar6;
pfVar4 = pfVar4 + 3;
}
local_260 = 0;
LAB_00582718:
while (local_25c = local_260 + 1, local_260 + 1 == 8) {
local_260 = 8;
}
LAB_00582730:
puVar10 = local_c4;
iVar7 = 0;
uVar5 = local_260;
if (abStack_258[local_260] == 0) goto LAB_00582995;
LAB_00582746:
puVar10[0x37] = 1;
*(undefined4 *)(puVar10 + 0x2c) = 0;
iVar8 = iVar7;
while( true ) {
iVar7 = iVar8 + 4;
puVar10 = puVar10 + 0x54;
if (iVar7 == 8) break;
uVar5 = *(uint *)(abStack_258 + iVar8 + -4);
if (abStack_258[uVar5] != 0) goto LAB_00582746;
LAB_00582995:
iVar8 = *(int *)(abStack_258 + (-4 - iVar7));
local_174 = local_124[uVar5 * 3 + 2];
local_178 = local_124[uVar5 * 3 + 1];
local_17c = local_124[uVar5 * 3];
local_168 = local_124[iVar8 * 3 + 1] - local_124[uVar5 * 3 + 1];
local_164 = local_124[iVar8 * 3 + 2] - local_124[uVar5 * 3 + 2];
local_16c = local_124[iVar8 * 3] - local_124[uVar5 * 3];
(**(code **)(*enginetrace + 0x14))(enginetrace,&local_17c,param_5,param_4,puVar10);
iVar8 = iVar7;
}
fVar11 = afStack_1ec[local_25c ^ local_260];
if (local_98[0] == 1.0) {
iVar7 = 0;
if (local_44 != 1.0) goto LAB_00582a94;
}
else if (local_44 == 1.0) {
iVar7 = 1;
LAB_00582a94:
local_8d[iVar7 * 0x54] = '\x01';
local_98[iVar7 * 0x15] = 0.0;
}
if (local_8d[0] == '\0') {
afStack_20c[local_260] = local_98[0] * fVar11 + afStack_20c[local_260];
}
else {
abStack_258[local_260] = 1;
bVar9 = 1;
}
if (local_39 == '\0') {
afStack_20c[local_25c] = fVar11 * local_44 + afStack_20c[local_25c];
}
else {
abStack_258[local_25c] = 1;
bVar9 = 1;
}
local_25c = local_25c + 1;
if (local_25c != 8) goto LAB_00582730;
local_260 = local_260 + 1;
if (local_260 != 7) goto LAB_00582718;
if (bVar9 == 0) {
local_1cc = local_27c;
local_1c8 = local_284;
local_1c4 = local_280;
local_1b8 = *(float *)(param_1 + 4) - local_284;
local_1b4 = *(float *)(param_1 + 8) - local_280;
local_1bc = *(float *)param_1 - local_27c;
(**(code **)(*enginetrace + 0x14))(enginetrace,&local_1cc,param_5,param_4,local_c4);
if (local_8d[0] == '\0') {
*(undefined4 *)param_7 = local_b8;
*(undefined4 *)(param_7 + 4) = local_b4;
*(undefined4 *)(param_7 + 8) = local_b0;
return 1;
}
}
fVar11 = 0.0;
pfVar4 = local_124;
fVar12 = 0.0;
fVar13 = 0.0;
iVar7 = 0;
fVar14 = 0.0;
do {
if (abStack_258[iVar7] == 0) {
fVar1 = afStack_20c[iVar7];
fVar14 = fVar14 + fVar1;
fVar11 = fVar11 + (*pfVar4 - local_27c) * fVar1;
fVar12 = fVar12 + (pfVar4[1] - local_284) * fVar1;
fVar13 = fVar13 + (pfVar4[2] - local_280) * fVar1;
}
iVar7 = iVar7 + 1;
pfVar4 = pfVar4 + 3;
} while (iVar7 != 8);
if (fVar14 == 0.0) {
fVar11 = *(float *)param_3;
fVar14 = *(float *)(param_3 + 8);
fVar12 = *(float *)(param_3 + 4);
local_14c = fVar15;
local_148 = fVar17;
local_144 = fVar16;
local_294 = local_250[2];
local_290 = local_250[0];
local_288 = local_250[1];
}
else {
fVar14 = 1.0 / fVar14;
fVar11 = fVar11 * fVar14;
fVar12 = fVar12 * fVar14;
fVar14 = fVar14 * fVar13;
local_14c = local_14c + fVar15;
local_148 = local_148 + fVar17;
local_144 = local_144 + fVar16;
}
local_27c = fVar11 + local_27c;
local_280 = fVar14 + local_280;
local_284 = fVar12 + local_284;
local_28c = local_28c + 1;
if (local_28c == param_6) {
local_27c = *(float *)param_1;
goto LAB_00582c6f;
}
} while( true );
}
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.