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 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.