L L4D2node

CGrenadeLauncher_Projectile::Explode

0x0053b450 · 3377 bytes · __thiscall

_ZN27CGrenadeLauncher_Projectile7ExplodeEP10CGameTracei

Decompiled

undefined (3 params)

/* CGrenadeLauncher_Projectile::Explode(CGameTrace*, int) */

void __thiscall
CGrenadeLauncher_Projectile::Explode
          (CGrenadeLauncher_Projectile *this,CGameTrace *param_1,int param_2)

{
  CBaseEdict *this_00;
  float fVar1;
  float fVar2;
  float fVar3;
  uint uVar4;
  int iVar5;
  int iVar6;
  CBaseEntity *this_01;
  ushort uVar7;
  CBaseEntity *pCVar8;
  float fVar9;
  float fVar10;
  undefined4 uVar11;
  float fVar12;
  undefined4 uVar13;
  undefined4 uVar14;
  undefined4 uVar15;
  CTakeDamageInfo *local_1c8;
  undefined1 local_1c4 [16];
  float local_1b4;
  float local_1b0;
  float local_1ac;
  float local_1a8;
  undefined4 local_1a4;
  undefined4 local_1a0;
  undefined4 local_19c;
  undefined4 local_198;
  undefined4 local_194;
  Vector local_190 [12];
  float local_184;
  float local_180;
  float local_17c;
  float local_164;
  short local_150;
  undefined4 local_13c;
  undefined4 local_138;
  undefined4 local_134;
  float local_130;
  undefined4 local_12c;
  undefined4 local_128;
  undefined4 local_f0;
  float local_dc;
  float local_d8;
  float local_d4;
  undefined4 local_d0;
  float local_cc;
  float local_c8;
  float local_c4;
  undefined4 local_c0;
  undefined4 local_bc;
  undefined4 local_b8;
  undefined4 local_b4;
  undefined4 local_b0;
  undefined4 local_ac;
  undefined4 local_a8;
  undefined4 local_a4;
  float local_a0;
  undefined4 local_9c;
  undefined4 local_98;
  undefined2 local_94;
  undefined4 local_90;
  undefined4 local_8c;
  undefined4 local_88;
  undefined1 local_84;
  undefined1 local_83;
  float local_7c;
  float local_78;
  float local_74;
  undefined4 local_70;
  undefined4 local_6c;
  undefined4 local_68;
  undefined4 local_64;
  undefined4 local_5c;
  undefined4 local_58;
  undefined4 local_54;
  undefined4 local_4c;
  undefined4 local_48;
  float local_44;
  undefined4 local_3c;
  undefined1 local_38;
  undefined1 local_37;
  undefined4 local_30;
  
  if (((byte)this[0x14d] & 8) != 0) {
    CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
  }
  local_1b4 = *(float *)(this + 0x2e0);
  local_6c = 0;
  fVar9 = *(float *)(this + 0x2e0);
  local_68 = 0;
  fVar10 = *(float *)(this + 0x2e4);
  local_64 = 0xc3000000;
  fVar12 = *(float *)(this + 0x2e8);
  local_1b0 = *(float *)(this + 0x2e4);
  local_1ac = *(float *)(this + 0x2e8);
  local_37 = 1;
  local_44 = 0.0;
  local_48 = 0;
  local_4c = 0;
  local_3c = 0;
  local_38 = 1;
  local_54 = 0;
  local_58 = 0;
  local_5c = 0;
  local_7c = fVar9;
  local_78 = fVar10;
  local_74 = fVar12;
  CTraceFilterSimple::CTraceFilterSimple
            ((CTraceFilterSimple *)&local_dc,(IHandleEntity *)this,0,
             (_func_bool_IHandleEntity_ptr_int *)0x0);
  (**(code **)(*enginetrace + 0x14))
            (enginetrace,(CTakeDamageInfo *)&local_7c,0x600400b,&local_dc,local_190);
  if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
    DebugDrawLine(local_190,(Vector *)&local_184,0xff,0,0,true,-1.0);
  }
  uVar4 = (**(code **)*enginetrace)(enginetrace,(Vector *)&local_184,0x4030,0);
  if ((uVar4 & 0x30) == 0) {
    fVar1 = fVar9;
    fVar2 = fVar10;
    fVar3 = fVar12;
    if ((((1.0 <= local_164) ||
         (iVar5 = (**(code **)(*physprops + 0x18))(physprops,(int)local_150), iVar5 == 0)) ||
        (uVar7 = *(short *)(iVar5 + 0x4c) - 0x44, fVar9 = local_184, fVar10 = local_180,
        fVar12 = local_17c, fVar1 = local_1b4, fVar2 = local_1b0, fVar3 = local_1ac, 0xb < uVar7))
       || ((1 << ((byte)uVar7 & 0x1f) & 0x881U) == 0)) {
      local_1ac = fVar3;
      local_1b0 = fVar2;
      local_1b4 = fVar1;
      DispatchParticleEffect
                ("weapon_grenadelauncher",fVar9,fVar10,fVar12,vec3_angle,DAT_01053d40,DAT_01053d44,0
                 ,0,0xffffffff);
    }
    else {
      DispatchParticleEffect
                ("weapon_grenadelauncher_dirt",local_184,local_180,local_17c,vec3_angle,DAT_01053d40
                 ,DAT_01053d44,0,0,0xffffffff);
    }
  }
  else {
    local_dc = local_184;
    local_cc = fVar9 - local_184;
    local_d8 = local_180;
    local_c8 = fVar10 - local_180;
    local_d4 = local_17c;
    local_c4 = (512.0 - local_17c) + fVar12;
    local_9c = 0;
    local_a4 = 0;
    local_a8 = 0;
    local_ac = 0;
    local_b4 = 0;
    local_b8 = 0;
    local_bc = 0;
    local_98._0_2_ =
         CONCAT11(local_c8 * local_c8 + local_cc * local_cc + local_c4 * local_c4 != 0.0,1);
    CTraceFilterSimple::CTraceFilterSimple
              ((CTraceFilterSimple *)&local_13c,(IHandleEntity *)this,0,
               (_func_bool_IHandleEntity_ptr_int *)0x0);
    (**(code **)(*enginetrace + 0x14))
              (enginetrace,&local_dc,0x30,(CTraceFilterSimple *)&local_13c,
               (CTakeDamageInfo *)&local_7c);
    if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
      DebugDrawLine((Vector *)&local_7c,(Vector *)&local_70,0xff,0,0,true,-1.0);
    }
    uVar13 = DAT_01053d44;
    uVar11 = vec3_angle;
    if (local_48._2_1_ == '\0') {
      if ((local_44 <= 0.0) || (1.0 <= local_44)) {
        DispatchParticleEffect
                  ("weapon_grenadelauncher_water",local_70,local_6c,local_68,vec3_angle,DAT_01053d40
                   ,DAT_01053d44,0,0,0xffffffff);
        DispatchParticleEffect
                  ("weapon_grenadelauncher_water_splash",local_70,local_6c,local_68,vec3_angle,
                   DAT_01053d40,uVar13,0,0,0xffffffff);
      }
      else {
        DispatchParticleEffect
                  ("weapon_grenadelauncher_water",local_7c,local_78,local_74,vec3_angle,DAT_01053d40
                   ,DAT_01053d44,0,0,0xffffffff);
        DispatchParticleEffect
                  ("weapon_grenadelauncher_water_splash",local_7c,local_78,local_74,uVar11,
                   DAT_01053d40,DAT_01053d44,0,0,0xffffffff);
      }
    }
    else {
      DispatchParticleEffect
                ("weapon_grenadelauncher_water",local_184,local_180,local_17c,vec3_angle,
                 DAT_01053d40,DAT_01053d44,0,0,0xffffffff);
    }
  }
  local_1c8 = (CTakeDamageInfo *)&local_13c;
  *(undefined4 *)(this + 0x260) = 0;
  CBaseEntity::DispatchUpdateTransmitState((CBaseEntity *)this);
  iVar5 = (**(code **)(*soundemitterbase + 0x88))(soundemitterbase,&DAT_00d539c2);
  if (iVar5 != *(int *)(this + 0xf4)) {
    if (this[0x6c] == (CGrenadeLauncher_Projectile)0x0) {
      this_00 = *(CBaseEdict **)(this + 0x30);
      if (this_00 != (CBaseEdict *)0x0) {
        *(uint *)this_00 = *(uint *)this_00 | 0x101;
        iVar6 = CBaseEdict::GetChangeAccessor(this_00);
        *(undefined2 *)(iVar6 + 2) = 0;
      }
    }
    else {
      this[0x70] = (CGrenadeLauncher_Projectile)((byte)this[0x70] | 1);
    }
    *(int *)(this + 0xf4) = iVar5;
  }
  CCollisionProperty::SetSolidFlags
            ((CCollisionProperty *)(this + 0x194),(uint)(*(ushort *)(this + 0x1b4) | 4));
  if (this[0x105] != (CGrenadeLauncher_Projectile)0x0) {
    (**(code **)(*(int *)this + 0x224))(this,this + 0x105);
    this[0x105] = (CGrenadeLauncher_Projectile)0x0;
  }
  if (*(float *)(param_1 + 0x2c) != 1.0) {
    local_78 = *(float *)(param_1 + 0x1c) * 0.6 + *(float *)(param_1 + 0x10);
    local_74 = *(float *)(param_1 + 0x20) * 0.6 + *(float *)(param_1 + 0x14);
    local_7c = *(float *)(param_1 + 0x18) * 0.6 + *(float *)(param_1 + 0xc);
    CBaseEntity::SetAbsOrigin((CBaseEntity *)this,(Vector *)&local_7c);
  }
  if (((byte)this[0x14d] & 8) != 0) {
    CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
  }
  CSoundEnt::InsertSound
            (1,(Vector *)(this + 0x2e0),0x400,3.0,(CBaseEntity *)0x0,0,(CBaseEntity *)0x0);
  CBaseEntity::EmitSound((CBaseEntity *)this,"GrenadeLauncher.Explode",0.0,(float *)0x0);
  if (((byte)this[0x14d] & 8) != 0) {
    CBaseEntity::CalcAbsolutePosition((CBaseEntity *)this);
  }
  local_1a8 = *(float *)(this + 0x2e0);
  local_1a4 = *(undefined4 *)(this + 0x2e4);
  local_1a0 = *(undefined4 *)(this + 0x2e8);
  this_01 = (CBaseEntity *)CBaseGrenade::GetThrower((CBaseGrenade *)this);
  if (this_01 == (CBaseEntity *)0x0) {
    pCVar8 = (CBaseEntity *)&vec3_origin;
  }
  else {
    if (((byte)this_01[0x14d] & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition(this_01);
    }
    pCVar8 = this_01 + 0x2e0;
  }
  local_19c = *(undefined4 *)pCVar8;
  local_198 = *(undefined4 *)(pCVar8 + 4);
  local_194 = *(undefined4 *)(pCVar8 + 8);
  CTakeDamageInfo::CTakeDamageInfo
            (local_1c8,(CBaseEntity *)this,this_01,(Vector *)&vec3_origin,(Vector *)&local_1a8,
             *(float *)(this + 0x1a50),param_2 | 0x1000000,0,(Vector *)&local_19c);
  local_130 = local_1a8;
  local_12c = local_1a4;
  local_128 = local_1a0;
  local_13c = *(undefined4 *)(grenadelauncher_force_kill._28_4_ + 0x2c);
  local_138 = 0;
  local_134 = 0;
  local_f0 = 1;
  RadiusDamage(local_1c8,(Vector *)&local_1a8,*(float *)(grenadelauncher_radius_kill._28_4_ + 0x2c),
               0,(CBaseEntity *)0x0);
  local_84 = 0;
  local_dc = local_1a8;
  local_94 = 0;
  local_d8 = (float)local_1a4;
  local_d0 = 0;
  local_cc = 0.0;
  local_c8 = 0.0;
  local_c4 = 0.0;
  local_c0 = 0;
  local_bc = 0;
  local_b8 = 0;
  local_b4 = 0;
  local_b0 = 0;
  local_ac = 0;
  local_a8 = 0;
  local_a4 = 0x3f800000;
  local_98 = 0;
  local_90 = 0;
  local_8c = 0;
  local_88 = 0;
  local_83 = 0;
  local_d4 = (float)local_1a0;
  local_9c = *(undefined4 *)(grenadelauncher_radius_kill._28_4_ + 0x2c);
  local_a0 = *(float *)(grenadelauncher_force_kill._28_4_ + 0x2c) * 0.1;
  DispatchEffect("ExplosionForce",(CEffectData *)&local_dc);
  CTakeDamageInfo::CTakeDamageInfo
            ((CTakeDamageInfo *)&local_7c,(CBaseEntity *)this,this_01,(Vector *)&vec3_origin,
             (Vector *)&local_1a8,1.0,
             (-(uint)((*(uint *)(this + 0x1a7c) & 8) == 0) & 0xfffffff8) + 0x2000008,0,
             (Vector *)&local_19c);
  local_30 = 1;
  RadiusDamage((CTakeDamageInfo *)&local_7c,(Vector *)&local_1a8,
               *(float *)(grenadelauncher_radius_stumble._28_4_ + 0x2c),0,(CBaseEntity *)0x0);
  if (*(int *)(grenadelauncher_show_radius._28_4_ + 0x30) != 0) {
    NDebugOverlay::Sphere
              ((Vector *)&local_1a8,(QAngle *)&vec3_angle,
               *(float *)(grenadelauncher_radius_kill._28_4_ + 0x2c),0,0,0xff,100,false,3.0);
    NDebugOverlay::Sphere
              ((Vector *)&local_1a8,(QAngle *)&vec3_angle,
               *(float *)(grenadelauncher_radius_stumble._28_4_ + 0x2c),0,0xff,0,100,false,3.0);
  }
  UTIL_DecalTrace(param_1,"Scorch");
  uVar15 = 0;
  uVar14 = 0;
  uVar13 = 0;
  CBaseEntity::ThinkSet((_func_void *)local_1c4,(float)this,(char *)CBaseEntity::SUB_Remove);
  uVar11 = 0;
  CBaseEntity::SetNextThink((CBaseEntity *)this,*(float *)(gpGlobals + 0xc),(char *)0x0);
  *(undefined4 *)(this + 0xd8) = 0;
  *(undefined4 *)(this + 0xdc) = 0;
  CCollisionProperty::SetSolid((CCollisionProperty *)(this + 0x194),0,uVar11,uVar13,uVar14,uVar15);
  CBaseEntity::AddEffects((CBaseEntity *)this,0x20);
  CBaseEntity::SetAbsVelocity((CBaseEntity *)this,(Vector *)&vec3_origin);
  return;
}

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)