aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/server/baseprojectile.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/baseprojectile.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/baseprojectile.cpp')
-rw-r--r--mp/src/game/server/baseprojectile.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/mp/src/game/server/baseprojectile.cpp b/mp/src/game/server/baseprojectile.cpp
new file mode 100644
index 00000000..6ee7d3ec
--- /dev/null
+++ b/mp/src/game/server/baseprojectile.cpp
@@ -0,0 +1,136 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#include "cbase.h"
+#include "baseprojectile.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 );
+}