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.
141 lines
2.7 KiB
141 lines
2.7 KiB
![]()
2 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "dod_ammo_box.h"
|
||
|
#include "dod_player.h"
|
||
|
#include "dod_gamerules.h"
|
||
|
|
||
|
BEGIN_DATADESC( CAmmoBox )
|
||
|
DEFINE_THINKFUNC( FlyThink ),
|
||
|
DEFINE_ENTITYFUNC( BoxTouch ),
|
||
|
END_DATADESC();
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( dod_ammo_box, CAmmoBox );
|
||
|
|
||
|
void CAmmoBox::Spawn( void )
|
||
|
{
|
||
|
Precache( );
|
||
|
SetModel( "models/ammo/ammo_us.mdl" );
|
||
|
BaseClass::Spawn();
|
||
|
|
||
|
SetNextThink( gpGlobals->curtime + 0.75f );
|
||
|
SetThink( &CAmmoBox::FlyThink );
|
||
|
|
||
|
SetTouch( &CAmmoBox::BoxTouch );
|
||
|
|
||
|
m_hOldOwner = GetOwnerEntity();
|
||
|
}
|
||
|
|
||
|
void CAmmoBox::Precache( void )
|
||
|
{
|
||
|
PrecacheModel( "models/ammo/ammo_axis.mdl" );
|
||
|
PrecacheModel( "models/ammo/ammo_us.mdl" );
|
||
|
}
|
||
|
|
||
|
CAmmoBox *CAmmoBox::Create( const Vector &vecOrigin, const QAngle &vecAngles, CBaseEntity *pOwner, int team )
|
||
|
{
|
||
|
CAmmoBox *p = static_cast<CAmmoBox *> ( CBaseAnimating::Create( "dod_ammo_box", vecOrigin, vecAngles, pOwner ) );
|
||
|
|
||
|
p->SetAmmoTeam( team );
|
||
|
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
void CAmmoBox::SetAmmoTeam( int team )
|
||
|
{
|
||
|
switch( team )
|
||
|
{
|
||
|
case TEAM_ALLIES:
|
||
|
{
|
||
|
SetModel( "models/ammo/ammo_us.mdl" );
|
||
|
}
|
||
|
break;
|
||
|
case TEAM_AXIS:
|
||
|
{
|
||
|
SetModel( "models/ammo/ammo_axis.mdl" );
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
Assert(0);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
m_iAmmoTeam = team;
|
||
|
}
|
||
|
|
||
|
void CAmmoBox::FlyThink( void )
|
||
|
{
|
||
|
SetOwnerEntity( NULL ); //so our owner can pick it back up
|
||
|
}
|
||
|
|
||
|
void CAmmoBox::BoxTouch( CBaseEntity *pOther )
|
||
|
{
|
||
|
Assert( pOther );
|
||
|
|
||
|
if( !pOther->IsPlayer() )
|
||
|
return;
|
||
|
|
||
|
if( !pOther->IsAlive() )
|
||
|
return;
|
||
|
|
||
|
//Don't let the person who threw this ammo pick it up until it hits the ground.
|
||
|
//This way we can throw ammo to people, but not touch it as soon as we throw it ourselves
|
||
|
if( GetOwnerEntity() == pOther )
|
||
|
return;
|
||
|
|
||
|
CDODPlayer *pPlayer = ToDODPlayer( pOther );
|
||
|
|
||
|
Assert( pPlayer );
|
||
|
|
||
|
if( pPlayer->GetTeamNumber() != m_iAmmoTeam )
|
||
|
return;
|
||
|
|
||
|
if( pPlayer == m_hOldOwner )
|
||
|
{
|
||
|
//don't give ammo, just give him his drop again
|
||
|
pPlayer->ReturnGenericAmmo();
|
||
|
UTIL_Remove(this);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//See if they can use some ammo, if so, remove the box
|
||
|
if( pPlayer->GiveGenericAmmo() )
|
||
|
UTIL_Remove(this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool CAmmoBox::MyTouch( CBasePlayer *pBasePlayer )
|
||
|
{
|
||
|
if ( !pBasePlayer )
|
||
|
{
|
||
|
Assert( false );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if( !pBasePlayer->IsAlive() )
|
||
|
return false;
|
||
|
|
||
|
if( pBasePlayer->GetTeamNumber() != m_iAmmoTeam )
|
||
|
return false;
|
||
|
|
||
|
CDODPlayer *pPlayer = ToDODPlayer( pBasePlayer );
|
||
|
|
||
|
if( pPlayer == m_hOldOwner )
|
||
|
{
|
||
|
//don't give ammo, just give him his drop again
|
||
|
pPlayer->ReturnGenericAmmo();
|
||
|
UTIL_Remove(this);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//See if they can use some ammo, if so, remove the box
|
||
|
if( pPlayer->GiveGenericAmmo() )
|
||
|
UTIL_Remove(this);
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|