summaryrefslogtreecommitdiff
path: root/game/server/tf2/info_input_playsound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/info_input_playsound.cpp')
-rw-r--r--game/server/tf2/info_input_playsound.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/game/server/tf2/info_input_playsound.cpp b/game/server/tf2/info_input_playsound.cpp
new file mode 100644
index 0000000..529e561
--- /dev/null
+++ b/game/server/tf2/info_input_playsound.cpp
@@ -0,0 +1,222 @@
+//========= 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 );
+ }
+}