CPhysExplosion::Explode
0x0079f260 · 2707 bytes · __thiscall
_ZN14CPhysExplosion7ExplodeEP11CBaseEntityS1_
Decompiled
undefined (3 params)
/* CPhysExplosion::Explode(CBaseEntity*, CBaseEntity*) */
void __thiscall
CPhysExplosion::Explode(CPhysExplosion *this,CBaseEntity *param_1,CBaseEntity *param_2)
{
CPhysExplosion CVar1;
char cVar2;
uint uVar3;
int iVar4;
int *piVar5;
float *pfVar6;
code *pcVar7;
int *piVar8;
int *piVar9;
int *piVar10;
longdouble lVar11;
float fVar12;
float fVar13;
float *pfVar14;
float fVar15;
float fVar16;
undefined1 local_14c [28];
float *local_130;
float local_12c;
float local_128;
float *local_124;
float local_120;
float local_11c;
float local_118;
float local_114;
float local_110;
float local_10c;
float local_108;
float local_104;
float local_100;
float local_fc;
float local_f8;
float local_f4;
float local_f0;
float local_ec;
float local_e8;
float local_e4;
float local_e0;
float local_dc;
float local_d8;
float local_d4;
float local_cc;
float local_c8;
float local_c4;
float local_bc;
float local_b8;
float local_b4;
undefined4 local_ac;
undefined4 local_a8;
undefined4 local_a4;
undefined4 local_9c;
undefined4 local_98;
undefined4 local_94;
undefined4 local_8c;
undefined1 local_88;
undefined1 local_87;
float local_7c;
float local_78;
float local_74;
undefined1 local_70 [32];
float local_50;
int *local_30;
piVar10 = (int *)0x0;
piVar5 = (int *)local_14c;
LAB_0079f278:
do {
do {
piVar8 = piVar5;
piVar8[1] = (int)piVar10;
*piVar8 = (int)this;
piVar8[3] = (int)param_2;
piVar8[2] = (int)param_1;
piVar8[-1] = 0x79f292;
piVar10 = (int *)FindEntity((CPhysExplosion *)*piVar8,(CBaseEntity *)piVar8[1],
(CBaseEntity *)piVar8[2],(CBaseEntity *)piVar8[3]);
if (piVar10 == (int *)0x0) {
return;
}
piVar5 = piVar8;
} while ((*(char *)((int)piVar10 + 0x105) == '\0') ||
((*(char *)((int)piVar10 + 0x186) != '\x06' && (piVar10[0x8e] == 0))));
if (((byte)this[0x14d] & 8) != 0) {
*piVar8 = (int)this;
piVar8[-1] = 0x79f758;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar8);
}
local_10c = *(float *)(this + 0x2e0);
local_108 = *(float *)(this + 0x2e4);
local_104 = *(float *)(this + 0x2e8);
iVar4 = *piVar10;
piVar8[3] = 1;
piVar8[2] = (int)&local_10c;
piVar8[1] = (int)piVar10;
*piVar8 = (int)&local_7c;
pcVar7 = *(code **)(iVar4 + 0x244);
piVar8[-1] = 0x79f319;
(*pcVar7)();
local_114 = local_7c;
local_118 = local_78;
local_11c = local_74;
if ((*(uint *)(this + 0x148) & 4) == 0) {
fVar15 = (local_104 - local_74) * (local_104 - local_74);
}
else {
local_104 = local_74;
fVar15 = 0.0;
}
local_110 = 0.0;
local_120 = SQRT((local_10c - local_7c) * (local_10c - local_7c) +
(local_108 - local_78) * (local_108 - local_78) + fVar15);
} while ((*(float *)(this + 0x444) != 0.0) &&
(piVar5 = piVar8 + -1, *(float *)(this + 0x444) < local_120));
if ((*(uint *)(this + 0x148) & 8) != 0) goto LAB_0079f508;
local_124 = &local_cc;
piVar9 = piVar8 + -1;
goto LAB_0079f3fa;
LAB_0079f508:
if (((byte)this[0x14d] & 8) != 0) {
piVar8[-1] = (int)this;
piVar8[-2] = 0x79fb38;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)piVar8[-1]);
}
local_100 = *(float *)(this + 0x2e0);
local_124 = &local_100;
local_fc = *(float *)(this + 0x2e4);
local_f8 = *(float *)(this + 0x2e8);
iVar4 = *piVar10;
piVar8[1] = (int)local_124;
piVar8[2] = 0;
*piVar8 = (int)piVar10;
piVar8[-1] = (int)&local_f4;
pcVar7 = *(code **)(iVar4 + 0x244);
piVar8[-2] = 0x79f566;
(*pcVar7)();
pfVar6 = local_124;
if (local_110 != *(float *)(this + 0x44c)) {
piVar8[-2] = (int)&local_7c;
local_7c = local_f4 - local_100;
local_78 = local_f0 - local_fc;
local_74 = local_ec - local_f8;
piVar8[-3] = 0x79fabf;
VectorNormalize((Vector *)piVar8[-2]);
fVar15 = *(float *)(this + 0x44c);
pfVar6 = local_124;
fVar12 = fVar15 * local_74;
pfVar14 = (float *)(local_7c * fVar15);
fVar13 = local_78 * fVar15;
if (((byte)this[0x14d] & 8) != 0) {
piVar8[-2] = (int)this;
local_130 = local_124;
piVar8[-3] = 0x79fca6;
local_12c = fVar15 * local_74;
local_128 = local_78 * fVar15;
local_124 = (float *)(local_7c * fVar15);
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)piVar8[-2]);
pfVar6 = local_130;
fVar12 = local_12c;
pfVar14 = local_124;
fVar13 = local_128;
}
local_fc = fVar13 + *(float *)(this + 0x2e4);
local_f8 = fVar12 + *(float *)(this + 0x2e8);
local_100 = (float)pfVar14 + *(float *)(this + 0x2e0);
}
iVar4 = *piVar10;
*piVar8 = (int)pfVar6;
piVar8[-2] = (int)&local_e8;
piVar8[1] = 0;
piVar8[-1] = (int)piVar10;
pcVar7 = *(code **)(iVar4 + 0x244);
piVar8[-3] = 0x79f5a5;
(*pcVar7)();
local_124 = &local_dc;
piVar8[-3] = (int)local_124;
*piVar8 = 0;
local_b8 = local_e4 - local_fc;
piVar8[-2] = (int)this;
local_b4 = local_e0 - local_f8;
piVar8[-1] = 0;
local_cc = local_100;
local_bc = local_e8 - local_100;
local_c8 = local_fc;
local_c4 = local_f8;
local_94 = 0;
local_98 = 0;
local_9c = 0;
local_88 = 1;
local_8c = 0;
local_a4 = 0;
local_87 = local_b8 * local_b8 + local_b4 * local_b4 + local_bc * local_bc != local_110;
local_a8 = 0;
local_ac = 0;
piVar8[-4] = 0x79f6ab;
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)piVar8[-3],(IHandleEntity *)piVar8[-2],piVar8[-1],
(_func_bool_IHandleEntity_ptr_int *)*piVar8);
iVar4 = *enginetrace;
piVar8[-3] = (int)enginetrace;
*piVar8 = (int)local_124;
local_124 = &local_cc;
piVar8[1] = (int)&local_7c;
piVar8[-1] = 0x400b;
piVar8[-2] = (int)local_124;
pcVar7 = *(code **)(iVar4 + 0x14);
piVar8[-4] = 0x79f6de;
(*pcVar7)();
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
piVar8[3] = -0x40800000;
piVar8[2] = 1;
piVar8[1] = 0;
*piVar8 = 0;
piVar8[-1] = 0xff;
piVar8[-2] = (int)local_70;
piVar8[-3] = (int)&local_7c;
piVar8[-4] = 0x79f721;
DebugDrawLine((Vector *)piVar8[-3],(Vector *)piVar8[-2],piVar8[-1],*piVar8,piVar8[1],
SUB41(piVar8[2],0),(float)piVar8[3]);
}
local_128 = 1.0;
piVar9 = piVar8 + -3;
if ((1.0 <= local_50) || (piVar5 = piVar8 + -3, piVar9 = piVar8 + -3, piVar10 == local_30)) {
LAB_0079f3fa:
local_128 = 1.0;
fVar15 = *(float *)(this + 0x440);
piVar9[5] = 0;
piVar9[4] = 0x40;
piVar9[2] = (int)this;
piVar9[1] = (int)this;
*piVar9 = (int)&local_7c;
fVar15 = fVar15 - local_120 * 0.4;
if (fVar15 <= 1.0) {
fVar15 = 1.0;
}
piVar9[3] = (int)fVar15;
piVar9[-1] = 0x79f444;
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)*piVar9,(CBaseEntity *)piVar9[1],(CBaseEntity *)piVar9[2],
(float)piVar9[3],piVar9[4],piVar9[5]);
*piVar9 = (int)&local_7c;
piVar9[3] = 0x3f800000;
local_cc = local_114 - local_10c;
piVar9[2] = (int)&local_10c;
local_c8 = local_118 - local_108;
piVar9[1] = (int)local_124;
local_c4 = local_11c - local_104;
piVar9[-1] = 0x79f4b0;
CalculateExplosiveDamageForce
((CTakeDamageInfo *)*piVar9,(Vector *)piVar9[1],(Vector *)piVar9[2],(float)piVar9[3]);
uVar3 = *(uint *)(this + 0x148);
if ((uVar3 & 2) != 0) {
iVar4 = *piVar10;
*piVar9 = (int)piVar10;
pcVar7 = *(code **)(iVar4 + 0x16c);
piVar9[-1] = 0x79f78b;
cVar2 = (*pcVar7)();
if (cVar2 != '\0') {
if (((byte)this[0x14d] & 8) == 0) {
pcVar7 = *(code **)(*piVar10 + 0x244);
}
else {
*piVar9 = (int)this;
piVar9[-1] = 0x79fcd8;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar9);
pcVar7 = *(code **)(*piVar10 + 0x244);
if (((byte)this[0x14d] & 8) != 0) {
*piVar9 = (int)this;
piVar9[-1] = 0x79fcf5;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)*piVar9);
}
}
piVar9[3] = 0;
piVar9[2] = (int)(this + 0x2e0);
piVar9[1] = (int)piVar10;
*piVar9 = (int)local_124;
piVar9[-1] = 0x79f7c9;
(*pcVar7)();
local_e8 = local_cc - *(float *)(this + 0x2e0);
local_e4 = local_c8 - *(float *)(this + 0x2e4);
local_e0 = local_c4 - *(float *)(this + 0x2e8);
piVar9[-1] = (int)&local_e8;
piVar9[-2] = 0x79f822;
lVar11 = (longdouble)VectorNormalize((Vector *)piVar9[-1]);
fVar15 = *(float *)(this + 0x444);
if (fVar15 == fVar15 * 0.75) {
CVar1 = this[0x148];
local_114 = (float)(~-(uint)(fVar15 <= (float)lVar11) & (uint)local_110 |
(uint)local_128 & -(uint)(fVar15 <= (float)lVar11));
}
else {
CVar1 = this[0x148];
local_114 = ((float)lVar11 - fVar15) / (fVar15 * 0.75 - fVar15);
if (local_128 <= local_114) {
local_114 = local_128;
}
if (local_114 <= local_110) {
local_114 = local_110;
}
}
fVar15 = local_114;
fVar12 = (float)lVar11;
if (((byte)CVar1 & 0x10) != 0) {
iVar4 = *random_valve;
piVar9[1] = 0x1e;
*piVar9 = 0xffffffe2;
piVar9[-1] = (int)random_valve;
pcVar7 = *(code **)(iVar4 + 8);
piVar9[-2] = 0x79fbac;
iVar4 = (*pcVar7)();
local_dc = (float)iVar4;
iVar4 = *random_valve;
piVar9[1] = 0x1e;
*piVar9 = 0xffffffe2;
piVar9[-1] = (int)random_valve;
pcVar7 = *(code **)(iVar4 + 8);
piVar9[-2] = 0x79fbd5;
iVar4 = (*pcVar7)();
local_d4 = 0.0;
local_d8 = (float)iVar4;
iVar4 = *piVar10;
piVar9[-1] = (int)piVar10;
pcVar7 = *(code **)(iVar4 + 0x16c);
piVar9[-2] = 0x79fbf6;
cVar2 = (*pcVar7)();
piVar5 = (int *)0x0;
if (cVar2 != '\0') {
piVar5 = piVar10;
}
local_cc = local_dc + *(float *)(this + 0x3a8);
local_c8 = local_d8 + *(float *)(this + 0x3ac);
local_c4 = local_d4 + *(float *)(this + 0x3b0);
*piVar9 = (int)local_124;
piVar9[-1] = (int)piVar5;
piVar9[-2] = 0x79fc57;
CBasePlayer::SnapEyeAngles((CBasePlayer *)piVar9[-1],(QAngle *)*piVar9);
piVar9[-1] = (int)piVar10;
*piVar9 = (int)&local_dc;
piVar9[-2] = 0x79fc69;
CBaseEntity::ViewPunch((CBaseEntity *)piVar9[-1],(QAngle *)*piVar9);
fVar15 = local_114;
fVar12 = local_114;
}
local_114 = fVar12;
fVar12 = *(float *)(this + 0x440);
fVar13 = (local_e8 * fVar12 + local_e8 * fVar12) * fVar15;
fVar16 = (local_e4 * fVar12 + local_e4 * fVar12) * fVar15;
fVar15 = (fVar12 * local_e0 + fVar12 * local_e0) * fVar15;
if ((piVar10[0x54] & 0x800000U) != 0) {
fVar13 = fVar13 + (float)piVar10[0x9a];
fVar16 = fVar16 + (float)piVar10[0x9b];
fVar15 = fVar15 + (float)piVar10[0x9c];
}
if ((local_110 < fVar15) && ((piVar10[0x54] & 1U) != 0)) {
*piVar9 = 0;
piVar9[-1] = (int)piVar10;
piVar9[-2] = 0x79f91d;
local_118 = fVar15;
local_114 = fVar16;
local_110 = fVar13;
CBaseEntity::SetGroundEntity((CBaseEntity *)piVar9[-1],(CBaseEntity *)*piVar9);
if ((*(byte *)((int)piVar10 + 0x14d) & 8) != 0) {
piVar9[-1] = (int)piVar10;
piVar9[-2] = 0x79fd1a;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)piVar9[-1]);
}
local_cc = (float)piVar10[0xb8];
local_c8 = (float)piVar10[0xb9];
local_c4 = (float)piVar10[0xba];
piVar9[-1] = (int)piVar10;
local_c4 = local_128 + local_c4;
*piVar9 = (int)local_124;
piVar9[-2] = 0x79f9a8;
CBaseEntity::SetAbsOrigin((CBaseEntity *)piVar9[-1],(Vector *)*piVar9);
fVar15 = local_118;
fVar13 = local_110;
fVar16 = local_114;
}
if (((fVar13 != (float)piVar10[0x9a]) || (fVar16 != (float)piVar10[0x9b])) ||
(fVar15 != (float)piVar10[0x9c])) {
iVar4 = *piVar10;
*piVar9 = (int)(piVar10 + 0x9a);
piVar9[-1] = (int)piVar10;
pcVar7 = *(code **)(iVar4 + 0x2fc);
piVar9[-2] = 0x79fa0f;
local_118 = fVar15;
local_114 = fVar16;
local_110 = fVar13;
(*pcVar7)();
piVar10[0x9a] = (int)local_110;
piVar10[0x9b] = (int)local_114;
piVar10[0x9c] = (int)local_118;
}
*piVar9 = 0x800000;
piVar9[-1] = (int)piVar10;
piVar9[-2] = 0x79fa4f;
CBaseEntity::AddFlag((CBaseEntity *)piVar9[-1],*piVar9);
piVar9[1] = (int)this;
piVar9[2] = 0;
*piVar9 = (int)this;
piVar9[-1] = (int)(this + 0x450);
piVar9[-2] = 0x79fa6d;
COutputEvent::FireOutput
((COutputEvent *)piVar9[-1],(CBaseEntity *)*piVar9,(CBaseEntity *)piVar9[1],
(float)piVar9[2]);
piVar5 = piVar9 + -1;
goto LAB_0079f278;
}
uVar3 = *(uint *)(this + 0x148);
}
piVar5 = piVar9;
if ((uVar3 & 1) == 0) {
piVar9[1] = (int)&local_7c;
*piVar9 = (int)piVar10;
piVar9[-1] = 0x79f76c;
CBaseEntity::TakeDamage((CBaseEntity *)*piVar9,(CTakeDamageInfo *)piVar9[1]);
}
else {
iVar4 = *piVar10;
piVar9[1] = (int)&local_7c;
*piVar9 = (int)piVar10;
pcVar7 = *(code **)(iVar4 + 0x2a0);
piVar9[-1] = 0x79f4d5;
(*pcVar7)();
}
}
goto LAB_0079f278;
}
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.