CalculateObjectStress
0x0078aee0 · 2761 bytes · __cdecl
_Z21CalculateObjectStressP14IPhysicsObjectP11CBaseEntityP23vphysics_objectstress_t
Decompiled
undefined (3 params)
/* CalculateObjectStress(IPhysicsObject*, CBaseEntity*, vphysics_objectstress_t*) */
longdouble
CalculateObjectStress(IPhysicsObject *param_1,CBaseEntity *param_2,vphysics_objectstress_t *param_3)
{
float fVar1;
char cVar2;
int *piVar3;
int *piVar4;
int *piVar5;
CBaseEntity *pCVar6;
int iVar7;
CBaseEntity *pCVar8;
uint uVar9;
undefined *puVar10;
float *pfVar11;
int iVar12;
longdouble lVar13;
float fVar14;
float fVar15;
float fVar16;
float fVar17;
vphysics_objectstress_t local_a1;
float local_98;
float local_94;
float local_90;
float local_8c [6];
float local_74 [3];
float local_68 [3];
CBaseEntity *local_5c;
float local_58;
float local_54;
CBaseEntity *local_50;
float local_4c;
float local_48;
int local_44 [5];
int local_30 [8];
local_44[0] = 0;
local_44[1] = 0;
local_44[2] = 0;
local_44[3] = 0;
local_44[4] = 0;
local_30[0] = 0;
local_30[1] = 0;
local_30[2] = 0;
local_30[3] = 0;
local_30[4] = 0;
local_50 = (CBaseEntity *)0x0;
/* try { // try from 0078af57 to 0078b36d has its CatchHandler @ 0078b9e3 */
CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)local_44,0,&local_50);
CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
((CUtlVector<Vector,CUtlMemory<Vector,int>> *)local_30,local_30[3],
(Vector *)&vec3_origin);
local_50 = (CBaseEntity *)0x0;
CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)local_44,local_44[3],&local_50
);
CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
((CUtlVector<Vector,CUtlMemory<Vector,int>> *)local_30,local_30[3],
(Vector *)&vec3_origin);
piVar3 = (int *)(**(code **)(*(int *)param_2 + 0x144))(param_2);
piVar4 = (int *)(**(code **)(*(int *)param_1 + 0x144))(param_1);
lVar13 = (longdouble)(**(code **)(*(int *)param_1 + 0x78))(param_1);
fVar1 = (float)lVar13;
local_a1 = (vphysics_objectstress_t)0x0;
if (piVar4 != (int *)0x0) {
while (cVar2 = (**(code **)(*piVar4 + 8))(piVar4), cVar2 != '\0') {
lVar13 = (longdouble)(**(code **)(*piVar4 + 0x1c))(piVar4);
local_94 = (float)lVar13;
if (0.0 < local_94) {
piVar5 = (int *)(**(code **)(*piVar4 + 0xc))(piVar4,1);
pCVar6 = (CBaseEntity *)(**(code **)(*piVar5 + 0x48))(piVar5);
if (pCVar6 == (CBaseEntity *)0x0) {
pCVar6 = (CBaseEntity *)GetWorldEntity();
}
uVar9 = *(uint *)(pCVar6 + 0x220);
local_5c = pCVar6;
if ((((uVar9 != 0xffffffff) &&
(puVar10 = g_pEntityList + (uVar9 & 0xfff) * 0x10, puVar10 != (undefined *)0xfffffffc))
&& (*(uint *)(puVar10 + 8) == uVar9 >> 0xc)) &&
(*(CBaseEntity **)(puVar10 + 4) != (CBaseEntity *)0x0)) {
local_5c = *(CBaseEntity **)(puVar10 + 4);
}
cVar2 = (**(code **)(*piVar5 + 0x2c))(piVar5);
if (cVar2 == '\0') {
local_90 = 0.0;
}
else {
if (((piVar3 != (int *)0x0) &&
((iVar12 = (**(code **)(*piVar3 + 0x4f4))(piVar3,local_5c), iVar12 == 3 ||
(*(float *)(gpGlobals + 0xc) <= *(float *)(pCVar6 + 0x254))))) ||
(uVar9 = (**(code **)(*piVar5 + 0x50))(piVar5), (uVar9 & 4) != 0)) {
local_90 = 1.4013e-45;
}
else {
lVar13 = (longdouble)(**(code **)(*piVar5 + 0x78))(piVar5);
if ((500.0 <= (float)lVar13) &&
(pCVar8 = (CBaseEntity *)CBaseEntity::GetGroundEntity(param_2), pCVar6 != pCVar8)) {
local_a1 = (vphysics_objectstress_t)0x1;
}
local_90 = (float)(local_44[3] + -1);
if ((int)local_90 < 2) {
local_90 = (float)local_44[3];
}
else {
pCVar8 = *(CBaseEntity **)(local_44[0] + (int)local_90 * 4);
while (pCVar8 != local_5c) {
local_90 = (float)((int)local_90 + -1);
if (local_90 == 1.4013e-45) {
local_90 = (float)local_44[3];
goto LAB_0078b7ff;
}
pCVar8 = *(CBaseEntity **)(local_44[0] + (int)local_90 * 4);
}
if (local_90 != (float)local_44[3]) goto LAB_0078b05e;
}
LAB_0078b7ff:
CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)local_44,local_44[3]
,&local_5c);
CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
((CUtlVector<Vector,CUtlMemory<Vector,int>> *)local_30,local_30[3],
(Vector *)&vec3_origin);
if (local_90 == 0.0) goto LAB_0078b0a8;
}
LAB_0078b05e:
if ((param_2[0x186] != (CBaseEntity)0x6) && (pCVar6[0x186] != (CBaseEntity)0x6)) {
iVar12 = (**(code **)(*piVar5 + 0x120))(piVar5);
if (iVar12 != 0) {
piVar5 = (int *)(**(code **)(*piVar5 + 0x120))(piVar5);
cVar2 = (**(code **)(*piVar5 + 0x24))(piVar5);
if (cVar2 != '\0') goto LAB_0078b0a8;
}
local_94 = 0.0;
}
}
LAB_0078b0a8:
(**(code **)(*piVar4 + 0x18))(piVar4,&local_50);
pfVar11 = (float *)(local_30[0] + (int)local_90 * 0xc);
pfVar11[1] = local_4c * local_94 + pfVar11[1];
pfVar11[2] = local_48 * local_94 + pfVar11[2];
*pfVar11 = local_94 * (float)local_50 + *pfVar11;
}
(**(code **)(*piVar4 + 0x34))(piVar4);
}
}
(**(code **)(*(int *)param_1 + 0x148))(param_1,piVar4);
local_8c[1] = DAT_01053d4c;
local_74[0] = vec3_origin;
*(undefined4 *)(local_30[0] + 0xc) = 0;
local_8c[2] = DAT_01053d50;
*(undefined4 *)(local_30[0] + 0x10) = 0;
*(undefined4 *)(local_30[0] + 0x14) = 0;
local_8c[0] = local_74[0];
iVar12 = local_44[3] + -1;
local_8c[3] = local_74[0];
local_8c[4] = DAT_01053d4c;
local_8c[5] = DAT_01053d50;
if (iVar12 < 0) {
local_90 = 0.0;
}
else {
local_90 = 0.0;
pfVar11 = (float *)(local_30[0] + iVar12 * 0xc);
do {
iVar7 = 0;
local_90 = local_90 +
SQRT(pfVar11[1] * pfVar11[1] + *pfVar11 * *pfVar11 + pfVar11[2] * pfVar11[2]);
do {
fVar14 = pfVar11[iVar7];
if (fVar14 < 0.0) {
local_8c[iVar7] = local_8c[iVar7] - fVar14;
}
else {
local_8c[iVar7 + 3] = fVar14 + local_8c[iVar7 + 3];
}
iVar7 = iVar7 + 1;
} while (iVar7 != 3);
iVar12 = iVar12 + -1;
pfVar11 = pfVar11 + -3;
} while (iVar12 != -1);
}
local_68[0] = local_74[0];
local_74[1] = DAT_01053d4c;
local_74[2] = DAT_01053d50;
local_68[1] = DAT_01053d4c;
local_68[2] = DAT_01053d50;
iVar12 = 0;
do {
fVar14 = local_8c[iVar12];
fVar15 = local_8c[iVar12 + 3];
if (fVar15 <= fVar14) {
local_68[iVar12] = fVar15;
local_8c[iVar12 + 6] = fVar14 - fVar15;
}
else {
local_68[iVar12] = fVar14;
local_8c[iVar12 + 6] = fVar15 - fVar14;
}
iVar12 = iVar12 + 1;
} while (iVar12 != 3);
(**(code **)(*physenv + 0x14))(physenv,&local_5c);
fVar14 = SQRT(local_58 * local_58 + (float)local_5c * (float)local_5c + local_54 * local_54);
if ((param_2[0x186] == (CBaseEntity)0x6) ||
(cVar2 = (**(code **)(*(int *)param_1 + 0x2c))(param_1), cVar2 == '\0')) {
local_98 = local_68[2];
}
else {
local_50 = (CBaseEntity *)0x0;
local_4c = 0.0;
local_48 = 0.0;
/* try { // try from 0078b396 to 0078b518 has its CatchHandler @ 0078ba33 */
iVar12 = (**(code **)(*(int *)param_1 + 0x120))(param_1);
if (iVar12 == 0) {
/* try { // try from 0078b981 to 0078b9c5 has its CatchHandler @ 0078ba33 */
uVar9 = (**(code **)(*(int *)param_1 + 0x60))(param_1);
if ((((uVar9 & 0x2000) != 0) &&
(cVar2 = (**(code **)(*(int *)param_2 + 0x16c))(param_2), cVar2 != '\0')) &&
(piVar3 = *(int **)(param_2 + 0x1dd4), piVar3 != (int *)0x0)) {
(**(code **)(*piVar3 + 0x30))(piVar3,&local_50);
}
}
else {
piVar3 = (int *)(**(code **)(*(int *)param_1 + 0x120))(param_1);
(**(code **)(*piVar3 + 0x28))(piVar3,&local_50);
}
fVar15 = (float)local_50 * (float)local_50;
fVar17 = local_48 * local_48;
fVar16 = local_4c * local_4c;
lVar13 = (longdouble)(**(code **)(*physenv + 0x94))(physenv);
fVar15 = (SQRT(fVar15 + fVar17 + fVar16) * fVar1) / (float)lVar13;
if ((fVar15 <= 0.0) ||
(fVar16 = SQRT(local_74[0] * local_74[0] + local_74[1] * local_74[1] +
local_74[2] * local_74[2]), fVar15 <= fVar16)) {
local_98 = local_68[2];
}
else {
fVar16 = 1.0 - fVar16 / fVar15;
fVar17 = fVar16 * local_74[0];
fVar15 = fVar16 * local_74[1];
fVar16 = fVar16 * local_74[2];
local_74[0] = local_74[0] + fVar17;
local_74[1] = local_74[1] + fVar15;
local_74[2] = local_74[2] + fVar16;
fVar15 = SQRT(fVar15 * fVar15 + fVar17 * fVar17 + fVar16 * fVar16);
local_90 = local_90 - fVar15;
lVar13 = (longdouble)VectorNormalize((Vector *)local_68);
fVar15 = (float)lVar13 - fVar15;
if (fVar15 <= 0.0) {
fVar15 = 0.0;
}
local_98 = local_68[2] * fVar15;
local_68[1] = local_68[1] * fVar15;
local_68[0] = fVar15 * local_68[0];
}
}
local_68[2] = 1.0;
if (0.0 < fVar14) {
local_68[2] = 1.0 / fVar14;
}
local_74[0] = local_74[0] * local_68[2];
local_74[1] = local_74[1] * local_68[2];
local_74[2] = local_74[2] * local_68[2];
local_90 = local_90 * local_68[2];
local_68[0] = local_68[0] * local_68[2];
local_68[1] = local_68[1] * local_68[2];
local_68[2] = local_68[2] * local_98;
/* try { // try from 0078b60d to 0078b923 has its CatchHandler @ 0078b9e3 */
cVar2 = (**(code **)(*(int *)param_1 + 0x2c))(param_1);
fVar15 = local_74[1];
fVar14 = local_74[0];
if (cVar2 == '\0') {
local_74[0] = 0.0;
local_68[0] = fVar14;
local_74[1] = 0.0;
local_68[1] = fVar15;
local_68[2] = local_74[2];
local_74[2] = 0.0;
cVar2 = (**(code **)(*(int *)param_1 + 8))(param_1);
if (cVar2 == '\0') {
local_90 = local_90 + fVar1;
}
}
else if (fVar1 < local_90) {
local_90 = (local_90 - fVar1) * 0.5 + fVar1;
}
if (param_3 != (vphysics_objectstress_t *)0x0) {
param_3[8] = (vphysics_objectstress_t)(2 < local_44[3]);
*(float *)param_3 =
SQRT(local_74[1] * local_74[1] + local_74[2] * local_74[2] + local_74[0] * local_74[0]);
*(float *)(param_3 + 4) =
SQRT(local_68[1] * local_68[1] + local_68[2] * local_68[2] + local_68[0] * local_68[0]);
param_3[9] = local_a1;
}
local_30[3] = 0;
CUtlMemory<Vector,int>::Purge((CUtlMemory<Vector,int> *)local_30);
local_30[4] = local_30[0];
CUtlMemory<Vector,int>::Purge((CUtlMemory<Vector,int> *)local_30);
local_44[3] = 0;
CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)local_44);
local_44[4] = local_44[0];
CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)local_44);
return (longdouble)local_90;
}
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.