L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)