From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/game/server/basegrenade_concussion.cpp | 131 ++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 mp/src/game/server/basegrenade_concussion.cpp (limited to 'mp/src/game/server/basegrenade_concussion.cpp') diff --git a/mp/src/game/server/basegrenade_concussion.cpp b/mp/src/game/server/basegrenade_concussion.cpp new file mode 100644 index 00000000..3fc3a2f6 --- /dev/null +++ b/mp/src/game/server/basegrenade_concussion.cpp @@ -0,0 +1,131 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "baseentity.h" +#include "basegrenade_shared.h" +#include "soundent.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +class CBaseGrenadeConcussion : public CBaseGrenade +{ + DECLARE_DATADESC(); + +public: + DECLARE_CLASS( CBaseGrenadeConcussion, CBaseGrenade ); + + void Spawn( void ); + void Precache( void ); + void FallThink(void); + void ExplodeConcussion( CBaseEntity *pOther ); + +protected: + static int m_nTrailSprite; +}; + +int CBaseGrenadeConcussion::m_nTrailSprite = 0; + +LINK_ENTITY_TO_CLASS( npc_concussiongrenade, CBaseGrenadeConcussion ); + +BEGIN_DATADESC( CBaseGrenadeConcussion ) + + DEFINE_THINKFUNC( FallThink ), + DEFINE_ENTITYFUNC( ExplodeConcussion ), + +END_DATADESC() + + +void CBaseGrenadeConcussion::FallThink(void) +{ + if (!IsInWorld()) + { + Remove( ); + return; + } + CSoundEnt::InsertSound ( SOUND_DANGER, GetAbsOrigin() + GetAbsVelocity() * 0.5, GetAbsVelocity().Length( ), 0.2 ); + + SetNextThink( gpGlobals->curtime + random->RandomFloat(0.05, 0.1) ); + + if (GetWaterLevel() != 0) + { + SetAbsVelocity( GetAbsVelocity() * 0.5 ); + } + + Vector pos = GetAbsOrigin() + Vector(random->RandomFloat(-4, 4), random->RandomFloat(-4, 4), random->RandomFloat(-4, 4)); + + CPVSFilter filter( GetAbsOrigin() ); + + te->Sprite( filter, 0.0, + &pos, + m_nTrailSprite, + random->RandomFloat(0.5, 0.8), + 200 ); +} + + +// +// Contact grenade, explode when it touches something +// +void CBaseGrenadeConcussion::ExplodeConcussion( CBaseEntity *pOther ) +{ + trace_t tr; + Vector vecSpot;// trace starts here! + + Vector velDir = GetAbsVelocity(); + VectorNormalize( velDir ); + vecSpot = GetAbsOrigin() - velDir * 32; + UTIL_TraceLine( vecSpot, vecSpot + velDir * 64, MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr ); + + Explode( &tr, DMG_BLAST ); +} + + +void CBaseGrenadeConcussion::Spawn( void ) +{ + // point sized, solid, bouncing + SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE ); + SetSolid( SOLID_BBOX ); + SetCollisionGroup( COLLISION_GROUP_PROJECTILE ); + SetModel( "models/weapons/w_grenade.mdl" ); // BUG: wrong model + + UTIL_SetSize(this, vec3_origin, vec3_origin); + + // contact grenades arc lower + SetGravity( UTIL_ScaleForGravity( 400 ) ); // use a lower gravity for grenades to make them easier to see + QAngle angles; + VectorAngles(GetAbsVelocity(), angles ); + SetLocalAngles( angles ); + + m_nRenderFX = kRenderFxGlowShell; + SetRenderColor( 200, 200, 20, 255 ); + + // make NPCs afaid of it while in the air + SetThink( &CBaseGrenadeConcussion::FallThink ); + SetNextThink( gpGlobals->curtime ); + + // Tumble in air + QAngle vecAngVel( random->RandomFloat ( -100, -500 ), 0, 0 ); + SetLocalAngularVelocity( vecAngVel ); + + // Explode on contact + SetTouch( &CBaseGrenadeConcussion::ExplodeConcussion ); + + m_flDamage = 80; + + // Allow player to blow this puppy up in the air + m_takedamage = DAMAGE_YES; +} + + +void CBaseGrenadeConcussion::Precache( void ) +{ + BaseClass::Precache( ); + + PrecacheModel("models/weapons/w_grenade.mdl"); + m_nTrailSprite = PrecacheModel("sprites/twinkle01.vmt"); +} -- cgit v1.2.3