CEngineTrace::GetCollidableFromDisplacementsInAABB
0x00158ae0 · 1236 bytes · __thiscall
_ZN12CEngineTrace36GetCollidableFromDisplacementsInAABBERK6VectorS2_
Decompiled
undefined (3 params)
/* CEngineTrace::GetCollidableFromDisplacementsInAABB(Vector const&, Vector const&) */
undefined4 __thiscall
CEngineTrace::GetCollidableFromDisplacementsInAABB
(CEngineTrace *this,Vector *param_1,Vector *param_2)
{
int *piVar1;
undefined4 *puVar2;
ushort uVar3;
short sVar4;
code *pcVar5;
int iVar6;
undefined4 uVar7;
char cVar8;
int iVar9;
int iVar10;
uint uVar11;
undefined4 uVar12;
uint uVar13;
uint uVar14;
int in_GS_OFFSET;
int aiStack_18d0 [8];
undefined1 auStack_18b0 [8];
int local_18a8;
int local_18a4;
int local_18a0;
undefined1 *local_189c;
int local_1898;
Vector *local_1894;
undefined4 local_1890;
int local_188c;
int local_1888;
int local_1884;
uint local_1880;
Vector *local_187c;
Vector *local_1878;
int local_1874;
int local_1870;
int local_1860;
undefined4 local_185c;
undefined4 local_1858;
undefined4 local_1854;
undefined4 local_1850;
undefined4 local_184c;
undefined4 local_1848;
undefined4 local_1844;
undefined4 local_1840;
undefined4 local_183c;
int local_1838;
int local_1834;
int local_1830;
int local_182c;
ushort local_1820 [3072];
int local_20;
local_1894 = param_1;
local_1878 = param_2;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
iVar6 = -((DAT_00394394 * 4 + 0xfU & 0xfffffff0) + 0x10);
*(int *)((int)aiStack_18d0 + iVar6 + 0x10) = DAT_00394394;
local_189c = auStack_18b0 + iVar6;
*(Vector **)((int)aiStack_18d0 + iVar6 + 4) = param_1;
*(undefined4 *)((int)aiStack_18d0 + iVar6 + 0x14) = 0;
*(Vector **)((int)aiStack_18d0 + iVar6 + 8) = param_2;
*(undefined1 **)((int)aiStack_18d0 + iVar6 + 0xc) = local_189c;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158b55;
iVar9 = CM_BoxLeafnums(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
*(Vector **)((int)aiStack_18d0 + iVar6 + 8),
*(int **)((int)aiStack_18d0 + iVar6 + 0xc),
*(int *)((int)aiStack_18d0 + iVar6 + 0x10),
*(int **)((int)aiStack_18d0 + iVar6 + 0x14));
iVar10 = *physcollision;
local_18a8 = iVar9;
*(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
pcVar5 = *(code **)(iVar10 + 0x2c);
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158b6a;
local_1890 = (*pcVar5)();
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158b75;
local_1860 = BeginTrace();
local_1884 = *(int *)(local_1860 + 0x150 + *(int *)(local_1860 + 0x11c) * 0x14);
local_1888 = *(int *)(local_1860 + 0x120 + *(int *)(local_1860 + 0x11c) * 4);
if (0 < iVar9) {
local_18a4 = 0;
local_18a0 = 0;
do {
iVar10 = *(int *)(local_189c + local_18a4 * 4);
if ((iVar10 < 0) || (DAT_0039439c <= iVar10)) {
*(char **)((int)aiStack_18d0 + iVar6 + 4) = "Cannot load corrupted map.\n";
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158be1;
Error();
}
iVar10 = iVar10 * 0x10 + DAT_00394398;
uVar3 = *(ushort *)(iVar10 + 0xe);
if (uVar3 != 0) {
local_1874 = 0;
local_1880 = (uint)*(ushort *)(iVar10 + 0xc);
local_1870 = local_1880 * 2;
local_188c = (uVar3 + local_1880) * 2;
do {
if (DAT_003943d4 <= (int)(local_1874 + local_1880)) {
*(char **)((int)aiStack_18d0 + iVar6 + 4) = "Cannot load corrupted map.\n";
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158c68;
Error();
}
iVar10 = (uint)*(ushort *)(DAT_003943d0 + local_1870) * 0xf4 + g_pDispCollTrees;
piVar1 = (int *)(local_1884 + *(int *)(iVar10 + 0x10) * 4);
if (local_1888 != *piVar1) {
*piVar1 = local_1888;
*(int *)((int)aiStack_18d0 + iVar6 + 0x10) = iVar10 + 0x14;
*(int *)((int)aiStack_18d0 + iVar6 + 0xc) = iVar10 + 4;
*(Vector **)((int)aiStack_18d0 + iVar6 + 8) = local_1878;
*(Vector **)((int)aiStack_18d0 + iVar6 + 4) = local_1894;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158cc1;
cVar8 = IsBoxIntersectingBox
(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
*(Vector **)((int)aiStack_18d0 + iVar6 + 8),
*(Vector **)((int)aiStack_18d0 + iVar6 + 0xc),
*(Vector **)((int)aiStack_18d0 + iVar6 + 0x10));
if (cVar8 != '\0') {
*(int *)((int)aiStack_18d0 + iVar6 + 4) = iVar10;
*(int **)((int)aiStack_18d0 + iVar6 + 8) = &local_1838;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158cdb;
CDispCollTree::GetVirtualMeshList
(*(CDispCollTree **)((int)aiStack_18d0 + iVar6 + 4),
*(virtualmeshlist_t **)((int)aiStack_18d0 + iVar6 + 8));
local_18a0 = local_18a0 + local_1830;
if (local_18a0 < 0x10000) {
if (local_1834 < 1) goto LAB_00158c28;
if (local_1834 < 3) {
LAB_00158f80:
*(int **)((int)aiStack_18d0 + iVar6 + 4) = &local_1860;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f8e;
EndTrace(*(TraceInfo_t ***)((int)aiStack_18d0 + iVar6 + 4));
uVar12 = local_1890;
iVar10 = *physcollision;
*(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
*(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar12;
pcVar5 = *(code **)(iVar10 + 0x30);
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158fa5;
(*pcVar5)();
}
else {
uVar11 = (uint)local_1820[0];
uVar14 = (uint)local_1820[1];
uVar13 = (uint)local_1820[2];
if ((((int)uVar11 < local_182c) && ((int)uVar14 < local_182c)) &&
((int)uVar13 < local_182c)) {
local_1898 = iVar10;
local_187c = local_1894;
iVar10 = 0;
do {
puVar2 = (undefined4 *)(local_1838 + uVar11 * 0xc);
local_185c = *puVar2;
local_1858 = puVar2[1];
local_1854 = puVar2[2];
puVar2 = (undefined4 *)(local_1838 + uVar14 * 0xc);
local_1850 = *puVar2;
local_184c = puVar2[1];
local_1848 = puVar2[2];
puVar2 = (undefined4 *)(local_1838 + uVar13 * 0xc);
local_1844 = *puVar2;
local_1840 = puVar2[1];
local_183c = puVar2[2];
*(Vector **)((int)aiStack_18d0 + iVar6 + 0xc) = local_1878;
*(Vector **)((int)aiStack_18d0 + iVar6 + 8) = local_187c;
*(undefined4 **)((int)aiStack_18d0 + iVar6 + 4) = &local_185c;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158e7d;
cVar8 = IsPointInBox(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
*(Vector **)((int)aiStack_18d0 + iVar6 + 8),
*(Vector **)((int)aiStack_18d0 + iVar6 + 0xc));
if (cVar8 == '\0') {
*(Vector **)((int)aiStack_18d0 + iVar6 + 0xc) = local_1878;
*(Vector **)((int)aiStack_18d0 + iVar6 + 8) = local_187c;
*(undefined4 **)((int)aiStack_18d0 + iVar6 + 4) = &local_1850;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158ea7;
cVar8 = IsPointInBox(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
*(Vector **)((int)aiStack_18d0 + iVar6 + 8),
*(Vector **)((int)aiStack_18d0 + iVar6 + 0xc));
if (cVar8 != '\0') goto LAB_00158d60;
*(Vector **)((int)aiStack_18d0 + iVar6 + 0xc) = local_1878;
*(Vector **)((int)aiStack_18d0 + iVar6 + 8) = local_187c;
*(undefined4 **)((int)aiStack_18d0 + iVar6 + 4) = &local_1844;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158ed1;
cVar8 = IsPointInBox(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
*(Vector **)((int)aiStack_18d0 + iVar6 + 8),
*(Vector **)((int)aiStack_18d0 + iVar6 + 0xc));
if (cVar8 != '\0') goto LAB_00158d60;
}
else {
LAB_00158d60:
uVar12 = local_1890;
sVar4 = *(short *)(local_1898 + 0x6c);
iVar9 = *physcollision;
*(undefined4 **)((int)aiStack_18d0 + iVar6 + 0x14) = &local_1844;
*(undefined4 **)((int)aiStack_18d0 + iVar6 + 0xc) = &local_185c;
*(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar12;
*(int *)((int)aiStack_18d0 + iVar6 + 0x18) = (int)sVar4;
*(undefined4 **)((int)aiStack_18d0 + iVar6 + 0x10) = &local_1850;
*(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
pcVar5 = *(code **)(iVar9 + 0x34);
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158da3;
(*pcVar5)();
}
iVar9 = iVar10 + 3;
if (local_1834 <= iVar9) goto LAB_00158c28;
if (local_1834 <= iVar10 + 5) goto LAB_00158f80;
uVar11 = (uint)local_1820[iVar9];
uVar14 = (uint)local_1820[iVar10 + 4];
uVar13 = (uint)local_1820[iVar10 + 5];
if (((local_182c <= (int)uVar11) || (local_182c <= (int)uVar14)) ||
(iVar10 = iVar9, local_182c <= (int)uVar13)) break;
} while( true );
}
*(int **)((int)aiStack_18d0 + iVar6 + 4) = &local_1860;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158eee;
EndTrace(*(TraceInfo_t ***)((int)aiStack_18d0 + iVar6 + 4));
uVar12 = local_1890;
iVar10 = *physcollision;
*(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
*(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar12;
pcVar5 = *(code **)(iVar10 + 0x30);
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f05;
(*pcVar5)();
}
}
else {
*(int **)((int)aiStack_18d0 + iVar6 + 4) = &local_1860;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158fb8;
EndTrace(*(TraceInfo_t ***)((int)aiStack_18d0 + iVar6 + 4));
}
uVar12 = 0;
goto LAB_00158f07;
}
}
LAB_00158c28:
local_1870 = local_1870 + 2;
local_1874 = local_1874 + 1;
} while (local_1870 != local_188c);
}
local_18a4 = local_18a4 + 1;
} while (local_18a4 != local_18a8);
}
*(int **)((int)aiStack_18d0 + iVar6 + 4) = &local_1860;
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f47;
EndTrace(*(TraceInfo_t ***)((int)aiStack_18d0 + iVar6 + 4));
uVar7 = local_1890;
iVar10 = *physcollision;
*(undefined4 *)((int)aiStack_18d0 + iVar6 + 0xc) = 0;
*(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar7;
*(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
pcVar5 = *(code **)(iVar10 + 0x38);
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f66;
uVar12 = (*pcVar5)();
iVar10 = *physcollision;
*(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar7;
*(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
pcVar5 = *(code **)(iVar10 + 0x30);
*(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f7a;
(*pcVar5)();
LAB_00158f07:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined **)((int)aiStack_18d0 + iVar6) = &UNK_00158fc2;
__stack_chk_fail();
}
return uVar12;
}
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.