CM_ClipBoxToBrush<true>
0x0011ee80 · 865 bytes · __cdecl
_Z17CM_ClipBoxToBrushILb1EEvP11TraceInfo_tPK8cbrush_t
Decompiled
void (2 params)
/* void CM_ClipBoxToBrush<true>(TraceInfo_t*, cbrush_t const*) */
void CM_ClipBoxToBrush<true>(TraceInfo_t *param_1,cbrush_t *param_2)
{
undefined4 *puVar1;
ushort uVar2;
ushort uVar3;
undefined4 uVar4;
int iVar5;
float *pfVar6;
cbrush_t *pcVar7;
undefined *puVar8;
bool bVar9;
bool bVar10;
undefined4 *puVar11;
undefined **ppuVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
undefined4 *local_24;
float local_20;
uVar2 = *(ushort *)(param_2 + 4);
if (uVar2 == 0xffff) {
pcVar7 = *(cbrush_t **)(param_1 + 0x104);
uVar2 = *(ushort *)(param_2 + 6);
if (*(int *)(pcVar7 + 0x78) <= (int)(uint)uVar2) {
Error("Cannot load corrupted map.\n");
}
IntersectRayWithBoxBrush
((TraceInfo_t *)((uint)uVar2 * 0x30 + *(int *)(pcVar7 + 0x74)),pcVar7,
(cboxbrush_t *)param_1);
return;
}
if (uVar2 == 0) {
return;
}
uVar4 = *(undefined4 *)param_2;
uVar3 = *(ushort *)(param_2 + 6);
iVar5 = *(int *)(param_1 + 0x104);
if (*(int *)(iVar5 + 0x6c) <= (int)(uint)uVar3) {
Error("Cannot load corrupted map.\n");
uVar2 = *(ushort *)(param_2 + 4);
}
puVar11 = (undefined4 *)(*(int *)(iVar5 + 0x68) + (uint)uVar3 * 8);
puVar1 = puVar11 + (uint)uVar2 * 2;
if (puVar11 < puVar1) {
bVar10 = false;
bVar9 = false;
local_24 = (undefined4 *)0x0;
fVar16 = 1.0;
local_20 = -99999.0;
do {
while( true ) {
pfVar6 = (float *)*puVar11;
if (*(short *)((int)puVar11 + 6) == 0) break;
LAB_0011ef20:
puVar11 = puVar11 + 2;
if (puVar1 <= puVar11) goto LAB_0011efdb;
}
fVar13 = (*(float *)param_1 * *pfVar6 - pfVar6[3]) + *(float *)(param_1 + 4) * pfVar6[1] +
*(float *)(param_1 + 8) * pfVar6[2];
fVar15 = (pfVar6[1] * *(float *)(param_1 + 0x10) + *pfVar6 * *(float *)(param_1 + 0xc) +
pfVar6[2] * *(float *)(param_1 + 0x14)) - pfVar6[3];
if (fVar13 <= 0.0) {
if (fVar15 <= 0.0) goto LAB_0011ef20;
bVar10 = true;
}
else {
if (0.0 < fVar15) {
return;
}
bVar9 = true;
}
if (fVar15 < fVar13) {
fVar14 = fVar13 - 0.03125;
if (fVar14 <= 0.0) {
fVar14 = 0.0;
}
fVar14 = fVar14 / (fVar13 - fVar15);
if (local_20 < fVar14) {
local_24 = puVar11;
local_20 = fVar14;
}
goto LAB_0011ef20;
}
puVar11 = puVar11 + 2;
fVar13 = (fVar13 + 0.03125) / (fVar13 - fVar15);
if (fVar13 <= fVar16) {
fVar16 = fVar13;
}
} while (puVar11 < puVar1);
LAB_0011efdb:
if ((bVar9) && (*(float *)(param_1 + 0x8c) - local_20 <= 0.0)) {
if (fVar16 <= local_20) {
return;
}
if (local_20 <= -99999.0) {
return;
}
if (*(float *)(param_1 + 0x80) <= local_20) {
return;
}
fVar16 = 0.0;
if (0.0 <= local_20) {
fVar16 = local_20;
}
*(undefined4 *)(param_1 + 0x114) = 0;
iVar5 = *(int *)(param_1 + 0x104);
*(float *)(param_1 + 0x80) = fVar16;
puVar11 = (undefined4 *)*local_24;
*(undefined4 *)(param_1 + 0x6c) = *puVar11;
*(undefined4 *)(param_1 + 0x70) = puVar11[1];
*(undefined4 *)(param_1 + 0x74) = puVar11[2];
*(undefined4 *)(param_1 + 0x78) = puVar11[3];
param_1[0x7c] = *(TraceInfo_t *)(puVar11 + 4);
param_1[0x7d] = *(TraceInfo_t *)((int)puVar11 + 0x11);
*(undefined2 *)(param_1 + 0x7e) = *(undefined2 *)((int)puVar11 + 0x12);
ppuVar12 = &CCollisionBSPData::nullsurface;
uVar2 = *(ushort *)(local_24 + 1);
if (uVar2 != 0xffff) {
if (*(int *)(iVar5 + 0x250) <= (int)(uint)uVar2) {
Error("Cannot load corrupted map.\n");
}
ppuVar12 = (undefined **)(*(int *)(iVar5 + 0x24c) + (uint)uVar2 * 8);
}
puVar8 = *ppuVar12;
*(undefined **)(param_1 + 0x94) = ppuVar12[1];
*(undefined **)(param_1 + 0x90) = puVar8;
*(undefined4 *)(param_1 + 0x84) = uVar4;
return;
}
param_1[0x8b] = (TraceInfo_t)0x1;
*(undefined4 *)(param_1 + 0x84) = uVar4;
if (bVar10) {
if (fVar16 == 1.0) {
return;
}
if (fVar16 < *(float *)(param_1 + 0x8c) || fVar16 == *(float *)(param_1 + 0x8c)) {
return;
}
*(float *)(param_1 + 0x8c) = fVar16;
if (fVar16 < *(float *)(param_1 + 0x80)) {
return;
}
*(undefined4 *)(param_1 + 0x80) = 0x3f800000;
uVar4 = DAT_00340c94;
*(undefined **)(param_1 + 0x90) = CCollisionBSPData::nullsurface;
*(undefined4 *)(param_1 + 0x94) = uVar4;
return;
}
}
else {
param_1[0x8b] = (TraceInfo_t)0x1;
*(undefined4 *)(param_1 + 0x84) = uVar4;
}
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.