mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 22:27:05 +00:00
130 lines
3.8 KiB
C++
130 lines
3.8 KiB
C++
//========= 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 );
|
|
}
|