source-engine-2018-hl2_src/game/server/basegrenade_concussion.cpp

132 lines
3.2 KiB
C++
Raw Permalink Normal View History

2020-04-23 00:56:21 +08:00
//========= 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");
}