TraceToStudio
0x00b94a40 · 1541 bytes · __cdecl
_Z13TraceToStudioP20IPhysicsSurfacePropsRK5Ray_tP10CStudioHdrP18mstudiohitboxset_tPP11matrix3x4_tiRK6VectorfR10CGameTrace
Decompiled
undefined (9 params)
/* TraceToStudio(IPhysicsSurfaceProps*, Ray_t const&, CStudioHdr*, mstudiohitboxset_t*,
matrix3x4_t**, int, Vector const&, float, CGameTrace&) */
Ray_t TraceToStudio(IPhysicsSurfaceProps *param_1,Ray_t *param_2,CStudioHdr *param_3,
mstudiohitboxset_t *param_4,matrix3x4_t **param_5,int param_6,Vector *param_7,
float param_8,CGameTrace *param_9)
{
mstudiobbox_t *pmVar1;
undefined4 uVar2;
matrix3x4_t *pmVar3;
int iVar4;
Ray_t RVar5;
int iVar6;
int iVar7;
float fVar8;
float fVar9;
float fVar10;
float fVar11;
float fVar12;
float fVar13;
int local_c8;
int local_c4;
float local_b4;
float local_b0;
float local_ac;
float local_a8;
float local_a4;
float 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;
undefined4 local_2c;
undefined1 local_28;
undefined1 local_27;
RVar5 = param_2[0x44];
if (RVar5 == (Ray_t)0x0) {
RVar5 = (Ray_t)SweepBoxToStudio(param_1,param_2,param_3,param_4,param_5,param_6,param_9);
return RVar5;
}
param_9[0x37] = (CGameTrace)0x0;
*(undefined4 *)(param_9 + 0x2c) = 0x3f800000;
if ((param_3[100] == (CStudioHdr)0x0) && (param_8 == 1.0)) {
if ((param_6 & *(uint *)(*(int *)param_3 + 0x14c)) == 0) {
return (Ray_t)0x0;
}
if (*(int *)(param_4 + 4) < 1) {
return (Ray_t)0x0;
}
iVar6 = 0;
local_c4 = -1;
iVar7 = -1;
do {
local_c8 = ClipRayToHitbox(param_2,(mstudiobbox_t *)
(param_4 + iVar6 * 0x44 + *(int *)(param_4 + 8)),
param_5[*(int *)(param_4 + iVar6 * 0x44 + *(int *)(param_4 + 8))],
param_9 + 0x2c);
iVar4 = iVar6;
if (local_c8 < 0) {
local_c8 = iVar7;
iVar4 = local_c4;
}
local_c4 = iVar4;
iVar6 = iVar6 + 1;
iVar7 = local_c8;
} while (iVar6 < *(int *)(param_4 + 4));
}
else {
if (*(int *)(param_4 + 4) < 1) {
return (Ray_t)0x0;
}
fVar8 = 1.0 / param_8;
iVar7 = 0;
local_c8 = -1;
local_c4 = -1;
do {
pmVar1 = (mstudiobbox_t *)(param_4 + iVar7 * 0x44 + *(int *)(param_4 + 8));
if ((param_6 &
*(uint *)(*(int *)param_3 + 0xb4 +
*(int *)pmVar1 * 0xd8 + *(int *)(*(int *)param_3 + 0xa0))) != 0) {
if ((1.0000001 < param_8) || (param_8 < 0.9999999)) {
MatrixCopy(param_5[*(int *)pmVar1],(matrix3x4_t *)&local_9c);
MatrixGetColumn((matrix3x4_t *)&local_9c,3,(Vector *)&local_b4);
local_a4 = (local_b0 - *(float *)(param_7 + 4)) * fVar8 + *(float *)(param_7 + 4);
local_a0 = (local_ac - *(float *)(param_7 + 8)) * fVar8 + *(float *)(param_7 + 8);
local_a8 = (local_b4 - *(float *)param_7) * fVar8 + *(float *)param_7;
MatrixSetColumn((Vector *)&local_a8,3,(matrix3x4_t *)&local_9c);
local_9c = local_9c * fVar8;
local_5c = *(float *)(param_2 + 0x10) * fVar8;
local_98 = local_98 * fVar8;
local_58 = *(float *)(param_2 + 0x14) * fVar8;
local_6c = (*(float *)param_2 - *(float *)param_7) * fVar8 + *(float *)param_7;
local_94 = local_94 * fVar8;
local_8c = local_8c * fVar8;
local_88 = local_88 * fVar8;
local_84 = local_84 * fVar8;
local_7c = local_7c * fVar8;
local_78 = local_78 * fVar8;
local_74 = local_74 * fVar8;
local_68 = (*(float *)(param_2 + 4) - *(float *)(param_7 + 4)) * fVar8 +
*(float *)(param_7 + 4);
local_64 = (*(float *)(param_2 + 8) - *(float *)(param_7 + 8)) * fVar8 +
*(float *)(param_7 + 8);
local_54 = *(float *)(param_2 + 0x18) * fVar8;
local_27 = local_58 * local_58 + local_5c * local_5c + local_54 * local_54 != 0.0;
local_34 = 0;
local_38 = 0;
local_3c = 0;
local_2c = 0;
local_28 = 1;
local_44 = 0;
local_48 = 0;
local_4c = 0;
iVar6 = ClipRayToHitbox((Ray_t *)&local_6c,pmVar1,(matrix3x4_t *)&local_9c,param_9 + 0x2c)
;
}
else {
iVar6 = ClipRayToHitbox(param_2,pmVar1,param_5[*(int *)pmVar1],param_9 + 0x2c);
}
if (-1 < iVar6) {
local_c8 = iVar6;
local_c4 = iVar7;
}
}
iVar7 = iVar7 + 1;
} while (iVar7 < *(int *)(param_4 + 4));
}
if (local_c4 == -1) {
return (Ray_t)0x0;
}
iVar7 = *(int *)(param_4 + 8);
fVar8 = *(float *)(param_9 + 0x2c);
fVar10 = *(float *)(param_2 + 0x10) * fVar8 + *(float *)param_2;
*(float *)(param_9 + 0xc) = fVar10;
fVar11 = *(float *)(param_2 + 0x14) * fVar8 + *(float *)(param_2 + 4);
*(float *)(param_9 + 0x10) = fVar11;
fVar8 = fVar8 * *(float *)(param_2 + 0x18) + *(float *)(param_2 + 8);
*(float *)(param_9 + 0x14) = fVar8;
uVar2 = *(undefined4 *)(param_4 + *(int *)(param_4 + 8) + local_c4 * 0x44 + 4);
*(int *)(param_9 + 0x50) = local_c4;
*(undefined4 *)(param_9 + 0x44) = uVar2;
iVar6 = *(int *)(param_4 + iVar7 + local_c4 * 0x44) * 0xd8 + *(int *)(*(int *)param_3 + 0xa0) +
*(int *)param_3;
*(uint *)(param_9 + 0x30) = *(uint *)(iVar6 + 0xb4) | 0x40000000;
uVar2 = *(undefined4 *)(iVar6 + 0xac);
*(undefined **)(param_9 + 0x3c) = &DAT_00c5994b;
*(short *)(param_9 + 0x48) = (short)uVar2;
*(undefined2 *)(param_9 + 0x42) = 0x8000;
*(short *)(param_9 + 0x40) = (short)*(undefined4 *)(iVar6 + 0xb8);
pmVar3 = param_5[*(int *)(param_4 + iVar7 + local_c4 * 0x44)];
if (local_c8 < 3) {
fVar12 = -*(float *)(pmVar3 + local_c8 * 4);
*(float *)(param_9 + 0x18) = fVar12;
fVar9 = -*(float *)(pmVar3 + local_c8 * 4 + 0x10);
*(float *)(param_9 + 0x1c) = fVar9;
fVar13 = -*(float *)(pmVar3 + local_c8 * 4 + 0x20);
*(float *)(param_9 + 0x20) = fVar13;
}
else {
fVar12 = *(float *)(pmVar3 + (local_c8 + -3) * 4);
iVar7 = (local_c8 + -3) * 4;
*(float *)(param_9 + 0x18) = fVar12;
fVar9 = *(float *)(pmVar3 + iVar7 + 0x10);
*(float *)(param_9 + 0x1c) = fVar9;
fVar13 = *(float *)(pmVar3 + iVar7 + 0x20);
*(float *)(param_9 + 0x20) = fVar13;
}
param_9[0x28] = (CGameTrace)0x3;
*(float *)(param_9 + 0x24) = fVar9 * fVar11 + fVar10 * fVar12 + fVar8 * fVar13;
return RVar5;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.