IsRayIntersectingOBB
0x0058d360 · 2000 bytes · __cdecl
_Z20IsRayIntersectingOBBRK5Ray_tRK6VectorRK6QAngleS4_S4_
Decompiled
undefined (5 params)
/* IsRayIntersectingOBB(Ray_t const&, Vector const&, QAngle const&, Vector const&, Vector const&) */
uint IsRayIntersectingOBB
(Ray_t *param_1,Vector *param_2,QAngle *param_3,Vector *param_4,Vector *param_5)
{
float fVar1;
float fVar2;
float fVar3;
char cVar4;
uint uVar5;
float fVar6;
float fVar7;
float fVar8;
float fVar9;
float fVar10;
float fVar11;
float fVar12;
matrix3x4_t *pmVar13;
float local_ec;
float local_e8;
float local_e4;
float local_e0;
float local_dc;
float local_d8;
float local_d4;
float local_d0;
float local_cc;
float local_c8;
float local_c4;
float local_c0;
float local_bc;
float local_b8;
float local_b4;
undefined1 local_b0 [20];
float local_9c;
float local_98;
float local_94;
float local_6c;
float local_68;
float local_64;
float local_60;
float local_5c;
float local_58;
float local_54;
float local_50;
float local_4c;
float local_48;
float local_44;
float local_40;
undefined4 local_3c;
undefined4 local_38;
undefined4 local_34;
Ray_t local_28;
Ray_t local_27;
if (((vec3_angle == *(float *)param_3) && (DAT_01053d40 == *(float *)(param_3 + 4))) &&
(DAT_01053d44 == *(float *)(param_3 + 8))) {
local_9c = *(float *)param_4 + *(float *)param_2;
local_98 = *(float *)(param_4 + 4) + *(float *)(param_2 + 4);
local_94 = *(float *)(param_4 + 8) + *(float *)(param_2 + 8);
local_6c = *(float *)param_2 + *(float *)param_5;
local_68 = *(float *)(param_2 + 4) + *(float *)(param_5 + 4);
local_64 = *(float *)(param_2 + 8) + *(float *)(param_5 + 8);
uVar5 = IsBoxIntersectingRay((Vector *)&local_9c,(Vector *)&local_6c,param_1,0.0);
return uVar5;
}
if (param_1[0x44] != (Ray_t)0x0) {
AngleIMatrix(param_3,param_2,(matrix3x4_t *)&local_9c);
VectorTransform((float *)param_1,(matrix3x4_t *)&local_9c,&local_6c);
VectorRotate((float *)(param_1 + 0x10),(matrix3x4_t *)&local_9c,&local_5c);
local_28 = param_1[0x44];
local_44 = (float)DAT_01053d50;
local_27 = param_1[0x45];
local_4c = (float)vec3_origin;
local_48 = (float)DAT_01053d4c;
local_3c = vec3_origin;
local_38 = DAT_01053d4c;
local_34 = DAT_01053d50;
uVar5 = IsBoxIntersectingRay(param_4,param_5,(Ray_t *)&local_6c,0.0);
return uVar5;
}
if (param_1[0x45] != (Ray_t)0x0) {
ComputeCenterMatrix(param_2,param_3,param_4,param_5,(matrix3x4_t *)&local_6c);
local_e8 = -(*(float *)(param_1 + 0x14) * 0.5 + *(float *)(param_1 + 4));
local_e4 = -(*(float *)(param_1 + 0x18) * 0.5 + *(float *)(param_1 + 8));
local_ec = -(*(float *)(param_1 + 0x10) * 0.5 + *(float *)param_1);
SetIdentityMatrix((matrix3x4_t *)&local_9c);
pmVar13 = (matrix3x4_t *)&local_9c;
MatrixSetColumn((Vector *)&local_ec,3,(matrix3x4_t *)&local_9c);
local_e0 = ABS(*(float *)(param_1 + 0x10)) * 0.5 + *(float *)(param_1 + 0x30);
local_d0 = (*(float *)(param_5 + 4) - *(float *)(param_4 + 4)) * 0.5;
local_dc = ABS(*(float *)(param_1 + 0x14)) * 0.5 + *(float *)(param_1 + 0x34);
local_d8 = ABS(*(float *)(param_1 + 0x18)) * 0.5 + *(float *)(param_1 + 0x38);
local_cc = (*(float *)(param_5 + 8) - *(float *)(param_4 + 8)) * 0.5;
local_d4 = (*(float *)param_5 - *(float *)param_4) * 0.5;
cVar4 = ComputeSeparatingPlane
((matrix3x4_t *)&local_9c,(matrix3x4_t *)&local_6c,(Vector *)&local_e0,
(Vector *)&local_d4,(float)local_b0,(cplane_t *)pmVar13);
uVar5 = 0;
if (cVar4 == '\0') {
local_c8 = *(float *)(param_1 + 0x10);
local_c4 = *(float *)(param_1 + 0x14);
local_c0 = *(float *)(param_1 + 0x18);
VectorNormalize((Vector *)&local_c8);
fVar9 = local_60 - *(float *)param_1;
fVar10 = local_50 - *(float *)(param_1 + 4);
fVar12 = local_40 - *(float *)(param_1 + 8);
VectorIRotate(&local_c8,(matrix3x4_t *)&local_6c,&local_bc);
fVar7 = local_c4 * local_4c - local_c0 * local_5c;
fVar6 = local_5c * local_c8 - local_6c * local_c4;
fVar1 = *(float *)(param_1 + 0x30);
fVar8 = local_c0 * local_6c - local_4c * local_c8;
fVar2 = *(float *)(param_1 + 0x34);
fVar3 = *(float *)(param_1 + 0x38);
if (((uint)ABS(fVar8 * fVar10 + fVar7 * fVar9 + fVar6 * fVar12) <=
(uint)(ABS(local_b8) * local_cc + local_d0 * ABS(local_b4) + ABS(fVar1 * fVar7) +
ABS(fVar2 * fVar8) + ABS(fVar3 * fVar6))) &&
(fVar8 = local_c4 * local_48 - local_c0 * local_58,
fVar6 = local_c0 * local_68 - local_48 * local_c8,
fVar7 = local_58 * local_c8 - local_68 * local_c4,
(uint)ABS(fVar6 * fVar10 + fVar8 * fVar9 + fVar7 * fVar12) <=
(uint)(local_cc * ABS(local_bc) + ABS(local_b4) * local_d4 + ABS(fVar1 * fVar8) +
ABS(fVar2 * fVar6) + ABS(fVar3 * fVar7)))) {
fVar11 = local_c4 * local_44 - local_c0 * local_54;
fVar7 = local_c0 * local_64 - local_44 * local_c8;
fVar8 = local_c8 * local_54 - local_c4 * local_64;
fVar6 = ABS(fVar7 * fVar10 + fVar9 * fVar11 + fVar8 * fVar12);
uVar5 = CONCAT31((int3)((uint)fVar6 >> 8),
(uint)fVar6 <=
(uint)(ABS(local_bc) * local_d0 + ABS(local_b8) * local_d4 +
ABS(fVar1 * fVar11) + ABS(fVar2 * fVar7) + ABS(fVar3 * fVar8)));
}
}
return uVar5;
}
local_94 = (float)(*(uint *)(param_1 + 0x38) ^ 0x80000000);
local_98 = (float)(*(uint *)(param_1 + 0x34) ^ 0x80000000);
local_9c = (float)(*(uint *)(param_1 + 0x30) ^ 0x80000000);
uVar5 = ComputeSeparatingPlane
((Vector *)param_1,(QAngle *)&vec3_angle,(Vector *)&local_9c,
(Vector *)(param_1 + 0x30),param_2,param_3,param_4,param_5,0.0,
(cplane_t *)&local_6c);
return uVar5 ^ 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.