|
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
|
|
//
|
|
|
|
// Purpose:
|
|
|
|
//
|
|
|
|
//=============================================================================//
|
|
|
|
|
|
|
|
|
|
|
|
#include "cbase.h"
|
|
|
|
#include "hl1_basecombatweapon_shared.h"
|
|
|
|
#include "effect_dispatch_data.h"
|
|
|
|
#include "te_effect_dispatch.h"
|
|
|
|
|
|
|
|
|
|
|
|
BEGIN_DATADESC( CBaseHL1CombatWeapon )
|
|
|
|
DEFINE_THINKFUNC( FallThink ),
|
|
|
|
END_DATADESC();
|
|
|
|
|
|
|
|
|
|
|
|
void CBaseHL1CombatWeapon::Precache()
|
|
|
|
{
|
|
|
|
BaseClass::Precache();
|
|
|
|
|
|
|
|
PrecacheScriptSound( "BaseCombatWeapon.WeaponDrop" );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CBaseHL1CombatWeapon::CreateVPhysics( void )
|
|
|
|
{
|
|
|
|
VPhysicsInitNormal( SOLID_BBOX, GetSolidFlags() | FSOLID_TRIGGER, false );
|
|
|
|
IPhysicsObject *pPhysObj = VPhysicsGetObject();
|
|
|
|
if ( pPhysObj )
|
|
|
|
{
|
|
|
|
pPhysObj->SetMass( 30 );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Purpose:
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CBaseHL1CombatWeapon::FallInit( void )
|
|
|
|
{
|
|
|
|
SetModel( GetWorldModel() );
|
|
|
|
|
|
|
|
if( !CreateVPhysics() )
|
|
|
|
{
|
|
|
|
SetSolid( SOLID_BBOX );
|
|
|
|
SetMoveType( MOVETYPE_FLYGRAVITY );
|
|
|
|
SetSolid( SOLID_BBOX );
|
|
|
|
AddSolidFlags( FSOLID_TRIGGER );
|
|
|
|
}
|
|
|
|
|
|
|
|
SetPickupTouch();
|
|
|
|
|
|
|
|
SetThink( &CBaseHL1CombatWeapon::FallThink );
|
|
|
|
|
|
|
|
SetNextThink( gpGlobals->curtime + 0.1f );
|
|
|
|
|
|
|
|
// HACKHACK - On ground isn't always set, so look for ground underneath
|
|
|
|
trace_t tr;
|
|
|
|
UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector(0,0,256), MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr );
|
|
|
|
|
|
|
|
SetAbsOrigin( tr.endpos );
|
|
|
|
|
|
|
|
if ( tr.fraction < 1.0 )
|
|
|
|
{
|
|
|
|
SetGroundEntity( tr.m_pEnt );
|
|
|
|
}
|
|
|
|
|
|
|
|
SetViewOffset( Vector(0,0,8) );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Purpose: Items that have just spawned run this think to catch them when
|
|
|
|
// they hit the ground. Once we're sure that the object is grounded,
|
|
|
|
// we change its solid type to trigger and set it in a large box that
|
|
|
|
// helps the player get it.
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CBaseHL1CombatWeapon::FallThink ( void )
|
|
|
|
{
|
|
|
|
SetNextThink( gpGlobals->curtime + 0.1f );
|
|
|
|
|
|
|
|
bool shouldMaterialize = false;
|
|
|
|
IPhysicsObject *pPhysics = VPhysicsGetObject();
|
|
|
|
if ( pPhysics )
|
|
|
|
{
|
|
|
|
shouldMaterialize = pPhysics->IsAsleep();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
shouldMaterialize = (GetFlags() & FL_ONGROUND) ? true : false;
|
|
|
|
if( shouldMaterialize )
|
|
|
|
SetSize( Vector( -24, -24, 0 ), Vector( 24, 24, 16 ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( shouldMaterialize )
|
|
|
|
{
|
|
|
|
// clatter if we have an owner (i.e., dropped by someone)
|
|
|
|
// don't clatter if the gun is waiting to respawn (if it's waiting, it is invisible!)
|
|
|
|
if ( GetOwnerEntity() )
|
|
|
|
{
|
|
|
|
EmitSound( "BaseCombatWeapon.WeaponDrop" );
|
|
|
|
}
|
|
|
|
|
|
|
|
// lie flat
|
|
|
|
Materialize();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|