CRagdollProp::VPhysicsUpdate
0x007958c0 · 1903 bytes · __cdecl
_ZN12CRagdollProp14VPhysicsUpdateEP14IPhysicsObject
Decompiled
undefined (1 param)
/* CRagdollProp::VPhysicsUpdate(IPhysicsObject*) */
void CRagdollProp::VPhysicsUpdate(IPhysicsObject *param_1)
{
CCollisionProperty *this;
undefined4 uVar1;
undefined4 uVar2;
float fVar3;
CBaseEdict *pCVar4;
int *piVar5;
float fVar6;
float fVar7;
float fVar8;
float fVar9;
float fVar10;
char cVar11;
IPhysicsObject IVar12;
int iVar13;
float *pfVar14;
matrix3x4_t *pmVar15;
int iVar16;
Vector *pVVar17;
IPhysicsObject *pIVar18;
Vector *local_187c;
ragdoll_t *local_1868;
undefined1 local_1864 [8];
float local_185c;
undefined4 local_1858;
undefined4 local_1854;
float local_1850 [6];
float local_1838;
float local_1834;
float local_1830;
float local_182c;
matrix3x4_t *local_1828;
float local_1824;
matrix3x4_t local_181c [12];
float afStack_1810 [4];
undefined4 auStack_1800 [4];
undefined4 auStack_17f0 [1528];
if (*(int *)(param_1 + 0x1ea8) == *(int *)(gpGlobals + 0x18)) {
return;
}
if (*(int *)(param_1 + 0x13f8) < 1) {
*(int *)(param_1 + 0x1ea8) = *(int *)(gpGlobals + 0x18);
}
else {
iVar16 = 0;
pIVar18 = param_1 + 0x1428;
do {
iVar16 = iVar16 + 1;
(**(code **)(**(int **)(pIVar18 + -0x18) + 200))(*(int **)(pIVar18 + -0x18),pIVar18);
pIVar18 = pIVar18 + 0x54;
} while (iVar16 < *(int *)(param_1 + 0x13f8));
*(undefined4 *)(param_1 + 0x1ea8) = *(undefined4 *)(gpGlobals + 0x18);
if (0 < *(int *)(param_1 + 0x13f8)) {
iVar16 = 0;
pIVar18 = param_1 + 0x1d80;
do {
while( true ) {
local_1828 = local_181c;
local_182c = 0.0;
cVar11 = RagdollGetBoneMatrix
((ragdoll_t *)(param_1 + 0x13f8),(CBoneAccessor *)&local_182c,iVar16);
if (cVar11 != '\0') break;
if (param_1[0x6c] == (IPhysicsObject)0x0) {
pCVar4 = *(CBaseEdict **)(param_1 + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar13 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar13 + 2) = 0;
}
}
else {
param_1[0x70] = (IPhysicsObject)((byte)param_1[0x70] | 1);
}
*(undefined4 *)(pIVar18 + -0x120) = 0;
*(undefined4 *)(pIVar18 + -0x11c) = 0;
*(undefined4 *)(pIVar18 + -0x118) = 0;
if (param_1[0x6c] == (IPhysicsObject)0x0) {
pCVar4 = *(CBaseEdict **)(param_1 + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar13 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar13 + 2) = 0;
}
}
else {
param_1[0x70] = (IPhysicsObject)((byte)param_1[0x70] | 1);
}
*(undefined4 *)pIVar18 = 0;
iVar16 = iVar16 + 1;
*(undefined4 *)(pIVar18 + 4) = 0;
*(undefined4 *)(pIVar18 + 8) = 0;
pIVar18 = pIVar18 + 0xc;
if (*(int *)(param_1 + 0x13f8) <= iVar16) goto LAB_00795b26;
}
iVar13 = *(int *)(param_1 + iVar16 * 4 + 0x1be4);
MatrixAngles(local_181c + iVar13 * 0x30,&local_185c);
fVar3 = afStack_1810[iVar13 * 0xc];
uVar1 = auStack_1800[iVar13 * 0xc];
uVar2 = auStack_17f0[iVar13 * 0xc];
local_1838 = fVar3;
local_1834 = (float)uVar1;
local_1830 = (float)uVar2;
iVar13 = memcmp(pIVar18 + -0x120,&local_1838,0xc);
if (iVar13 != 0) {
if (param_1[0x6c] == (IPhysicsObject)0x0) {
pCVar4 = *(CBaseEdict **)(param_1 + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar13 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar13 + 2) = 0;
}
}
else {
param_1[0x70] = (IPhysicsObject)((byte)param_1[0x70] | 1);
}
*(float *)(pIVar18 + -0x120) = fVar3;
*(undefined4 *)(pIVar18 + -0x11c) = uVar1;
*(undefined4 *)(pIVar18 + -0x118) = uVar2;
}
iVar13 = memcmp(pIVar18,&local_185c,0xc);
if (iVar13 != 0) {
if (param_1[0x6c] == (IPhysicsObject)0x0) {
pCVar4 = *(CBaseEdict **)(param_1 + 0x30);
if (pCVar4 != (CBaseEdict *)0x0) {
*(uint *)pCVar4 = *(uint *)pCVar4 | 0x101;
iVar13 = CBaseEdict::GetChangeAccessor(pCVar4);
*(undefined2 *)(iVar13 + 2) = 0;
}
}
else {
param_1[0x70] = (IPhysicsObject)((byte)param_1[0x70] | 1);
}
*(float *)pIVar18 = local_185c;
*(undefined4 *)(pIVar18 + 4) = local_1858;
*(undefined4 *)(pIVar18 + 8) = local_1854;
}
iVar16 = iVar16 + 1;
pIVar18 = pIVar18 + 0xc;
} while (iVar16 < *(int *)(param_1 + 0x13f8));
}
}
LAB_00795b26:
local_1868 = (ragdoll_t *)(param_1 + 0x13f8);
local_187c = (Vector *)&local_1838;
IVar12 = (IPhysicsObject)RagdollIsAsleep(local_1868);
param_1[0x1eac] = IVar12;
if (IVar12 == (IPhysicsObject)0x0) {
piVar5 = *(int **)(param_1 + 0x1400);
if (piVar5 == (int *)0x0) goto LAB_00795b59;
cVar11 = (**(code **)(*piVar5 + 0xc))(piVar5);
if (cVar11 == '\0') {
IVar12 = param_1[0x1eac];
}
else {
RagdollSolveSeparation(local_1868,(CBaseEntity *)param_1);
IVar12 = param_1[0x1eac];
}
if (IVar12 == (IPhysicsObject)0x0) goto LAB_00795b59;
}
else {
*(undefined4 *)(param_1 + 0x1ec8) = 0;
}
if (*(int *)(param_1 + 0x234) == 3) {
CBaseEntity::SetCollisionGroup((CBaseEntity *)param_1,1);
if (0 < *(int *)(param_1 + 0x13f8)) {
pIVar18 = param_1 + 0x1410;
iVar16 = 0;
do {
piVar5 = *(int **)pIVar18;
iVar16 = iVar16 + 1;
pIVar18 = pIVar18 + 0x54;
(**(code **)(*piVar5 + 0x6c))(piVar5);
} while (iVar16 < *(int *)(param_1 + 0x13f8));
}
CBaseEntity::ThinkSet((_func_void *)local_1864,(float)param_1,(char *)0x0);
}
LAB_00795b59:
local_1850[0] = *(float *)(param_1 + 0x1c60);
local_1850[1] = *(float *)(param_1 + 0x1c64);
local_1850[2] = *(float *)(param_1 + 0x1c68);
local_1850[3] = local_1850[0];
local_1850[4] = local_1850[1];
local_1850[5] = local_1850[2];
if (0 < *(int *)(param_1 + 0x13f8)) {
pmVar15 = (matrix3x4_t *)(param_1 + 0x1428);
pVVar17 = (Vector *)(param_1 + 0x1edc);
iVar16 = 0;
do {
if (*(int *)(pmVar15 + -0x18) == 0) {
*(undefined4 *)pVVar17 = 0;
*(undefined4 *)(pVVar17 + 4) = 0;
*(undefined4 *)(pVVar17 + 8) = 0;
*(undefined4 *)(pVVar17 + 0x120) = 0;
*(undefined4 *)(pVVar17 + 0x124) = 0;
*(undefined4 *)(pVVar17 + 0x128) = 0;
}
else {
TransformAABB(pmVar15,pVVar17,pVVar17 + 0x120,local_187c,(Vector *)&local_182c);
iVar13 = 0;
do {
if (*(float *)(local_187c + iVar13 * 4) < local_1850[iVar13]) {
local_1850[iVar13] = *(float *)(local_187c + iVar13 * 4);
}
fVar3 = *(float *)((Vector *)&local_182c + iVar13 * 4);
if (local_1850[iVar13 + 3] <= fVar3 && fVar3 != local_1850[iVar13 + 3]) {
local_1850[iVar13 + 3] = fVar3;
}
iVar13 = iVar13 + 1;
} while (iVar13 != 3);
}
iVar16 = iVar16 + 1;
pVVar17 = pVVar17 + 0xc;
pmVar15 = pmVar15 + 0x54;
} while (iVar16 < *(int *)(param_1 + 0x13f8));
}
fVar10 = local_1850[5];
fVar9 = local_1850[4];
fVar8 = local_1850[3];
fVar7 = local_1850[2];
fVar6 = local_1850[1];
fVar3 = local_1850[0];
this = (CCollisionProperty *)(param_1 + 0x194);
CBaseEntity::SetAbsOrigin((CBaseEntity *)param_1,(Vector *)(param_1 + 0x1c60));
CBaseEntity::SetAbsAngles((CBaseEntity *)param_1,(QAngle *)&vec3_angle);
pfVar14 = (float *)(**(code **)(*(int *)(param_1 + 0x194) + 0x20))(this);
CCollisionProperty::SetSolidFlags(this,(uint)(*(ushort *)(param_1 + 0x1b4) | 0x40));
CCollisionProperty::SetSurroundingBoundsType(this,6,0,0);
local_182c = fVar8 - *pfVar14;
local_1828 = (matrix3x4_t *)(fVar9 - pfVar14[1]);
local_1824 = fVar10 - pfVar14[2];
local_1838 = fVar3 - *pfVar14;
local_1834 = fVar6 - pfVar14[1];
local_1830 = fVar7 - pfVar14[2];
CBaseEntity::SetCollisionBounds((CBaseEntity *)param_1,local_187c,(Vector *)&local_182c);
CCollisionProperty::MarkSurroundingBoundsDirty(this);
CBaseEntity::PhysicsTouchTriggers((CBaseEntity *)param_1,(Vector *)0x0);
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.