CalculatePhysicsImpactDamage
0x0078a4a0 · 2367 bytes · __cdecl
_Z28CalculatePhysicsImpactDamageiP21gamevcollisionevent_tRK19impactdamagetable_tfbRib
Decompiled
undefined (7 params)
/* CalculatePhysicsImpactDamage(int, gamevcollisionevent_t*, impactdamagetable_t const&, float,
bool, int&, bool) */
longdouble
CalculatePhysicsImpactDamage
(int param_1,gamevcollisionevent_t *param_2,impactdamagetable_t *param_3,float param_4,
bool param_5,int *param_6,bool param_7)
{
gamevcollisionevent_t *pgVar1;
gamevcollisionevent_t *pgVar2;
gamevcollisionevent_t *pgVar3;
gamevcollisionevent_t *pgVar4;
float fVar5;
float fVar6;
code *pcVar7;
int iVar8;
char cVar9;
uint uVar10;
int iVar11;
int *piVar12;
uint uVar13;
int *piVar14;
int iVar15;
longdouble lVar16;
float fVar17;
float fVar18;
float fVar19;
float fVar20;
float local_1038;
float local_1030;
float local_102c;
float local_1028;
float local_101c [1027];
*param_6 = 1;
uVar13 = (uint)(param_1 == 0);
pgVar1 = param_2 + uVar13 * 4;
if (((*(int **)pgVar1 != (int *)0x0) && (*(int *)(param_2 + 0x68) != *(int *)(param_2 + 0x6c))) &&
((uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))(), (uVar10 & 0x800) == 0 ||
((cVar9 = (**(code **)(**(int **)(param_2 + param_1 * 4 + 0x68) + 0x140))(), cVar9 == '\0' &&
(cVar9 = (**(code **)(**(int **)(param_2 + param_1 * 4 + 0x68) + 0x16c))(), cVar9 == '\0'))))
)) {
uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
if (((uVar10 & 8) != 0) &&
(cVar9 = (**(code **)(**(int **)(param_2 + param_1 * 4 + 0x68) + 0x16c))(), cVar9 != '\0')) {
(**(code **)(**(int **)pgVar1 + 0xe0))();
}
uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
if (((uVar10 & 0x200) != 0) &&
((*(byte *)(*(int *)(param_2 + param_1 * 4 + 0x68) + 0x14f) & 8) == 0)) {
*param_6 = *param_6 | 0x4000000;
return (longdouble)1000.0;
}
if (((0.0 < param_4) &&
(uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))(), (uVar10 & 0x402) == 0)) &&
((param_7 || (uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))(), (uVar10 & 4) == 0)))) {
uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
if ((uVar10 & 0x10) != 0) {
iVar15 = 0;
iVar11 = (**(code **)(**(int **)(pgVar1 + 0x68) + 0x2b8))();
if (0 < iVar11) {
do {
uVar10 = (**(code **)(*(int *)local_101c[iVar15] + 0x50))();
if ((uVar10 & 0x402) != 0) goto LAB_0078a5f0;
iVar15 = iVar15 + 1;
} while (iVar15 != iVar11);
}
}
pgVar2 = param_2 + param_1 * 4;
uVar10 = (**(code **)(**(int **)pgVar2 + 0x50))();
if ((uVar10 & 4) != 0) {
cVar9 = (**(code **)(**(int **)(pgVar1 + 0x68) + 0x16c))();
if (cVar9 != '\0') goto LAB_0078a5f0;
param_5 = false;
}
pgVar3 = param_2 + uVar13 * 0xc + 0x20;
fVar17 = *(float *)pgVar3;
fVar19 = *(float *)(pgVar3 + 4);
fVar18 = *(float *)(pgVar3 + 8);
uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
local_1030 = 0.0;
if ((uVar10 & 1) != 0) {
pgVar4 = param_2 + uVar13 * 0xc + 0x50;
local_1030 = *(float *)(pgVar4 + 4) * *(float *)(pgVar4 + 4) +
*(float *)(pgVar4 + 8) * *(float *)(pgVar4 + 8) +
*(float *)pgVar4 * *(float *)pgVar4;
}
lVar16 = (longdouble)(**(code **)(**(int **)pgVar1 + 0x78))();
local_102c = (float)lVar16;
uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
if (((uVar10 & 4) != 0) && (piVar12 = (int *)UTIL_GetLocalPlayer(), piVar12 != (int *)0x0)) {
lVar16 = (longdouble)(**(code **)(*piVar12 + 0x6f4))();
local_102c = (float)lVar16;
}
if ((*(int *)(pgVar1 + 0x68) != 0) &&
(uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))(), (uVar10 & 0x10) != 0)) {
lVar16 = (longdouble)PhysGetEntityMass(*(CBaseEntity **)(pgVar1 + 0x68));
local_102c = (float)lVar16;
}
uVar10 = (**(code **)(**(int **)pgVar1 + 0x50))();
if ((uVar10 & 0x20) != 0) {
if (param_4 <= 2.0) {
param_4 = 2.0;
}
local_102c = *(float *)(param_3 + 0x28);
}
if ((param_5 != false) ||
(((*(float *)(param_3 + 0x18) <= local_102c &&
((fVar17 = fVar19 * fVar19 + fVar17 * fVar17 + fVar18 * fVar18,
*(float *)(param_3 + 0x1c) <= local_102c || (*(float *)(param_3 + 0x24) <= fVar17)))) &&
((*(float *)(param_3 + 0x10) <= fVar17 || (*(float *)(param_3 + 0x14) <= local_1030))))))
{
cVar9 = CBaseEntity::IsFloating(*(CBaseEntity **)(pgVar2 + 0x68));
if (((cVar9 != '\0') && (*(int *)(pgVar1 + 0x68) != g_WorldEntity)) && (param_4 <= 3.0)) {
param_4 = 3.0;
}
if (*(float *)(param_3 + 0x14) <= local_1030 && local_1030 != *(float *)(param_3 + 0x14)) {
(**(code **)(**(int **)pgVar1 + 0x80))();
pgVar4 = param_2 + uVar13 * 0xc + 0x50;
lVar16 = (longdouble)
ReadDamageTable(*(impactentry_t **)(param_3 + 4),*(int *)(param_3 + 0xc),
(ABS(*(float *)(pgVar4 + 4) * local_101c[1]) +
ABS(*(float *)pgVar4 * local_101c[0]) +
ABS(*(float *)(pgVar4 + 8) * local_101c[2])) * param_4,false);
local_1038 = (float)lVar16;
piVar12 = (int *)&stack0xffffefa0;
if (0.0 < local_1038) {
*param_6 = *param_6 | 4;
piVar12 = (int *)&stack0xffffefa0;
}
}
else {
local_1038 = 0.0;
piVar12 = (int *)&stack0xffffefa4;
}
iVar11 = param_1 * 0xc;
pgVar4 = param_2 + iVar11 + 0x20;
fVar17 = *(float *)pgVar4;
fVar19 = *(float *)(pgVar4 + 4);
fVar18 = *(float *)(pgVar4 + 8);
fVar20 = *(float *)(param_2 + iVar11 + 0x3c);
fVar5 = *(float *)(param_2 + iVar11 + 0x40);
fVar6 = *(float *)(param_2 + iVar11 + 0x38);
iVar11 = **(int **)pgVar2;
*piVar12 = (int)*(int **)pgVar2;
fVar17 = SQRT(fVar17 * fVar17 + fVar19 * fVar19 + fVar18 * fVar18) -
SQRT(fVar6 * fVar6 + fVar20 * fVar20 + fVar5 * fVar5);
pcVar7 = *(code **)(iVar11 + 0x78);
piVar12[-1] = 0x78a914;
lVar16 = (longdouble)(*pcVar7)();
if ((fVar17 <= 0.0) || (fVar19 = 0.0, *(float *)(param_3 + 0x34) <= fVar17)) {
fVar19 = fVar17 * fVar17 * (float)lVar16;
}
iVar11 = uVar13 * 0xc;
fVar18 = SQRT(*(float *)(pgVar3 + 8) * *(float *)(pgVar3 + 8) +
*(float *)(pgVar3 + 4) * *(float *)(pgVar3 + 4) +
*(float *)pgVar3 * *(float *)pgVar3) -
SQRT(*(float *)(param_2 + iVar11 + 0x3c) * *(float *)(param_2 + iVar11 + 0x3c) +
*(float *)(param_2 + iVar11 + 0x38) * *(float *)(param_2 + iVar11 + 0x38) +
*(float *)(param_2 + iVar11 + 0x40) * *(float *)(param_2 + iVar11 + 0x40));
fVar17 = fVar18 * fVar18 * local_102c;
if (*(float *)(param_3 + 0x28) <= local_102c) {
fVar17 = fVar17 * *(float *)(param_3 + 0x2c);
fVar20 = *(float *)(param_2 + iVar11 + 0x28) - *(float *)(param_2 + iVar11 + 0x40);
if (((0.0 < fVar18) && (fVar20 < 0.0)) && (*(float *)(param_2 + iVar11 + 0x28) < 0.0)) {
fVar18 = ABS(fVar20 / fVar18);
fVar17 = fVar17 * ((*(float *)(param_3 + 0x30) * fVar18 - fVar18) + 1.0);
}
}
iVar11 = **(int **)pgVar2;
*piVar12 = (int)*(int **)pgVar2;
pcVar7 = *(code **)(iVar11 + 0x7c);
piVar12[-1] = 0x78aa46;
lVar16 = (longdouble)(*pcVar7)();
local_1028 = (float)lVar16;
iVar11 = **(int **)pgVar2;
*piVar12 = (int)*(int **)pgVar2;
pcVar7 = *(code **)(iVar11 + 0x2c);
piVar12[-1] = 0x78aa56;
cVar9 = (*pcVar7)();
iVar11 = **(int **)pgVar2;
*piVar12 = (int)*(int **)pgVar2;
if (cVar9 == '\0') {
pcVar7 = *(code **)(iVar11 + 0x78);
piVar12[-1] = 0x78aa68;
lVar16 = (longdouble)(*pcVar7)();
local_1028 = 1.0 / (float)lVar16;
}
else {
pcVar7 = *(code **)(iVar11 + 0x50);
piVar12[-1] = 0x78ac33;
uVar13 = (*pcVar7)();
if ((uVar13 & 4) != 0) {
iVar11 = 0;
if (*(int *)(gpGlobals + 0x14) < 2) {
piVar12[-1] = 0x78adbf;
piVar14 = (int *)UTIL_GetLocalPlayer();
if (piVar14 != (int *)0x0) {
iVar11 = *(int *)pgVar2;
iVar15 = *piVar14;
*piVar12 = (int)piVar14;
piVar12[1] = iVar11;
pcVar7 = *(code **)(iVar15 + 0x6f4);
piVar12[-1] = 0x78add8;
lVar16 = (longdouble)(*pcVar7)();
if (0.0 < (float)lVar16) {
local_1028 = 1.0 / (float)lVar16;
}
}
}
else {
do {
iVar11 = iVar11 + 1;
*piVar12 = iVar11;
piVar12[-1] = 0x78ac69;
piVar14 = (int *)UTIL_PlayerByIndex(*piVar12);
if (piVar14 != (int *)0x0) {
iVar15 = *(int *)pgVar2;
iVar8 = *piVar14;
*piVar12 = (int)piVar14;
piVar12[1] = iVar15;
pcVar7 = *(code **)(iVar8 + 0x6f4);
piVar12[-1] = 0x78ac7e;
lVar16 = (longdouble)(*pcVar7)();
if (0.0 < (float)lVar16) {
local_1028 = 1.0 / (float)lVar16;
break;
}
}
} while (iVar11 < *(int *)(gpGlobals + 0x14));
}
}
}
piVar12[3] = 0;
piVar12[2] = (int)((fVar17 + fVar19) * param_4 * local_1028);
piVar12[1] = *(int *)(param_3 + 8);
*piVar12 = *(undefined4 *)param_3;
piVar12[-1] = 0x78aac4;
lVar16 = (longdouble)
ReadDamageTable((impactentry_t *)*piVar12,piVar12[1],(float)piVar12[2],
SUB41(piVar12[3],0));
iVar11 = **(int **)pgVar1;
*piVar12 = (int)*(int **)pgVar1;
local_1038 = (float)lVar16 + local_1038;
pcVar7 = *(code **)(iVar11 + 8);
piVar12[-1] = 0x78aaec;
cVar9 = (*pcVar7)();
if (cVar9 != '\0') {
return (longdouble)local_1038;
}
if (*(float *)(param_3 + 0x1c) <= local_102c) {
return (longdouble)local_1038;
}
fVar17 = *(float *)(param_3 + 0x20);
if (0.0 < fVar17) {
if (fVar17 < local_1038) {
return (longdouble)fVar17;
}
if (local_1038 <= 0.0) {
local_1038 = 0.0;
}
}
return (longdouble)local_1038;
}
}
}
LAB_0078a5f0:
return (longdouble)0;
}
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.