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

145 lines
3.0 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "dod_player.h"
#include "dod_bombtarget.h"
#include "triggers.h"
class CDODBombDispenserMapIcon;
class CDODBombDispenser : public CBaseTrigger
{
public:
DECLARE_CLASS( CDODBombDispenser, CBaseTrigger );
DECLARE_DATADESC();
virtual void Spawn( void );
void EXPORT Touch( CBaseEntity *pOther );
bool IsActive( void ) { return !m_bDisabled; }
private:
void InputEnable( inputdata_t &inputdata );
void InputDisable( inputdata_t &inputdata );
// Which team to give bombs to. TEAM_UNASSIGNED gives to both
int m_iDispenseToTeam;
// Is this area giving out bombs?
bool m_bActive;
};
BEGIN_DATADESC(CDODBombDispenser)
// Touch functions
DEFINE_FUNCTION( Touch ),
// Inputs
DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
DEFINE_KEYFIELD( m_iDispenseToTeam, FIELD_INTEGER, "dispense_team" ),
DEFINE_KEYFIELD( m_bDisabled, FIELD_BOOLEAN, "StartDisabled" ),
END_DATADESC();
LINK_ENTITY_TO_CLASS( dod_bomb_dispenser, CDODBombDispenser );
void CDODBombDispenser::Spawn( void )
{
BaseClass::Spawn();
InitTrigger();
SetTouch( &CDODBombDispenser::Touch );
m_bDisabled = false;
// make our map icon entity
#ifdef DBGFLAG_ASSERT
CBaseEntity *pIcon =
#endif
CBaseEntity::Create( "dod_bomb_dispenser_icon", WorldSpaceCenter(), GetAbsAngles(), this );
Assert( pIcon );
}
void CDODBombDispenser::Touch( CBaseEntity *pOther )
{
if ( m_bDisabled )
return;
if( !pOther->IsPlayer() )
return;
if( !pOther->IsAlive() )
return;
if ( m_iDispenseToTeam != TEAM_UNASSIGNED && pOther->GetTeamNumber() != m_iDispenseToTeam )
return;
CDODPlayer *pPlayer = ToDODPlayer( pOther );
pPlayer->HintMessage( HINT_BOMB_PICKUP );
switch( pPlayer->GetTeamNumber() )
{
case TEAM_ALLIES:
case TEAM_AXIS:
{
if ( pPlayer->Weapon_OwnsThisType( "weapon_basebomb" ) == NULL )
{
pPlayer->GiveNamedItem( "weapon_basebomb" );
CPASFilter filter( pPlayer->WorldSpaceCenter() );
pPlayer->EmitSound( filter, pPlayer->entindex(), "Weapon_C4.PickUp" );
}
}
break;
default:
break;
}
}
void CDODBombDispenser::InputEnable( inputdata_t &inputdata )
{
m_bDisabled = false;
}
void CDODBombDispenser::InputDisable( inputdata_t &inputdata )
{
m_bDisabled = true;
}
class CDODBombDispenserMapIcon : public CBaseEntity
{
public:
DECLARE_CLASS( CDODBombDispenserMapIcon, CBaseEntity );
DECLARE_NETWORKCLASS();
virtual int UpdateTransmitState( void )
{
if ( (( CDODBombDispenser * )GetOwnerEntity())->IsActive() )
{
return SetTransmitState( FL_EDICT_ALWAYS );
}
else
{
return SetTransmitState( FL_EDICT_DONTSEND );
}
}
};
IMPLEMENT_SERVERCLASS_ST(CDODBombDispenserMapIcon, DT_DODBombDispenserMapIcon)
END_SEND_TABLE()
LINK_ENTITY_TO_CLASS( dod_bomb_dispenser_icon, CDODBombDispenserMapIcon );