Team Fortress 2/Scripting/Script Functions/EmitSoundEx: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(Created page with "== Function Description == <code>void EmitSoundEx(table ''parameters'')</code> Flexible way of playing sounds. All parameters except <code>sound_name</code> are optional. Sou...")
 
(Move PVS note into description)
Line 3: Line 3:


Flexible way of playing sounds. All parameters except <code>sound_name</code> are optional. Sounds can be played in raw or [[soundscript]] form, and filtered to everyone, on a per-team or per-player basis. Volume, pitch, channel and attenuation level can be controlled, and the sound can play from a fixed position or relative to an entity. It is also possible to stop or adjust sounds already playing on the entity using special flags such as <code>SND_CHANGE_VOL</code> or <code>SND_CHANGE_PITCH</code>.
Flexible way of playing sounds. All parameters except <code>sound_name</code> are optional. Sounds can be played in raw or [[soundscript]] form, and filtered to everyone, on a per-team or per-player basis. Volume, pitch, channel and attenuation level can be controlled, and the sound can play from a fixed position or relative to an entity. It is also possible to stop or adjust sounds already playing on the entity using special flags such as <code>SND_CHANGE_VOL</code> or <code>SND_CHANGE_PITCH</code>.
{{note|If the sound is playing while a player is outside of the sound's [[PAS]]/[[PVS]]/attenuation, and then enters its visiblity, the player will not hear the sound. This may be a problem for looping sounds or sounds with long durations, in which case the following workarounds can be used:
* Use the <code>RECIPIENT_FILTER_GLOBAL</code>/<code>RECIPIENT_FILTER_TEAM</code> filter. The sound will still "play" outside of the range, but at no volume.
* Play the sound to the player individually using <code>RECIPIENT_FILTER_SINGLE_PLAYER</code> when they enter a given area, e.g. via a trigger.
* Create a [[soundscape]] which automatically deals with this on a per-player basis}}


== Parameters ==
== Parameters ==
Line 141: Line 146:
| 0
| 0
| Specifies what entities can hear this entity. See [[Team_Fortress_2/Scripting/Script_Functions/Constants#EScriptRecipientFilter|Constants.EScriptRecipientFilter]].
| Specifies what entities can hear this entity. See [[Team_Fortress_2/Scripting/Script_Functions/Constants#EScriptRecipientFilter|Constants.EScriptRecipientFilter]].
{{note|If the sound is playing while a player is outside of the sound's [[PAS]]/[[PVS]]/attenuation, and then enters its visiblity, the player will not hear the sound. This may be a problem for looping sounds or sounds with long durations, in which case the following workarounds can be used:
* Use the <code>RECIPIENT_FILTER_GLOBAL</code>/<code>RECIPIENT_FILTER_TEAM</code> filter. The sound will still "play" outside of the range, but at no volume.
* Play the sound to the player individually using <code>RECIPIENT_FILTER_SINGLE_PLAYER</code> when they enter a given area, e.g. via a trigger.
* Create a [[soundscape]] which automatically deals with this on a per-player basis}}
|-
|-
| <code>filter_param</code>
| <code>filter_param</code>

Revision as of 18:11, 11 August 2023

Function Description

void EmitSoundEx(table parameters)

Flexible way of playing sounds. All parameters except sound_name are optional. Sounds can be played in raw or soundscript form, and filtered to everyone, on a per-team or per-player basis. Volume, pitch, channel and attenuation level can be controlled, and the sound can play from a fixed position or relative to an entity. It is also possible to stop or adjust sounds already playing on the entity using special flags such as SND_CHANGE_VOL or SND_CHANGE_PITCH.

Note.pngNote:If the sound is playing while a player is outside of the sound's PAS/PVS/attenuation, and then enters its visiblity, the player will not hear the sound. This may be a problem for looping sounds or sounds with long durations, in which case the following workarounds can be used:
  • Use the RECIPIENT_FILTER_GLOBAL/RECIPIENT_FILTER_TEAM filter. The sound will still "play" outside of the range, but at no volume.
  • Play the sound to the player individually using RECIPIENT_FILTER_SINGLE_PLAYER when they enter a given area, e.g. via a trigger.
  • Create a soundscape which automatically deals with this on a per-player basis

Parameters

Name Type Default Description
sound_name string Name of sound. Can be raw filename or soundscript.
Note.pngNote:Soundscripts override the channel, volume and pitch parameters. Use raw filenames if this is not desirable.
channel int 0 Channel ID on which to play the sound. Channels from -1 to 8 have special behavior, all other channels behave normally. List of special channels:
  • -1 : CHAN_REPLACE
  • 0 : CHAN_AUTO
  • 1 : CHAN_WEAPON
  • 2 : CHAN_VOICE
  • 3 : CHAN_ITEM
  • 4 : CHAN_BODY
  • 5 : CHAN_STREAM
  • 6 : CHAN_STATIC
  • 7 : CHAN_VOICE2
  • 8 : CHAN_VOICE_BASE
volume float 1.0 Volume of sound, in normalized 0 - 1 range.
Tip.pngTip:Sounds may be hard to hear even at full volume. Naming custom sounds according to the soundmixer can be used to make them naturally louder.
sound_level int 0 Sound attenuation in decibels. See this page for real world equivalents. If the sound has non-zero attenuation, it will play from the entity's origin if present, otherwise it uses the origin parameter.
flags int 0 Special sound flags. List of flags available:
Name Value Description
SND_NOFLAGS 0 Nothing special.
SND_CHANGE_VOL 1 Changes volume of an already-playing sound on this entity.
SND_CHANGE_PITCH 2 Changes pitch of an already-playing sound on this entity.
SND_STOP 4 Stops the specified sound if playing on this entity. Template:ModernNote
SND_SPAWNING 8 Writes sound info into net message for connecting clients. Template:ModernNote
SND_DELAY 16 Specifies the sound should be scheduled with a delay.
SND_STOP_LOOPING 32 Stop all looping sounds on the entity. Template:ModernBug
SND_SPEAKER 64 Used by audio played through env_microphone. Applies special mixing rules.
SND_SHOULDPAUSE 128 Sound will be paused when the game is paused. Useless in multiplayer.
SND_IGNORE_PHONEMES 256 Prevents flex animation from being driven by this sound, if available.
SND_IGNORE_NAME 512 Changes all sounds emitted on the entity, regardless of actual name.
SND_DO_NOT_OVERWRITE_EXISTING_ON_CHANNEL 1024 If an existing sound is found on the channel, the sound will not play instead of overwriting it.
pitch int 100 Pitch of the sound.
special_dsp int 0 DSP effect to use on this sound.
origin Vector 0 0 0 Overwrites sound origin if specified.

Template:ModernNote

delay float Delay before playing sound. Template:ModernNote
sound_time float Absolute time to delay sound until, NOT the duration. Overrides delay if specified. Template:ModernNote
entity handle null Optional (player) entity to filter sounds to. All filters can use this except RECIPIENT_FILTER_GLOBAL and RECIPIENT_FILTER_TEAM. E.g. RECIPIENT_FILTER_SINGLE_PLAYER will play sounds only to the specified player here.
speaker_entity handle null Entity which will *speak* the sound. This is not the sound as the actual owner of the sound, see above.
filter_type int 0 Specifies what entities can hear this entity. See Constants.EScriptRecipientFilter.
filter_param int -1 Specifies an extra option to the filter. Currently only used by RECIPIENT_FILTER_TEAM, which uses this to specify which team to play to.

Flags

It may be useful to define these flags for extra readability.

::SND_NOFLAGS <- 0
::SND_CHANGE_VOL <- 1
::SND_CHANGE_PITCH <- 2
::SND_STOP <- 4
::SND_SPAWNING <- 8
::SND_DELAY <- 16
::SND_STOP_LOOPING <- 32
::SND_SPEAKER <- 64
::SND_SHOULDPAUSE <- 128
::SND_IGNORE_PHONEMES <- 256
::SND_IGNORE_NAME <- 512
::SND_DO_NOT_OVERWRITE_EXISTING_ON_CHANNEL <- 1024

Example Usage

// sounds should be precached once before use
PrecacheScriptSound("Game.Domination");

// play the sound to everyone around yourself
EmitSoundEx({
	sound_name = "Game.Domination",
	origin = GetListenServerHost().GetCenter(),
	filter = Constants.EScriptRecipientFilter.RECIPIENT_FILTER_GLOBAL
});