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

From Valve Developer Community
Jump to navigation Jump to search
(Add formula for radius -> sound level)
Line 182: Line 182:
| <code>handle</code>
| <code>handle</code>
| null
| null
| Optional (player) entity to filter sounds to. All filters can use this except <code>RECIPIENT_FILTER_GLOBAL</code> and <code>RECIPIENT_FILTER_TEAM</code>. E.g. <code>RECIPIENT_FILTER_SINGLE_PLAYER</code> will play sounds only to the specified player here.
| This serves two purposes. One is the entity to emit from, the other is the (player) entity to filter sounds to. All filters can use this except <code>RECIPIENT_FILTER_GLOBAL</code> and <code>RECIPIENT_FILTER_TEAM</code>. E.g. <code>RECIPIENT_FILTER_SINGLE_PLAYER</code> will play sounds only to the specified player here.
|-
|-
| <code>speaker_entity</code>
| <code>speaker_entity</code>

Revision as of 03:38, 1 November 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
  • Confirm:Use the CHAN_STATIC channel

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. However the latter two can be forcefully overriden by adding the SND_CHANGE_VOL or SND_CHANGE_PITCH flags respectively.
channel int 0 Channel ID on which to play the sound. Channel values below have special behavior, all other channels behave normally. List of special channels:
Name Value Description
CHAN_REPLACE -1 Used by console commands
CHAN_AUTO 0 Automatic channel [Clarify]
CHAN_WEAPON 1 Weapon sounds
CHAN_VOICE 2 Character voices
CHAN_ITEM 3 Items [Clarify]
CHAN_BODY 4 Impacts, ragdolls and footsteps
CHAN_STREAM 5 "Stream from static or dynamic area" [Clarify]
CHAN_STATIC 6 Constant or background sounds. Valve recommends this to be used for looping ambient sounds, uninterrupted looping sounds or "one-shot" sounds
Note.pngNote:Allows multiple of the same sounds to play without cutting out
Confirm:Code comments imply that this channel continues to work outside of the sound radius
CHAN_VOICE2 7 Team Fortress 2 Team Fortress 2 Announcer
CHAN_VOICE_BASE 8 - 107 Allocated for player voice chat (100 channels)
Note.pngNote:Allows multiple of the same sounds to play without cutting out
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.
Tip.pngTip:To convert radius in Hammer units to decibels (similar to ambient_generic), use the following formula:
local soundlevel = (40 + (20 * log10(radius / 36.0))).tointeger();
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.
Confirm:This may be channel-specific.

Template:ModernWarning

SND_SPAWNING 8 Writes sound info into net message for connecting clients.
Confirm:This probably doesn't do anything at runtime.
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 How far to skip into the sound playback, in seconds. The value must be negative! Template:ModernNote
sound_time float Absolute time to delay sound until, NOT the duration. Overrides delay if specified. Template:ModernNote
entity handle null This serves two purposes. One is the entity to emit from, the other is the (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
});