CM_UnsweptBoxTrace
0x00119ce0 · 862 bytes · __regparm3
_ZL18CM_UnsweptBoxTraceP11TraceInfo_tRK5Ray_tii.isra.21
Decompiled
undefined (4 params)
/* CM_UnsweptBoxTrace(TraceInfo_t*, Ray_t const&, int, int) [clone .isra.21] */
void __regparm3 CM_UnsweptBoxTrace(TraceInfo_t *param_1,Ray_t *param_2,int param_3,int param_4)
{
int *piVar1;
cbrush_t *pcVar2;
ushort uVar3;
ushort uVar4;
int iVar5;
int iVar6;
int iVar7;
bool bVar8;
int iVar9;
int iVar10;
int iVar11;
int iVar12;
uint uVar13;
int iVar14;
int local_1050;
float local_1038;
float local_1034;
float local_1030;
undefined4 local_102c;
undefined4 local_1028;
int *local_1024;
undefined4 local_1020;
int local_101c [1027];
local_1024 = local_101c;
local_102c = 0xffffffff;
local_1028 = 0x400;
local_1020 = *(undefined4 *)(param_1 + 0x104);
local_1038 = *(float *)(param_2 + 0x30) + 1.0;
local_1034 = *(float *)(param_2 + 0x34) + 1.0;
local_1030 = *(float *)(param_2 + 0x38) + 1.0;
iVar9 = CM_BoxLeafnums((leafnums_t *)&local_102c,(Vector *)param_2,(Vector *)&local_1038,param_3);
bVar8 = false;
local_1050 = 0;
if (0 < iVar9) {
do {
iVar5 = local_101c[local_1050];
iVar6 = *(int *)(param_1 + 0x104);
if ((iVar5 < 0) || (iVar11 = iVar6, iVar14 = iVar5, *(int *)(iVar6 + 0x9c) <= iVar5)) {
Error("Cannot load corrupted map.\n");
iVar11 = *(int *)(param_1 + 0x104);
iVar14 = local_101c[local_1050];
}
if ((*(byte *)(iVar5 * 0x10 + *(int *)(iVar6 + 0x98)) & 1) == 0) {
bVar8 = true;
}
if ((iVar14 < 0) || (*(int *)(iVar11 + 0x9c) <= iVar14)) {
Error("Cannot load corrupted map.\n");
}
iVar5 = *(int *)(param_1 + *(int *)(param_1 + 0x11c) * 4 + 0x120);
iVar11 = *(int *)(iVar11 + 0x98) + iVar14 * 0x10;
iVar6 = *(int *)(param_1 + *(int *)(param_1 + 0x11c) * 0x14 + 0x128);
iVar14 = 0;
if (*(short *)(iVar11 + 10) != 0) {
do {
iVar7 = *(int *)(param_1 + 0x104);
iVar12 = (uint)*(ushort *)(iVar11 + 8) + iVar14;
iVar10 = iVar7;
if (*(int *)(iVar7 + 0xb0) <= iVar12) {
Error("Cannot load corrupted map.\n");
iVar10 = *(int *)(param_1 + 0x104);
}
uVar13 = (uint)*(ushort *)(*(int *)(iVar7 + 0xac) + iVar12 * 2);
if (*(int *)(iVar10 + 200) <= (int)uVar13) {
Error("Cannot load corrupted map.\n");
}
piVar1 = (int *)(iVar6 + uVar13 * 4);
if (iVar5 != *piVar1) {
pcVar2 = (cbrush_t *)(*(int *)(iVar10 + 0xc4) + uVar13 * 8);
*piVar1 = iVar5;
if (((*(uint *)pcVar2 & *(uint *)(param_1 + 0xfc)) != 0) &&
(CM_TestBoxInBrush(param_1,pcVar2), *(float *)(param_1 + 0x80) == 0.0))
goto LAB_00119f38;
}
iVar14 = iVar14 + 1;
} while (iVar14 < (int)(uint)*(ushort *)(iVar11 + 10));
}
if ((param_1[0x8b] == (TraceInfo_t)0x0) && (uVar3 = *(ushort *)(iVar11 + 0xe), uVar3 != 0)) {
iVar5 = *(int *)(param_1 + 0x104);
uVar4 = *(ushort *)(iVar11 + 0xc);
if (*(int *)(iVar5 + 0xd4) <= (int)(uint)uVar4) {
Error("Cannot load corrupted map.\n");
uVar3 = *(ushort *)(iVar11 + 0xe);
}
CM_TestInDispTree(param_1,(ushort *)(*(int *)(iVar5 + 0xd0) + (uint)uVar4 * 2),(uint)uVar3,
(Vector *)param_1,(Vector *)(param_1 + 0x18),(Vector *)(param_1 + 0x24),
*(int *)(param_1 + 0xfc),(CGameTrace *)(param_1 + 0x54));
}
LAB_00119f38:
} while ((param_1[0x8a] == (TraceInfo_t)0x0) &&
(local_1050 = local_1050 + 1, local_1050 != iVar9));
if (bVar8) {
return;
}
}
param_1[0x8b] = (TraceInfo_t)0x1;
param_1[0x8a] = (TraceInfo_t)0x1;
*(undefined4 *)(param_1 + 0x80) = 0;
*(undefined4 *)(param_1 + 0x8c) = 0x3f800000;
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.