//========= Copyright © 1996-2007, Valve Corporation, All rights reserved. ============// // // Purpose: Base class for simple projectiles that use studio models // // $Workfile: $ // $Date: $ // $NoKeywords: $ //=============================================================================// //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // This file was made before I // realized Portal had already // made the same thing // (probably because it was // squirreled away in the PORTAL // source folder). Anyway, this // needs to be reconciled with that // file since clearly there is // demand for this feature (sjb) 11/27/07 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include "cbase.h" #include "cbaseprojectile.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" LINK_ENTITY_TO_CLASS( baseprojectile, CBaseProjectile ); //--------------------------------------------------------- // Save/Restore //--------------------------------------------------------- BEGIN_DATADESC( CBaseProjectile ) DEFINE_FIELD( m_iDmg, FIELD_INTEGER ), DEFINE_FIELD( m_iDmgType, FIELD_INTEGER ), DEFINE_FIELD( m_hIntendedTarget, FIELD_EHANDLE ), END_DATADESC() //--------------------------------------------------------- //--------------------------------------------------------- void CBaseProjectile::Spawn( char *pszModel, const Vector &vecOrigin, const Vector &vecVelocity, edict_t *pOwner, MoveType_t iMovetype, MoveCollide_t nMoveCollide, int iDamage, int iDamageType, CBaseEntity *pIntendedTarget ) { Precache(); SetModel( pszModel ); m_iDmg = iDamage; m_iDmgType = iDamageType; SetMoveType( iMovetype, nMoveCollide ); UTIL_SetSize( this, -Vector(1,1,1), Vector(1,1,1) ); SetSolid( SOLID_BBOX ); SetCollisionGroup( COLLISION_GROUP_PROJECTILE ); UTIL_SetOrigin( this, vecOrigin ); SetAbsVelocity( vecVelocity ); SetOwnerEntity( Instance( pOwner ) ); m_hIntendedTarget.Set( pIntendedTarget ); QAngle angles; VectorAngles( vecVelocity, angles ); SetAbsAngles( angles ); // Call think for free the first time. It's up to derived classes to rethink. SetNextThink( gpGlobals->curtime ); } //--------------------------------------------------------- //--------------------------------------------------------- void CBaseProjectile::Touch( CBaseEntity *pOther ) { if ( pOther->IsSolidFlagSet(FSOLID_TRIGGER) ) { return; } HandleTouch( pOther ); } //--------------------------------------------------------- //--------------------------------------------------------- void CBaseProjectile::HandleTouch( CBaseEntity *pOther ) { CBaseEntity *pOwner; pOwner = GetOwnerEntity(); if( !pOwner ) { pOwner = this; } trace_t tr; tr = BaseClass::GetTouchTrace( ); CTakeDamageInfo info( this, pOwner, m_iDmg, m_iDmgType ); GuessDamageForce( &info, (tr.endpos - tr.startpos), tr.endpos ); pOther->TakeDamage( info ); UTIL_Remove( this ); } //--------------------------------------------------------- //--------------------------------------------------------- void CBaseProjectile::Think() { HandleThink(); } //--------------------------------------------------------- //--------------------------------------------------------- void CBaseProjectile::HandleThink() { }