source-engine/game/server/dod/dod_ammo_box.cpp
2022-04-16 12:05:19 +03:00

141 lines
2.7 KiB
C++

//========= 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;
}