CM_ClipBoxToBrush<false>
0x0011f9e0 · 1023 bytes · __cdecl
_Z17CM_ClipBoxToBrushILb0EEvP11TraceInfo_tPK8cbrush_t
Decompiled
void (2 params)
/* void CM_ClipBoxToBrush<false>(TraceInfo_t*, cbrush_t const*) */
void CM_ClipBoxToBrush<false>(TraceInfo_t *param_1,cbrush_t *param_2)
{
undefined4 *puVar1;
float fVar2;
float fVar3;
ushort uVar4;
ushort uVar5;
undefined4 uVar6;
int iVar7;
float *pfVar8;
undefined *puVar9;
cbrush_t *pcVar10;
bool bVar11;
bool bVar12;
undefined **ppuVar13;
undefined4 *puVar14;
float fVar15;
float fVar16;
float fVar17;
float fVar18;
undefined4 *local_48;
float local_44;
uVar4 = *(ushort *)(param_2 + 4);
if (uVar4 == 0xffff) {
pcVar10 = *(cbrush_t **)(param_1 + 0x104);
uVar4 = *(ushort *)(param_2 + 6);
if (*(int *)(pcVar10 + 0x78) <= (int)(uint)uVar4) {
Error("Cannot load corrupted map.\n");
}
IntersectRayWithBoxBrush
((TraceInfo_t *)((uint)uVar4 * 0x30 + *(int *)(pcVar10 + 0x74)),pcVar10,
(cboxbrush_t *)param_1);
return;
}
if (uVar4 == 0) {
return;
}
uVar6 = *(undefined4 *)param_2;
iVar7 = *(int *)(param_1 + 0x104);
uVar5 = *(ushort *)(param_2 + 6);
if (*(int *)(iVar7 + 0x6c) <= (int)(uint)uVar5) {
Error("Cannot load corrupted map.\n");
uVar4 = *(ushort *)(param_2 + 4);
}
puVar14 = (undefined4 *)(*(int *)(iVar7 + 0x68) + (uint)uVar5 * 8);
puVar1 = puVar14 + (uint)uVar4 * 2;
if (puVar14 < puVar1) {
local_48 = (undefined4 *)0x0;
bVar11 = false;
bVar12 = false;
local_44 = -99999.0;
fVar18 = 1.0;
do {
while( true ) {
pfVar8 = (float *)*puVar14;
fVar16 = *pfVar8;
fVar2 = pfVar8[1];
fVar3 = pfVar8[2];
fVar17 = ABS(*(float *)(param_1 + 0x30) * fVar16) + ABS(*(float *)(param_1 + 0x34) * fVar2)
+ pfVar8[3] + ABS(*(float *)(param_1 + 0x38) * fVar3);
fVar15 = (*(float *)(param_1 + 4) * fVar2 + *(float *)param_1 * fVar16 +
*(float *)(param_1 + 8) * fVar3) - fVar17;
fVar17 = (fVar2 * *(float *)(param_1 + 0x10) + fVar16 * *(float *)(param_1 + 0xc) +
fVar3 * *(float *)(param_1 + 0x14)) - fVar17;
if (0.0 < fVar15) break;
if (0.0 < fVar17) {
bVar12 = true;
goto LAB_0011fb9a;
}
LAB_0011fad5:
puVar14 = puVar14 + 2;
if (puVar1 <= puVar14) goto LAB_0011fbd6;
}
if (0.0 < fVar17) {
return;
}
bVar11 = true;
LAB_0011fb9a:
if (fVar17 < fVar15) {
fVar16 = fVar15 - 0.03125;
if (fVar16 <= 0.0) {
fVar16 = 0.0;
}
fVar16 = fVar16 / (fVar15 - fVar17);
if (local_44 < fVar16) {
local_48 = puVar14;
local_44 = fVar16;
}
goto LAB_0011fad5;
}
puVar14 = puVar14 + 2;
fVar16 = (fVar15 + 0.03125) / (fVar15 - fVar17);
if (fVar16 <= fVar18) {
fVar18 = fVar16;
}
} while (puVar14 < puVar1);
LAB_0011fbd6:
if (bVar11) {
if (fVar18 <= local_44) {
return;
}
if (local_44 <= -99999.0) {
return;
}
if (*(float *)(param_1 + 0x80) <= local_44) {
return;
}
fVar18 = 0.0;
if (0.0 <= local_44) {
fVar18 = local_44;
}
*(undefined4 *)(param_1 + 0x114) = 0;
iVar7 = *(int *)(param_1 + 0x104);
*(float *)(param_1 + 0x80) = fVar18;
puVar14 = (undefined4 *)*local_48;
*(undefined4 *)(param_1 + 0x6c) = *puVar14;
*(undefined4 *)(param_1 + 0x70) = puVar14[1];
*(undefined4 *)(param_1 + 0x74) = puVar14[2];
*(undefined4 *)(param_1 + 0x78) = puVar14[3];
param_1[0x7c] = *(TraceInfo_t *)(puVar14 + 4);
param_1[0x7d] = *(TraceInfo_t *)((int)puVar14 + 0x11);
*(undefined2 *)(param_1 + 0x7e) = *(undefined2 *)((int)puVar14 + 0x12);
ppuVar13 = &CCollisionBSPData::nullsurface;
uVar4 = *(ushort *)(local_48 + 1);
if (uVar4 != 0xffff) {
if (*(int *)(iVar7 + 0x250) <= (int)(uint)uVar4) {
Error("Cannot load corrupted map.\n");
}
ppuVar13 = (undefined **)(*(int *)(iVar7 + 0x24c) + (uint)uVar4 * 8);
}
puVar9 = *ppuVar13;
*(undefined **)(param_1 + 0x94) = ppuVar13[1];
*(undefined **)(param_1 + 0x90) = puVar9;
*(undefined4 *)(param_1 + 0x84) = uVar6;
return;
}
param_1[0x8b] = (TraceInfo_t)0x1;
*(undefined4 *)(param_1 + 0x84) = uVar6;
if (bVar12) {
if (fVar18 == 1.0) {
return;
}
if (fVar18 < *(float *)(param_1 + 0x8c) || fVar18 == *(float *)(param_1 + 0x8c)) {
return;
}
*(float *)(param_1 + 0x8c) = fVar18;
if (fVar18 < *(float *)(param_1 + 0x80)) {
return;
}
*(undefined4 *)(param_1 + 0x80) = 0x3f800000;
uVar6 = DAT_00340c94;
*(undefined **)(param_1 + 0x90) = CCollisionBSPData::nullsurface;
*(undefined4 *)(param_1 + 0x94) = uVar6;
return;
}
}
else {
param_1[0x8b] = (TraceInfo_t)0x1;
*(undefined4 *)(param_1 + 0x84) = uVar6;
}
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.