CEngineTrace::ClipRayToBBox
0x0015a560 · 1355 bytes · __thiscall
_ZN12CEngineTrace13ClipRayToBBoxERK5Ray_tjP12ICollideableP10CGameTrace
Decompiled
undefined (5 params)
/* CEngineTrace::ClipRayToBBox(Ray_t const&, unsigned int, ICollideable*, CGameTrace*) */
undefined4 __thiscall
CEngineTrace::ClipRayToBBox
(CEngineTrace *this,Ray_t *param_1,uint param_2,ICollideable *param_3,CGameTrace *param_4)
{
float fVar1;
matrix3x4_t *pmVar2;
int iVar3;
float *pfVar4;
float *pfVar5;
float fVar6;
float fVar7;
float fVar8;
float local_b4;
float local_b0;
float local_ac;
float local_a8;
undefined4 local_a4;
undefined4 local_a0;
float local_9c;
float local_98;
float local_94;
float local_8c;
float local_88;
float local_84;
float local_7c;
float local_78;
float local_74;
float local_6c;
float local_68;
float local_64;
float local_5c;
float local_58;
float local_54;
undefined4 local_4c;
undefined4 local_48;
undefined4 local_44;
undefined4 local_3c;
undefined4 local_38;
undefined4 local_34;
Ray_t local_28;
Ray_t local_27;
iVar3 = (**(code **)(*(int *)param_3 + 0x2c))(param_3);
if (iVar3 != 2) {
return 0;
}
if ((param_1[0x44] != (Ray_t)0x0) || (*(matrix3x4_t **)(param_1 + 0x40) == (matrix3x4_t *)0x0)) {
if (*(float *)(param_1 + 0x10) == 0.0) {
local_78 = *(float *)(param_1 + 0x14);
local_6c = 3.4028235e+38;
local_7c = local_6c;
}
else {
local_7c = 1.0 / *(float *)(param_1 + 0x10);
local_78 = *(float *)(param_1 + 0x14);
}
if (local_78 == 0.0) {
local_64 = *(float *)(param_1 + 0x18);
local_68 = 3.4028235e+38;
local_78 = local_68;
}
else {
local_78 = 1.0 / local_78;
local_64 = *(float *)(param_1 + 0x18);
}
if (local_64 == 0.0) {
local_64 = 3.4028235e+38;
}
else {
local_64 = 1.0 / local_64;
}
local_74 = local_64;
local_6c = local_7c;
local_68 = local_78;
pfVar4 = (float *)(**(code **)(*(int *)param_3 + 4))(param_3);
pfVar5 = (float *)(**(code **)(*(int *)param_3 + 0x20))(param_3);
local_9c = *pfVar4 + *pfVar5;
local_98 = pfVar4[1] + pfVar5[1];
local_94 = pfVar4[2] + pfVar5[2];
pfVar4 = (float *)(**(code **)(*(int *)param_3 + 8))(param_3);
pfVar5 = (float *)(**(code **)(*(int *)param_3 + 0x20))(param_3);
local_8c = *pfVar4 + *pfVar5;
local_88 = pfVar4[1] + pfVar5[1];
local_84 = pfVar4[2] + pfVar5[2];
IntersectRayWithBox(param_1,(VectorAligned *)&local_7c,(VectorAligned *)&local_9c,
(VectorAligned *)&local_8c,param_4);
return 1;
}
local_3c = *(undefined4 *)(param_1 + 0x30);
local_34 = *(undefined4 *)(param_1 + 0x38);
local_38 = *(undefined4 *)(param_1 + 0x34);
VectorIRotate((float *)(param_1 + 0x10),*(matrix3x4_t **)(param_1 + 0x40),&local_5c);
local_4c = 0;
local_48 = 0;
local_44 = 0;
VectorITransform((float *)param_1,*(matrix3x4_t **)(param_1 + 0x40),&local_6c);
if (local_5c == 0.0) {
local_7c = 3.4028235e+38;
}
else {
local_7c = 1.0 / local_5c;
}
local_78 = 3.4028235e+38;
if (local_58 != 0.0) {
local_78 = 1.0 / local_58;
}
if (local_54 == 0.0) {
local_74 = 3.4028235e+38;
}
else {
local_74 = 1.0 / local_54;
}
pmVar2 = *(matrix3x4_t **)(param_1 + 0x40);
pfVar4 = (float *)(**(code **)(*(int *)param_3 + 0x20))(param_3);
VectorITransform(pfVar4,pmVar2,&local_b4);
local_28 = param_1[0x44];
local_27 = param_1[0x45];
pfVar4 = (float *)(**(code **)(*(int *)param_3 + 4))(param_3);
local_9c = *pfVar4 + local_b4;
local_98 = pfVar4[1] + local_b0;
local_94 = pfVar4[2] + local_ac;
pfVar4 = (float *)(**(code **)(*(int *)param_3 + 8))(param_3);
local_8c = *pfVar4 + local_b4;
local_88 = pfVar4[1] + local_b0;
local_84 = pfVar4[2] + local_ac;
IntersectRayWithBox((Ray_t *)&local_6c,(VectorAligned *)&local_7c,(VectorAligned *)&local_9c,
(VectorAligned *)&local_8c,param_4);
if (((1.0 < *(float *)(param_4 + 0x2c) || *(float *)(param_4 + 0x2c) == 1.0) &&
(param_4[0x36] == (CGameTrace)0x0)) && (param_4[0x37] == (CGameTrace)0x0)) {
*(float *)param_4 = *(float *)(param_1 + 0x20) + *(float *)param_1;
*(float *)(param_4 + 4) = *(float *)(param_1 + 0x24) + *(float *)(param_1 + 4);
*(float *)(param_4 + 8) = *(float *)(param_1 + 0x28) + *(float *)(param_1 + 8);
return 1;
}
local_a8 = *(float *)(param_4 + 0x18);
local_a4 = *(undefined4 *)(param_4 + 0x1c);
local_a0 = *(undefined4 *)(param_4 + 0x20);
VectorRotate(&local_a8,*(matrix3x4_t **)(param_1 + 0x40),(float *)(param_4 + 0x18));
fVar1 = *(float *)(param_4 + 0x2c);
fVar6 = *(float *)(param_1 + 0x20) + *(float *)param_1;
*(float *)param_4 = fVar6;
fVar7 = *(float *)(param_1 + 0x24) + *(float *)(param_1 + 4);
*(float *)(param_4 + 4) = fVar7;
fVar8 = *(float *)(param_1 + 0x28) + *(float *)(param_1 + 8);
*(float *)(param_4 + 8) = fVar8;
if (fVar1 == 1.0) {
fVar6 = *(float *)(param_1 + 0x10) + fVar6;
*(float *)(param_4 + 0xc) = fVar6;
fVar7 = fVar7 + *(float *)(param_1 + 0x14);
*(float *)(param_4 + 0x10) = fVar7;
fVar8 = fVar8 + *(float *)(param_1 + 0x18);
*(float *)(param_4 + 0x14) = fVar8;
}
else {
fVar6 = *(float *)(param_1 + 0x10) * fVar1 + fVar6;
*(float *)(param_4 + 0xc) = fVar6;
fVar7 = *(float *)(param_1 + 0x14) * fVar1 + fVar7;
*(float *)(param_4 + 0x10) = fVar7;
fVar8 = fVar1 * *(float *)(param_1 + 0x18) + fVar8;
*(float *)(param_4 + 0x14) = fVar8;
}
fVar1 = *(float *)(param_4 + 0x38);
*(float *)(param_4 + 0x24) =
fVar7 * *(float *)(param_4 + 0x1c) + fVar6 * *(float *)(param_4 + 0x18) +
fVar8 * *(float *)(param_4 + 0x20);
if (1.0 <= fVar1) {
return 1;
}
fVar6 = *(float *)(param_1 + 0x18);
fVar7 = *(float *)(param_1 + 0x10);
*(float *)(param_4 + 4) = *(float *)(param_1 + 0x14) * fVar1 + *(float *)(param_4 + 4);
*(float *)(param_4 + 8) = fVar6 * fVar1 + *(float *)(param_4 + 8);
*(float *)param_4 = fVar1 * fVar7 + *(float *)param_4;
return 1;
}
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.