RagdollSolveSeparation
0x004a4dc0 · 1222 bytes · __cdecl
_Z22RagdollSolveSeparationR9ragdoll_tP11CBaseEntity
Decompiled
undefined (2 params)
/* RagdollSolveSeparation(ragdoll_t&, CBaseEntity*) */
void RagdollSolveSeparation(ragdoll_t *param_1,CBaseEntity *param_2)
{
int *piVar1;
char cVar2;
int iVar3;
ragdoll_t *prVar4;
ragdoll_t *prVar5;
int iVar6;
int in_GS_OFFSET;
int local_214;
float local_200;
float local_1fc;
float local_1f8;
float local_1f4;
float local_1f0;
float local_1ec;
float local_1e8;
float local_1e4;
float local_1e0;
Vector local_1dc [16];
float local_1cc;
float local_1c8;
float local_1c4;
float local_1bc;
float local_1b8;
float local_1b4;
undefined4 local_1ac;
undefined4 local_1a8;
undefined4 local_1a4;
undefined4 local_19c;
undefined4 local_198;
undefined4 local_194;
undefined4 local_18c;
undefined1 local_188;
undefined1 local_187;
matrix3x4_t local_174 [12];
Vector local_168 [32];
float local_148;
char local_13e;
char local_13d;
char acStack_120 [256];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (0 < *(int *)param_1) {
prVar5 = param_1 + 0xc;
iVar6 = 0;
local_214 = 0;
prVar4 = param_1 + 0x18;
do {
while ((((iVar3 = *(int *)(prVar4 + 8), acStack_120[iVar6] = '\0', iVar3 == 0 ||
(*(int *)(prVar4 + 0x10) < 0)) || (piVar1 = *(int **)prVar4, piVar1 == (int *)0x0))
|| (*(int *)(param_1 + *(int *)(prVar4 + 0x10) * 0x54 + 0x18) == 0))) {
LAB_004a4e98:
iVar3 = *(int *)param_1;
iVar6 = iVar6 + 1;
prVar4 = prVar4 + 0x54;
if (iVar3 <= iVar6) goto LAB_004a4f4c;
}
(**(code **)(*piVar1 + 0xc4))(piVar1,&local_200,0);
(**(code **)(**(int **)(param_1 + *(int *)(prVar4 + 0x10) * 0x54 + 0x18) + 0xe4))
(*(int **)(param_1 + *(int *)(prVar4 + 0x10) * 0x54 + 0x18),&local_1f4,prVar4 + -0xc
);
if (acStack_120[*(int *)(prVar4 + 0x10)] == '\0') {
local_1e4 = local_1f0 - local_1fc;
local_1e0 = local_1ec - local_1f8;
local_1e8 = local_1f4 - local_200;
if ((local_1e4 * local_1e4 + local_1e0 * local_1e0 + local_1e8 * local_1e8 <= 1.0) ||
(cVar2 = PhysHasContactWithOtherInDirection
(*(IPhysicsObject **)prVar4,(Vector *)&local_1e8), cVar2 == '\0'))
goto LAB_004a4e98;
local_1c8 = local_1f0;
local_1c4 = local_1ec;
local_1b8 = local_1fc - local_1f0;
local_18c = 0;
local_1b4 = local_1f8 - local_1ec;
local_188 = 1;
local_1cc = local_1f4;
local_1bc = local_200 - local_1f4;
local_194 = 0;
local_198 = 0;
local_19c = 0;
local_187 = local_1b8 * local_1b8 + local_1b4 * local_1b4 + local_1bc * local_1bc != 0.0;
local_1a4 = 0;
local_1a8 = 0;
local_1ac = 0;
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)local_1dc,(IHandleEntity *)param_2,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
(**(code **)(*enginetrace + 0x14))
(enginetrace,&local_1cc,0x200400b,(CTraceFilterSimple *)local_1dc,local_174);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine((Vector *)local_174,local_168,0xff,0,0,true,-1.0);
}
if ((local_148 < 1.0) || (local_13e != '\0')) goto LAB_004a4f2d;
if (local_13d == '\0') goto LAB_004a4e98;
acStack_120[iVar6] = '\x01';
}
else {
LAB_004a4f2d:
acStack_120[iVar6] = '\x01';
}
local_214 = local_214 + 1;
iVar3 = *(int *)param_1;
iVar6 = iVar6 + 1;
prVar4 = prVar4 + 0x54;
} while (iVar6 < iVar3);
LAB_004a4f4c:
if (local_214 != 0) {
if (0 < iVar3) {
iVar6 = 0;
do {
if (((acStack_120[iVar6] != '\0') &&
(piVar1 = *(int **)(param_1 + *(int *)(prVar5 + 0x1c) * 0x54 + 0x18),
piVar1 != (int *)0x0)) && (*(int *)(prVar5 + 0xc) != 0)) {
(**(code **)(*piVar1 + 0xe4))(piVar1,local_1dc,prVar5);
(**(code **)(**(int **)(param_1 + *(int *)(prVar5 + 0x1c) * 0x54 + 0x18) + 0xdc))
(*(int **)(param_1 + *(int *)(prVar5 + 0x1c) * 0x54 + 0x18),local_1dc,
&local_1cc);
(**(code **)(**(int **)(prVar5 + 0xc) + 200))(*(int **)(prVar5 + 0xc),local_174);
MatrixSetColumn(local_1dc,3,local_174);
(**(code **)(**(int **)(prVar5 + 0xc) + 0xc0))(*(int **)(prVar5 + 0xc),local_174,1);
(**(code **)(**(int **)(prVar5 + 0xc) + 0xcc))
(*(int **)(prVar5 + 0xc),&local_1cc,&vec3_origin);
}
iVar6 = iVar6 + 1;
prVar5 = prVar5 + 0x54;
} while (iVar6 < *(int *)param_1);
}
DevMsg(2,"TICK:%5d:Ragdoll separation count: %d\n",*(undefined4 *)(gpGlobals + 0x18),local_214
);
goto LAB_004a509d;
}
}
(**(code **)(**(int **)(param_1 + 8) + 0x10))(*(int **)(param_1 + 8));
LAB_004a509d:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
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.