mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 01:39:36 +00:00
1
This commit is contained in:
@@ -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 );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user