You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.1 KiB
140 lines
4.1 KiB
//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======= |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "cbase.h" |
|
#include "baseprojectile.h" |
|
|
|
// NOTE: This has to be the last file included! |
|
#include "tier0/memdbgon.h" |
|
|
|
|
|
BEGIN_DATADESC( CBaseProjectile ) |
|
DEFINE_FIELD( m_flDamage, FIELD_FLOAT ), |
|
DEFINE_FIELD( m_iDamageType, FIELD_INTEGER ), |
|
DEFINE_FIELD( m_flDamageScale, FIELD_FLOAT ), |
|
|
|
DEFINE_FUNCTION( ProjectileTouch ), |
|
DEFINE_THINKFUNC( FlyThink ), |
|
END_DATADESC() |
|
|
|
LINK_ENTITY_TO_CLASS( proj_base, CBaseProjectile ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CBaseProjectile::Spawn( void ) |
|
{ |
|
Precache(); |
|
|
|
SetModel( STRING( GetModelName() ) ); |
|
|
|
SetSolid( SOLID_BBOX ); |
|
SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_CUSTOM ); |
|
AddFlag( FL_OBJECT ); |
|
|
|
UTIL_SetSize( this, -Vector( 1.0f, 1.0f, 1.0f ), Vector( 1.0f, 1.0f, 1.0f ) ); |
|
|
|
// Setup attributes. |
|
SetGravity( 0.001f ); |
|
m_takedamage = DAMAGE_NO; |
|
|
|
// Setup the touch and think functions. |
|
SetTouch( &CBaseProjectile::ProjectileTouch ); |
|
SetThink( &CBaseProjectile::FlyThink ); |
|
SetNextThink( gpGlobals->curtime ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CBaseProjectile::Precache( void ) |
|
{ |
|
BaseClass::Precache(); |
|
|
|
PrecacheModel( STRING( GetModelName() ) ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
CBaseProjectile *CBaseProjectile::Create( baseprojectilecreate_t &pCreate ) |
|
{ |
|
CBaseProjectile *pProjectile = static_cast<CBaseProjectile*>( CBaseEntity::CreateNoSpawn( "proj_base", pCreate.vecOrigin, vec3_angle, pCreate.pOwner ) ); |
|
if ( !pProjectile ) |
|
return NULL; |
|
|
|
pProjectile->SetModelName( pCreate.iszModel ); |
|
pProjectile->SetDamage( pCreate.flDamage ); |
|
pProjectile->SetDamageType( pCreate.iDamageType ); |
|
pProjectile->SetDamageScale( pCreate.flDamageScale ); |
|
pProjectile->SetAbsVelocity( pCreate.vecVelocity ); |
|
|
|
// Setup the initial angles. |
|
QAngle angles; |
|
VectorAngles( -pCreate.vecVelocity, angles ); |
|
pProjectile->SetAbsAngles( angles ); |
|
|
|
// Spawn & Activate |
|
DispatchSpawn( pProjectile ); |
|
pProjectile->Activate(); |
|
|
|
return pProjectile; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
unsigned int CBaseProjectile::PhysicsSolidMaskForEntity( void ) const |
|
{ |
|
return BaseClass::PhysicsSolidMaskForEntity() | CONTENTS_HITBOX; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CBaseProjectile::ProjectileTouch( CBaseEntity *pOther ) |
|
{ |
|
// Verify a correct "other." |
|
Assert( pOther ); |
|
if ( !pOther->IsSolid() || pOther->IsSolidFlagSet( FSOLID_VOLUME_CONTENTS ) ) |
|
return; |
|
|
|
// Handle hitting skybox (disappear). |
|
const trace_t *pTrace = &CBaseEntity::GetTouchTrace(); |
|
trace_t *pNewTrace = const_cast<trace_t*>( pTrace ); |
|
|
|
if( pTrace->surface.flags & SURF_SKY ) |
|
{ |
|
UTIL_Remove( this ); |
|
return; |
|
} |
|
|
|
CTakeDamageInfo info; |
|
info.SetAttacker( GetOwnerEntity() ); |
|
info.SetInflictor( this ); |
|
info.SetDamage( GetDamage() ); |
|
info.SetDamageType( GetDamageType() ); |
|
CalculateMeleeDamageForce( &info, GetAbsVelocity(), GetAbsOrigin(), GetDamageScale() ); |
|
|
|
Vector dir; |
|
AngleVectors( GetAbsAngles(), &dir ); |
|
|
|
pOther->DispatchTraceAttack( info, dir, pNewTrace ); |
|
ApplyMultiDamage(); |
|
|
|
UTIL_Remove( this ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Orient the projectile along its velocity |
|
//----------------------------------------------------------------------------- |
|
void CBaseProjectile::FlyThink( void ) |
|
{ |
|
QAngle angles; |
|
VectorAngles( -(GetAbsVelocity()), angles ); |
|
SetAbsAngles( angles ); |
|
SetNextThink( gpGlobals->curtime + 0.1f ); |
|
}
|
|
|