RagdollCreate
0x004a3bf0 · 2667 bytes · __cdecl
_Z13RagdollCreateR9ragdoll_tRK15ragdollparams_tP19IPhysicsEnvironment
Decompiled
undefined (3 params)
/* RagdollCreate(ragdoll_t&, ragdollparams_t const&, IPhysicsEnvironment*) */
undefined4 RagdollCreate(ragdoll_t *param_1,ragdollparams_t *param_2,IPhysicsEnvironment *param_3)
{
float fVar1;
short sVar2;
short sVar3;
vcollide_t *pvVar4;
code *pcVar5;
ushort uVar6;
undefined4 uVar7;
int iVar8;
int iVar9;
int *piVar10;
int *piVar11;
int iVar12;
matrix3x4_t *pmVar13;
int iVar14;
void *pvVar15;
int iVar16;
int iVar17;
ragdoll_t *prVar18;
longdouble lVar19;
int local_104;
int local_100;
int local_f8;
matrix3x4_t *local_f0;
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;
undefined4 local_c4;
undefined4 local_c0;
undefined1 local_bc;
matrix3x4_t local_b8 [48];
undefined4 local_88;
undefined4 local_84;
undefined4 local_80;
undefined4 local_7c;
undefined4 local_78;
undefined4 local_74;
undefined4 local_70;
undefined4 local_6c;
undefined4 local_68;
undefined4 local_64;
undefined4 local_60;
undefined4 local_5c;
int local_58;
int local_54;
undefined4 local_50;
undefined4 local_4c;
undefined4 local_48;
float local_44;
undefined4 local_40;
undefined4 local_3c;
undefined4 local_38;
float local_34;
undefined4 local_30;
undefined4 local_2c;
undefined4 local_28;
float local_24;
undefined1 local_20;
undefined1 local_1f;
undefined1 local_1e;
*(undefined4 *)param_1 = 0;
*(undefined4 *)(param_1 + 8) = 0;
param_1[4] = *(ragdoll_t *)(param_2 + 0x34);
prVar18 = param_1 + 0xc;
for (iVar12 = 0x1f8; iVar12 != 0; iVar12 = iVar12 + -1) {
*(undefined4 *)prVar18 = 0;
prVar18 = prVar18 + 4;
}
*(undefined4 *)(param_1 + 0x84c) = 0;
*(undefined4 *)(param_1 + 0x850) = 0;
*(undefined4 *)(param_1 + 0x854) = 0;
*(undefined4 *)(param_1 + 0x858) = 0;
*(undefined4 *)(param_1 + 0x85c) = 0;
pvVar4 = *(vcollide_t **)(param_2 + 4);
if ((pvVar4 != (vcollide_t *)0x0) && ((*(ushort *)pvVar4 & 0x7fff) < 0x19)) {
local_104 = *(int *)(pvVar4 + 0xc);
if (local_104 == 0) {
local_104 = ParseRagdollIntoCache
(*(CStudioHdr **)(param_2 + 8),pvVar4,*(int *)(param_2 + 0xc));
}
if ((g_pPhysics2 == 0) || (*(int *)(cv_ragdoll_version._28_4_ + 0x30) != 2)) {
local_d0 = 0.0;
local_c8 = 6.0;
local_cc = 2.8026e-44;
uVar7 = (**(code **)(*(int *)param_3 + 0x60))(param_3,&local_d0);
*(undefined4 *)(param_1 + 8) = uVar7;
}
iVar12 = local_104 + 0x20;
sVar2 = *(short *)(local_104 + 0x1a);
iVar8 = (int)*(short *)(local_104 + 0x18);
iVar16 = **(int **)(param_2 + 8);
if (0 < iVar8) {
iVar9 = 0;
do {
*(undefined4 *)(param_1 + iVar9 + 0x28) = 0xffffffff;
iVar9 = iVar9 + 0x54;
} while (iVar9 != iVar8 * 0x54);
}
if (0 < sVar2) {
iVar9 = 0;
pmVar13 = (matrix3x4_t *)(iVar8 * 0x38 + iVar12 + 0x30);
do {
iVar9 = iVar9 + 1;
*(int *)(param_1 + *(short *)(pmVar13 + 0x32) * 0x54 + 0x28) =
(int)*(short *)(pmVar13 + 0x30);
MatrixGetColumn(pmVar13,3,(Vector *)(param_1 + *(short *)(pmVar13 + 0x32) * 0x54 + 0xc));
pmVar13 = pmVar13 + 100;
} while (iVar9 < sVar2);
}
if ((g_pPhysics2 == 0) || (*(int *)(cv_ragdoll_version._28_4_ + 0x30) != 2)) {
local_100 = 0;
}
else {
local_100 = (**(code **)(*modelinfo + 0x1c))(modelinfo,*(undefined4 *)(param_2 + 0xc));
}
if (iVar8 < 1) {
*(int *)param_1 = iVar8;
sVar3 = *(short *)(local_104 + 0x1a);
sVar2 = *(short *)(local_104 + 0x18);
if (iVar8 == 0) {
return 0;
}
}
else {
iVar17 = 0;
iVar9 = iVar12;
local_f0 = (matrix3x4_t *)(param_1 + 0x30);
do {
iVar14 = (int)*(short *)(iVar9 + 0x34);
*(int *)(param_1 + iVar17 * 4 + 0x7ec) = (int)*(short *)(iVar9 + 0x30);
*(int *)(iVar9 + 0x18) = iVar16 + 0xc;
*(undefined4 *)(iVar9 + 0x1c) = *(undefined4 *)param_2;
if ((g_pPhysics2 == 0) || (*(int *)(cv_ragdoll_version._28_4_ + 0x30) != 2)) {
piVar11 = (int *)(**(code **)(*(int *)param_3 + 0x20))
(param_3,*(undefined4 *)
(*(int *)(*(int *)(param_2 + 4) + 4) +
*(short *)(iVar9 + 0x32) * 4),
*(undefined4 *)(iVar9 + 0x2c),&vec3_origin,&vec3_angle,iVar9);
LAB_004a3e2f:
if (piVar11 != (int *)0x0) {
(**(code **)(*piVar11 + 0x54))(piVar11,iVar17);
iVar14 = *(int *)(local_f0 + -8);
MatrixCopy((matrix3x4_t *)
(*(int *)(param_1 + iVar17 * 4 + 0x7ec) * 0x30 + *(int *)(param_2 + 0x2c)),
(matrix3x4_t *)&local_d0);
if (-1 < iVar14) {
(**(code **)(**(int **)(param_1 + iVar14 * 0x54 + 0x18) + 0xe4))
(*(int **)(param_1 + iVar14 * 0x54 + 0x18),&local_dc,local_f0 + -0x24);
MatrixSetColumn((Vector *)&local_dc,3,(matrix3x4_t *)&local_d0);
}
(**(code **)(*piVar11 + 0xc0))(piVar11,&local_d0,1);
MatrixCopy((matrix3x4_t *)&local_d0,local_f0);
pcVar5 = *(code **)(*physcollision + 0xd8);
uVar7 = (**(code **)(*piVar11 + 300))(piVar11);
lVar19 = (longdouble)(*pcVar5)(physcollision,uVar7);
*(float *)(local_f0 + -4) = (float)lVar19;
uVar6 = (**(code **)(*piVar11 + 0x50))(piVar11);
(**(code **)(*piVar11 + 0x4c))(piVar11,uVar6 | 8);
}
}
else {
piVar10 = (int *)(**(code **)(*g_pPhys2World + 0x54))
(g_pPhys2World,
*(undefined4 *)(*(int *)(local_100 + 8) + iVar14 * 4),
&local_d0,0x3f800000,0x14,0,0);
*(int **)(local_f0 + -0x14) = piVar10;
if (piVar10 != (int *)0x0) {
(**(code **)(*piVar10 + 0x3c))
(piVar10,"svRagdoll %s [%d->%d] %s",iVar16 + 0xc,iVar17,iVar14,
*(undefined4 *)(*(int *)(local_100 + 0x20) + iVar14 * 4));
(**(code **)(*piVar10 + 0xc))(piVar10,*(undefined4 *)param_2);
piVar11 = (int *)(**(code **)(*piVar10 + 0x60))(piVar10);
*(int **)(local_f0 + -0x18) = piVar11;
(**(code **)(*piVar10 + 0x7c))(piVar10,0x3f800000);
goto LAB_004a3e2f;
}
piVar11 = (int *)0x0;
}
iVar17 = iVar17 + 1;
iVar9 = iVar9 + 0x38;
*(int **)(local_f0 + -0x18) = piVar11;
local_f0 = local_f0 + 0x54;
} while (iVar8 != iVar17);
*(int *)param_1 = iVar8;
sVar2 = *(short *)(local_104 + 0x18);
sVar3 = *(short *)(local_104 + 0x1a);
}
local_f8 = (int)sVar3;
pvVar15 = (void *)(sVar2 * 0x38 + iVar12);
if (0 < local_f8) {
local_f0 = (matrix3x4_t *)0x0;
do {
local_1f = 1;
local_cc = 0.0;
local_c8 = 0.0;
local_d0 = 1.0;
local_c4 = 0x3f800000;
local_c0 = 0x3f800000;
local_bc = 1;
SetIdentityMatrix(local_b8);
SetIdentityMatrix((matrix3x4_t *)&local_88);
local_58 = 0xffffffff;
local_54 = 0xffffffff;
local_50 = 0;
local_4c = 0;
local_48 = 0;
local_44 = 0.0;
local_40 = 0;
local_3c = 0;
local_38 = 0;
local_34 = 0.0;
local_30 = 0;
local_2c = 0;
local_28 = 0;
local_24 = 0.0;
local_20 = 0;
local_1e = 0;
_V_memcpy(&local_50,pvVar15,0x30);
fVar1 = *(float *)(param_2 + 0x30);
if (0.0 < fVar1) {
local_44 = local_44 * fVar1;
local_34 = local_34 * fVar1;
local_24 = fVar1 * local_24;
}
iVar12 = (int)*(short *)((int)pvVar15 + 0x60);
iVar16 = (int)*(short *)((int)pvVar15 + 0x62);
local_1e = 1;
local_88 = *(undefined4 *)((int)pvVar15 + 0x30);
local_84 = *(undefined4 *)((int)pvVar15 + 0x34);
local_80 = *(undefined4 *)((int)pvVar15 + 0x38);
local_7c = *(undefined4 *)((int)pvVar15 + 0x3c);
local_78 = *(undefined4 *)((int)pvVar15 + 0x40);
local_74 = *(undefined4 *)((int)pvVar15 + 0x44);
local_70 = *(undefined4 *)((int)pvVar15 + 0x48);
local_6c = *(undefined4 *)((int)pvVar15 + 0x4c);
local_68 = *(undefined4 *)((int)pvVar15 + 0x50);
local_64 = *(undefined4 *)((int)pvVar15 + 0x54);
local_60 = *(undefined4 *)((int)pvVar15 + 0x58);
local_5c = *(undefined4 *)((int)pvVar15 + 0x5c);
local_58 = iVar12;
local_54 = iVar16;
SetIdentityMatrix(local_b8);
if ((g_pPhysics2 == 0) || (*(int *)(cv_ragdoll_version._28_4_ + 0x30) != 2)) {
uVar7 = (**(code **)(*(int *)param_3 + 0x40))
(param_3,*(undefined4 *)(param_1 + iVar16 * 0x54 + 0x18),
*(undefined4 *)(param_1 + iVar12 * 0x54 + 0x18),
*(undefined4 *)(param_1 + 8),&local_d0);
*(undefined4 *)(param_1 + iVar16 * 0x54 + 0x20) = uVar7;
}
else {
uVar7 = (**(code **)(*g_pPhys2World + 0x20))
(g_pPhys2World,*(undefined4 *)(param_1 + iVar16 * 0x54 + 0x1c),
*(undefined4 *)(param_1 + iVar12 * 0x54 + 0x1c),&local_d0,1);
*(undefined4 *)(param_1 + iVar16 * 0x54 + 0x24) = uVar7;
}
local_f0 = (matrix3x4_t *)((int)local_f0 + 1);
pvVar15 = (void *)((int)pvVar15 + 100);
} while (local_f0 != (matrix3x4_t *)local_f8);
}
}
iVar12 = *(int *)param_1;
if (iVar12 == 0) {
return 0;
}
iVar16 = *(int *)(param_2 + 0x28);
if (iVar12 < 1) {
local_f0 = (matrix3x4_t *)0x3f800000;
}
else {
local_f0 = (matrix3x4_t *)0x0;
prVar18 = param_1 + 0x18;
iVar8 = 0;
do {
piVar11 = *(int **)prVar18;
if (piVar11 != (int *)0x0) {
lVar19 = (longdouble)(**(code **)(*piVar11 + 0x78))(piVar11);
iVar12 = *(int *)param_1;
local_f0 = (matrix3x4_t *)((float)lVar19 + (float)local_f0);
}
iVar8 = iVar8 + 1;
prVar18 = prVar18 + 0x54;
} while (iVar8 < iVar12);
if ((float)local_f0 <= 1.0) {
local_f0 = (matrix3x4_t *)0x3f800000;
}
}
local_e8 = *(float *)(param_2 + 0x1c);
local_e4 = *(float *)(param_2 + 0x20);
local_e0 = *(float *)(param_2 + 0x24);
local_dc = *(float *)(param_2 + 0x10);
local_d8 = *(float *)(param_2 + 0x14);
local_d4 = *(float *)(param_2 + 0x18);
if (((-1 < iVar16) && (iVar16 < iVar12)) &&
(piVar11 = *(int **)(param_1 + iVar16 * 0x54 + 0x18), piVar11 != (int *)0x0)) {
(**(code **)(*piVar11 + 0xf4))(piVar11,&local_e8);
(**(code **)(**(int **)(param_1 + iVar16 * 0x54 + 0x18) + 0xc4))
(*(int **)(param_1 + iVar16 * 0x54 + 0x18),&local_dc,0);
}
if ((((vec3_origin != local_dc) || (DAT_01053d4c != local_d8)) || (DAT_01053d50 != local_d4)) &&
(0 < *(int *)param_1)) {
iVar12 = 0;
prVar18 = param_1;
do {
if ((iVar16 != iVar12) && (piVar11 = *(int **)(prVar18 + 0x18), piVar11 != (int *)0x0)) {
lVar19 = (longdouble)(**(code **)(*piVar11 + 0x78))(piVar11);
local_c8 = (float)lVar19 * (1.0 / (float)local_f0);
local_d0 = local_e8 * local_c8;
local_cc = local_e4 * local_c8;
local_c8 = local_c8 * local_e0;
(**(code **)(**(int **)(prVar18 + 0x18) + 0xf8))
(*(int **)(prVar18 + 0x18),&local_d0,&local_dc);
}
iVar12 = iVar12 + 1;
prVar18 = prVar18 + 0x54;
} while (iVar12 < *(int *)param_1);
}
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.