summaryrefslogtreecommitdiff
path: root/game/server/hl1/hl1_grenade_mp5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/hl1/hl1_grenade_mp5.cpp')
-rw-r--r--game/server/hl1/hl1_grenade_mp5.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/game/server/hl1/hl1_grenade_mp5.cpp b/game/server/hl1/hl1_grenade_mp5.cpp
new file mode 100644
index 0000000..9a72c9f
--- /dev/null
+++ b/game/server/hl1/hl1_grenade_mp5.cpp
@@ -0,0 +1,160 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "hl1_grenade_mp5.h"
+#include "hl1mp_weapon_mp5.h"
+#include "soundent.h"
+#include "decals.h"
+#include "shake.h"
+#include "smoke_trail.h"
+#include "vstdlib/random.h"
+#include "engine/IEngineSound.h"
+#include "world.h"
+
+extern short g_sModelIndexFireball;
+extern short g_sModelIndexWExplosion;
+
+extern ConVar sk_plr_dmg_mp5_grenade;
+extern ConVar sk_max_mp5_grenade;
+extern ConVar sk_mp5_grenade_radius;
+
+BEGIN_DATADESC( CGrenadeMP5 )
+ // SR-BUGBUG: These are borked!!!!
+// float m_fSpawnTime;
+
+ // Function pointers
+ DEFINE_ENTITYFUNC( GrenadeMP5Touch ),
+
+ DEFINE_FIELD( m_fSpawnTime, FIELD_TIME ),
+END_DATADESC()
+
+LINK_ENTITY_TO_CLASS( grenade_mp5, CGrenadeMP5 );
+
+void CGrenadeMP5::Spawn( void )
+{
+ Precache( );
+ SetSolid( SOLID_BBOX );
+ SetMoveType( MOVETYPE_FLY );
+ AddFlag( FL_GRENADE );
+
+ SetModel( "models/grenade.mdl" );
+ //UTIL_SetSize(this, Vector(-3, -3, -3), Vector(3, 3, 3));
+ UTIL_SetSize(this, Vector(0, 0, 0), Vector(0, 0, 0));
+
+ SetUse( &CBaseGrenade::DetonateUse );
+ SetTouch( &CGrenadeMP5::GrenadeMP5Touch );
+ SetNextThink( gpGlobals->curtime + 0.1f );
+
+ m_flDamage = sk_plr_dmg_mp5_grenade.GetFloat();
+ m_DmgRadius = sk_mp5_grenade_radius.GetFloat();
+ m_takedamage = DAMAGE_YES;
+ m_bIsLive = true;
+ m_iHealth = 1;
+
+ SetGravity( UTIL_ScaleForGravity( 400 ) ); // use a lower gravity for grenades to make them easier to see
+ SetFriction( 0.8 );
+
+ SetSequence( 0 );
+
+ m_fSpawnTime = gpGlobals->curtime;
+}
+
+
+void CGrenadeMP5::Event_Killed( CBaseEntity *pInflictor, CBaseEntity *pAttacker, float flDamage, int bitsDamageType )
+{
+ Detonate( );
+}
+
+
+void CGrenadeMP5::GrenadeMP5Touch( CBaseEntity *pOther )
+{
+ if ( !pOther->IsSolid() )
+ return;
+
+ // If I'm live go ahead and blow up
+ if (m_bIsLive)
+ {
+ Detonate();
+ }
+ else
+ {
+ // If I'm not live, only blow up if I'm hitting an chacter that
+ // is not the owner of the weapon
+ CBaseCombatCharacter *pBCC = ToBaseCombatCharacter( pOther );
+ if (pBCC && GetThrower() != pBCC)
+ {
+ m_bIsLive = true;
+ Detonate();
+ }
+ }
+}
+
+void CGrenadeMP5::Detonate(void)
+{
+ if (!m_bIsLive)
+ {
+ return;
+ }
+ m_bIsLive = false;
+ m_takedamage = DAMAGE_NO;
+
+ CPASFilter filter( GetAbsOrigin() );
+
+ te->Explosion( filter, 0.0,
+ &GetAbsOrigin(),
+ GetWaterLevel() == 0 ? g_sModelIndexFireball : g_sModelIndexWExplosion,
+ (m_flDamage - 50) * .60,
+ 15,
+ TE_EXPLFLAG_NONE,
+ m_DmgRadius,
+ m_flDamage );
+
+ trace_t tr;
+ tr = CBaseEntity::GetTouchTrace();
+
+ if ( (tr.m_pEnt != GetWorldEntity()) || (tr.hitbox != 0) )
+ {
+ // non-world needs smaller decals
+ UTIL_DecalTrace( &tr, "SmallScorch");
+ }
+ else
+ {
+ UTIL_DecalTrace( &tr, "Scorch" );
+ }
+
+ CSoundEnt::InsertSound ( SOUND_COMBAT, GetAbsOrigin(), BASEGRENADE_EXPLOSION_VOLUME, 3.0 );
+
+ RadiusDamage ( CTakeDamageInfo( this, GetThrower(), m_flDamage, DMG_BLAST ), GetAbsOrigin(), m_flDamage * 2.5, CLASS_NONE, NULL );
+
+ CPASAttenuationFilter filter2( this );
+ EmitSound( filter2, entindex(), "GrenadeMP5.Detonate" );
+
+ if ( GetWaterLevel() == 0 )
+ {
+ int sparkCount = random->RandomInt( 0,3 );
+ QAngle angles;
+ VectorAngles( tr.plane.normal, angles );
+
+ for ( int i = 0; i < sparkCount; i++ )
+ Create( "spark_shower", GetAbsOrigin(), angles, NULL );
+ }
+
+ UTIL_Remove( this );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CGrenadeMP5::Precache( void )
+{
+ BaseClass::Precache();
+
+ PrecacheModel( "models/grenade.mdl" );
+
+ PrecacheScriptSound( "GrenadeMP5.Detonate" );
+}