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.
223 lines
7.0 KiB
223 lines
7.0 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
#include "cbase.h"
|
||
|
#include "EntityOutput.h"
|
||
|
#include "EntityList.h"
|
||
|
#include "tf_team.h"
|
||
|
#include "baseentity.h"
|
||
|
#include "engine/IEngineSound.h"
|
||
|
#include "triggers.h"
|
||
|
|
||
|
// Spawnflags
|
||
|
#define SF_PLAYSOUND_USE_THIS_ORIGIN 0x0001
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Map entity that plays sounds to players
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CInfoInputPlaySound : public CBaseEntity
|
||
|
{
|
||
|
DECLARE_CLASS( CInfoInputPlaySound, CBaseEntity );
|
||
|
public:
|
||
|
DECLARE_DATADESC();
|
||
|
|
||
|
virtual void Spawn( void );
|
||
|
virtual void Precache( void );
|
||
|
virtual void Activate( void );
|
||
|
|
||
|
// Inputs
|
||
|
void InputPlaySoundToAll( inputdata_t &inputdata );
|
||
|
void InputPlaySoundToTeam1( inputdata_t &inputdata );
|
||
|
void InputPlaySoundToTeam2( inputdata_t &inputdata );
|
||
|
void InputPlaySoundToPlayer( inputdata_t &inputdata );
|
||
|
void InputSetSound( inputdata_t &inputdata );
|
||
|
|
||
|
// Sound playing
|
||
|
void PlaySoundToPlayer( CBaseTFPlayer *pPlayer );
|
||
|
void PlaySoundToTeam( CTFTeam *pTeam );
|
||
|
|
||
|
private:
|
||
|
string_t m_iszSound;
|
||
|
float m_flVolume;
|
||
|
float m_flAttenuation;
|
||
|
string_t m_iszTestVolumeName;
|
||
|
EHANDLE m_hTestVolume;
|
||
|
};
|
||
|
|
||
|
BEGIN_DATADESC( CInfoInputPlaySound )
|
||
|
|
||
|
// variables
|
||
|
DEFINE_KEYFIELD( m_iszSound, FIELD_SOUNDNAME, "Sound" ),
|
||
|
DEFINE_KEYFIELD( m_flVolume, FIELD_FLOAT, "Volume" ),
|
||
|
DEFINE_KEYFIELD( m_flAttenuation, FIELD_FLOAT, "Attenuation" ),
|
||
|
DEFINE_KEYFIELD( m_iszTestVolumeName, FIELD_STRING, "TestVolume" ),
|
||
|
|
||
|
// inputs
|
||
|
DEFINE_INPUTFUNC( FIELD_STRING, "SetSound", InputSetSound ),
|
||
|
DEFINE_INPUTFUNC( FIELD_VOID, "PlaySoundToAll", InputPlaySoundToAll ),
|
||
|
DEFINE_INPUTFUNC( FIELD_VOID, "PlaySoundToTeam1", InputPlaySoundToTeam1 ),
|
||
|
DEFINE_INPUTFUNC( FIELD_VOID, "PlaySoundToTeam2", InputPlaySoundToTeam2 ),
|
||
|
DEFINE_INPUTFUNC( FIELD_EHANDLE, "PlaySoundToPlayer", InputPlaySoundToPlayer ),
|
||
|
|
||
|
END_DATADESC()
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( info_input_playsound, CInfoInputPlaySound );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::Spawn( void )
|
||
|
{
|
||
|
m_hTestVolume = NULL;
|
||
|
Precache();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::Precache( void )
|
||
|
{
|
||
|
if ( m_iszSound != NULL_STRING )
|
||
|
{
|
||
|
PrecacheScriptSound( STRING(m_iszSound) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::Activate( void )
|
||
|
{
|
||
|
BaseClass::Activate();
|
||
|
|
||
|
// Find our test volume, if we have one
|
||
|
if ( m_iszTestVolumeName != NULL_STRING )
|
||
|
{
|
||
|
m_hTestVolume = gEntList.FindEntityByName( NULL, STRING(m_iszTestVolumeName) );
|
||
|
if ( !m_hTestVolume )
|
||
|
{
|
||
|
Msg("ERROR: Could not find test volume %s for info_input_playsound.\n", STRING(m_iszTestVolumeName) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Make sure it's a trigger
|
||
|
CBaseTrigger *pTrigger = dynamic_cast<CBaseTrigger*>((CBaseEntity*)m_hTestVolume);
|
||
|
if ( !pTrigger )
|
||
|
{
|
||
|
Msg("ERROR: info_input_playsound specifies a volume %s, but it's not a trigger.\n", STRING(m_iszTestVolumeName) );
|
||
|
m_hTestVolume = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Play sound to all players
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::InputPlaySoundToAll( inputdata_t &inputdata )
|
||
|
{
|
||
|
for ( int i = 1; i <= gpGlobals->maxClients; i++ )
|
||
|
{
|
||
|
CBaseTFPlayer *pPlayer = ToBaseTFPlayer( UTIL_PlayerByIndex(i) );
|
||
|
if ( pPlayer )
|
||
|
{
|
||
|
PlaySoundToPlayer( pPlayer );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Play sound to all players on team 1
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::InputPlaySoundToTeam1( inputdata_t &inputdata )
|
||
|
{
|
||
|
PlaySoundToTeam( GetGlobalTFTeam(1) );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Play sound to all players on team 2
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::InputPlaySoundToTeam2( inputdata_t &inputdata )
|
||
|
{
|
||
|
PlaySoundToTeam( GetGlobalTFTeam(2) );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Play sound to a specific player
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::InputPlaySoundToPlayer( inputdata_t &inputdata )
|
||
|
{
|
||
|
CBaseEntity *pEntity = (inputdata.value.Entity()).Get();
|
||
|
if ( pEntity && pEntity->IsPlayer() )
|
||
|
{
|
||
|
CBaseTFPlayer *pPlayer = (CBaseTFPlayer *)pEntity;
|
||
|
PlaySoundToPlayer( pPlayer );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Set the sound to play
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::InputSetSound( inputdata_t &inputdata )
|
||
|
{
|
||
|
m_iszSound = MAKE_STRING( inputdata.value.String() );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Play sound to a team
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::PlaySoundToTeam( CTFTeam *pTeam )
|
||
|
{
|
||
|
for ( int i = 0; i < pTeam->GetNumPlayers(); i++ )
|
||
|
{
|
||
|
PlaySoundToPlayer( (CBaseTFPlayer*)pTeam->GetPlayer(i) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Play sound to a player
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInfoInputPlaySound::PlaySoundToPlayer( CBaseTFPlayer *pPlayer )
|
||
|
{
|
||
|
// First, if we have a test volume, make sure the player's within it
|
||
|
if ( m_hTestVolume )
|
||
|
{
|
||
|
CBaseTrigger *pTrigger = (CBaseTrigger *)(CBaseEntity*)m_hTestVolume;
|
||
|
if ( !pTrigger->IsTouching( pPlayer ) )
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Check to see if we're supposed to play it from this entity's location
|
||
|
if ( HasSpawnFlags( SF_PLAYSOUND_USE_THIS_ORIGIN ) )
|
||
|
{
|
||
|
CPASAttenuationFilter filter;
|
||
|
filter.AddRecipient( pPlayer );
|
||
|
filter.Filter( GetAbsOrigin(), m_flAttenuation );
|
||
|
|
||
|
EmitSound_t ep;
|
||
|
ep.m_nChannel = CHAN_VOICE;
|
||
|
ep.m_pSoundName = STRING(m_iszSound);
|
||
|
ep.m_flVolume = m_flVolume;
|
||
|
ep.m_SoundLevel = ATTN_TO_SNDLVL( m_flAttenuation );
|
||
|
|
||
|
ep.m_pOrigin = &(GetAbsOrigin());
|
||
|
|
||
|
EmitSound( filter, entindex(), ep );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CSingleUserRecipientFilter filter( pPlayer );
|
||
|
|
||
|
EmitSound_t ep;
|
||
|
ep.m_nChannel = CHAN_VOICE;
|
||
|
ep.m_pSoundName = STRING(m_iszSound);
|
||
|
ep.m_flVolume = m_flVolume;
|
||
|
ep.m_SoundLevel = ATTN_TO_SNDLVL( m_flAttenuation );
|
||
|
|
||
|
EmitSound( filter, pPlayer->entindex(), ep );
|
||
|
}
|
||
|
}
|