diff options
Diffstat (limited to 'game/shared/tf2/grenade_stickybomb.cpp')
| -rw-r--r-- | game/shared/tf2/grenade_stickybomb.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/game/shared/tf2/grenade_stickybomb.cpp b/game/shared/tf2/grenade_stickybomb.cpp new file mode 100644 index 0000000..dfadbdc --- /dev/null +++ b/game/shared/tf2/grenade_stickybomb.cpp @@ -0,0 +1,129 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Sticky bombs thrown by the recon +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "player.h" +#include "basegrenade_shared.h" +#include "tf_shareddefs.h" +#include "Sprite.h" + + +// Damage CVars +ConVar grenade_stickybomb_damage( "grenade_stickybomb_damage","0", 0, "Recon's stickybomb maximum damage" ); +ConVar grenade_stickybomb_radius( "grenade_stickybomb_radius","0", 0, "Recon's stickybomb splash radius" ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CGrenadeStickyBomb : public CBaseGrenade +{ + DECLARE_CLASS( CGrenadeStickyBomb, CBaseGrenade ); +public: + CGrenadeStickyBomb(); + + DECLARE_DATADESC(); + + void Spawn( void ); + void Precache( void ); + void SetTimer( float timer ); + void StickyTouch( CBaseEntity *pOther ); + virtual void Explode( trace_t *pTrace, int bitsDamageType ); + virtual int GetDamageType() const { return DMG_BLAST; } + +private: + CSprite *m_pLiveSprite; +}; + +// Global Savedata for friction modifier +BEGIN_DATADESC( CGrenadeStickyBomb ) + + // Function Pointers + DEFINE_ENTITYFUNC( StickyTouch ), + +END_DATADESC() + + +LINK_ENTITY_TO_CLASS( grenade_stickybomb, CGrenadeStickyBomb ); +PRECACHE_WEAPON_REGISTER(grenade_stickybomb); + +CGrenadeStickyBomb::CGrenadeStickyBomb() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CGrenadeStickyBomb::Precache( void ) +{ + PrecacheModel( "models/weapons/w_grenade.mdl" ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CGrenadeStickyBomb::Spawn( void ) +{ + Precache(); + + SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE ); + SetSolid( SOLID_BBOX ); + SetGravity( 0.6 ); + SetFriction( 1.0 ); + SetModel( "models/weapons/w_grenade.mdl"); + UTIL_SetSize(this, Vector( -4, -4, -4), Vector(4, 4, 4)); + SetTouch( StickyTouch ); + SetCollisionGroup( TFCOLLISION_GROUP_WEAPON ); + + // Create a red light + m_pLiveSprite = CSprite::SpriteCreate( "sprites/redglow1.vmt", GetLocalOrigin(), false ); + m_pLiveSprite->SetTransparency( kRenderGlow, 255, 200, 200, 255, kRenderFxNoDissipation ); + m_pLiveSprite->SetBrightness( 255 ); + m_pLiveSprite->SetScale( 0.3 ); + m_pLiveSprite->SetAttachment( this, 0 ); + + // Set my damages to the cvar values + SetDamage( grenade_stickybomb_damage.GetFloat() ); + SetDamageRadius( grenade_stickybomb_radius.GetFloat() ); + + SetTimer( 2.0 ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CGrenadeStickyBomb::SetTimer( float timer ) +{ + SetThink( Detonate ); + SetNextThink( gpGlobals->curtime + timer ); +} + +//----------------------------------------------------------------------------- +// Purpose: Make the grenade stick to whatever it touches +//----------------------------------------------------------------------------- +void CGrenadeStickyBomb::StickyTouch( CBaseEntity *pOther ) +{ + if ( pOther->IsBSPModel() == false ) + return; + + BounceSound(); + SetAbsVelocity( vec3_origin ); + SetMoveType( MOVETYPE_NONE ); +} + +//----------------------------------------------------------------------------- +// Purpose: Remove my glow when I'm removed +//----------------------------------------------------------------------------- +void CGrenadeStickyBomb::Explode( trace_t *pTrace, int bitsDamageType ) +{ + if ( m_pLiveSprite ) + { + UTIL_Remove( m_pLiveSprite ); + m_pLiveSprite = NULL; + } + + BaseClass::Explode( pTrace, bitsDamageType ); +} |