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.
133 lines
3.2 KiB
133 lines
3.2 KiB
//========= 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()
|
|
{
|
|
}
|
|
|