mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-20 20:46:03 +08:00
Added original SDK code for Alien Swarm.
This commit is contained in:
140
game/server/baseprojectile.cpp
Normal file
140
game/server/baseprojectile.cpp
Normal file
@ -0,0 +1,140 @@
|
||||
//====== Copyright <20> 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 );
|
||||
}
|
Reference in New Issue
Block a user