Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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

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 );
}
}