{"name":"say3D","operator":null,"title":"say3D","type":"command","url":"https://community.bistudio.com/wiki/say3D","revid":379095,"updated":"2026-09-27T21:30:33Z","groups":["Sounds"],"status":"ok","replaced_by":[],"games":[{"game":"arma2","name":"Arma 2","version":"1.00"},{"game":"arma2oa","name":"Arma 2: Operation Arrowhead","version":"1.50"},{"game":"tkoh","name":"Take On Helicopters","version":"1.00"},{"game":"arma3","name":"Arma 3","version":"0.50"}],"since":{"game":"arma2","name":"Arma 2","version":"1.00"},"arma3_since":"0.50","branch":null,"locality":{"argument":"global","effect":"local","server_exec":false},"exec":null,"description":"Lets an object say given sound in 3D space.\nThis allows broadcasting of positional music or sound from a source, without having to script a fade sound or music command. The source has to be alive.\nCompare this with say2D which will always play a sound at the location of the player after he has been in the vicinity of a broadcasting sound.\nSound is defined in \"CfgSounds\" of the Description.ext or main config.\n\n> [!NOTE]\n> The name of the command is the clue to its usage. It is meant for playing short sounds within short range. Consecutive execution of the command queues the sounds, the next sound would not start until the previous sound is finished, hence the need for the short sounds. The simulation of speed of sound would delay next sound and might mess with the timing of the queued sounds, especially if used globally. Additionally the sounds are not synced for JIP players. A long playing sound will not be heard by newly joined payers. To summarise:\n>\n> - An object can only \"say\" **one** sound at a time\n> - In order to stop a say3D sound: delete the returned **sound source** with deleteVehicle, or kill the **sound source** with e.g setDamage.\n> - Forcing the speed of sound simulation may delay the queued sound to play right after the previous sound, even if the second sound does not simulate sound delay (e.g sound 1 plays with a 5s delay, ends, *then* sound 2 plays). If the queued sound uses speed of sound simulation, it will be delayed from the end of the first sound (they will not follow \"as expected\"). Makes the *offset* parameter ignored.\n> - **Do use** it for short distance short sounds with speed of sound simulation off.\n> - When used with 'isGlobal' option, a null NetObject is returned. To stop such sound globally, destroy the sound source 'from' object.","syntaxes":[{"syntax":"from say3D sound","since":null,"effect":null,"exec":null,"params":[{"name":"from","type":"Object or Array of Objects","optional":true,"default":"objNull","description":"Object or Array of Objects\n- Object - origin of the sound\n- Array with [from, to]\n  - from: Object - origin of the sound\n  - to: Object -  target","types":["Object","Array"],"since":null,"text":"from: Object or Array of Objects\n- Object - origin of the sound\n- Array with [from, to]\n  - from: Object - origin of the sound\n  - to: Object - (Optional, default objNull) target"},{"name":"sound","type":"String or Array","optional":true,"default":"100","description":"String or Array\n- String - classname of the sound to be played. Defined in CfgSounds including Description.ext\n- Array with [sound, maxDistance, pitchCoef, isSpeech, offset, simulateSpeedOfSound, playMode, isGlobal]\n  - sound: String - classname of the sound to be played. Defined in CfgSounds including Description.ext\n  - maxDistance: Number -  maximum distance in meters at which the sound can be heard. -1 to use the maxDistance from the sound config\n  - pitchCoef: Number - (Optional, default 1) **multiplier** to the CfgSounds defined pitch. The final audio pitch is clipped between 0.5 and 2.0\n  - Arma 3 v1.92 isSpeech: Boolean or Arma 3 v2.04 Number - (Optional, default false)\n    - 0/false = play as sound (fadeSound applies)\n    - 1/true = play as speech (fadeSpeech applies), filters are not applied to it (i.e. house or vehicle interior one)\n    - 2 = play as sound (fadeSound applies) without interior/vehicle muffling\n  - Arma 3 v2.00 offset: Number - (Optional, default 0) offset in seconds; ignored when *simulateSpeedOfSound* is used\n  - Arma 3 v2.18 simulateSpeedOfSound: Boolean - (Optional, default false) true to simulate speed of sound (see description note)\n  - Arma 3 v2.24 isInside: Boolean - (Optional, default false) true if the sound is well audible inside the source (only for 'isSpeech' 0/false)\n  - Arma 3 v2.24 playMode: Number - (Optional, default 0) Could be one of the following:\n    - 0 - queued sound playback. The same source plays queued sounds in sequence\n    - 1 - single sound playback. The queue is cleared and a single sound is played instantly\n    - 2 - multiple sounds playback. The same source can play multiple sounds simultaneously and instantly\n  - Arma 3 v2.24 isGlobal: Boolean - (Optional, default false) true to play the sound on every client currently in game","types":["String","Array"],"since":null,"text":"sound: String or Array\n- String - classname of the sound to be played. Defined in CfgSounds including Description.ext\n- Array with [sound, maxDistance, pitchCoef, isSpeech, offset, simulateSpeedOfSound, playMode, isGlobal]\n  - sound: String - classname of the sound to be played. Defined in CfgSounds including Description.ext\n  - maxDistance: Number - (Optional, default 100) maximum distance in meters at which the sound can be heard. -1 to use the maxDistance from the sound config\n  - pitchCoef: Number - (Optional, default 1) **multiplier** to the CfgSounds defined pitch. The final audio pitch is clipped between 0.5 and 2.0\n  - Arma 3 v1.92 isSpeech: Boolean or Arma 3 v2.04 Number - (Optional, default false)\n    - 0/false = play as sound (fadeSound applies)\n    - 1/true = play as speech (fadeSpeech applies), filters are not applied to it (i.e. house or vehicle interior one)\n    - 2 = play as sound (fadeSound applies) without interior/vehicle muffling\n  - Arma 3 v2.00 offset: Number - (Optional, default 0) offset in seconds; ignored when *simulateSpeedOfSound* is used\n  - Arma 3 v2.18 simulateSpeedOfSound: Boolean - (Optional, default false) true to simulate speed of sound (see description note)\n  - Arma 3 v2.24 isInside: Boolean - (Optional, default false) true if the sound is well audible inside the source (only for 'isSpeech' 0/false)\n  - Arma 3 v2.24 playMode: Number - (Optional, default 0) Could be one of the following:\n    - 0 - queued sound playback. The same source plays queued sounds in sequence\n    - 1 - single sound playback. The queue is cleared and a single sound is played instantly\n    - 2 - multiple sounds playback. The same source can play multiple sounds simultaneously and instantly\n  - Arma 3 v2.24 isGlobal: Boolean - (Optional, default false) true to play the sound on every client currently in game"}],"returns":{"type":"Object","types":["Object"],"description":"the sound source or NetObject - when 'isGlobal' is true","text":"Object - the sound source or NetObject - when 'isGlobal' is true"},"form":"binary","operator":null,"left":{"text":"from","types":["Object","Array"]},"right":{"text":"sound","types":["String","Array"]}}],"examples":[{"text":"All possible combinations:\n\n```sqf\nhelicopter1 say3D \"FortunateSon\";\nhelicopter1 say3D [\"FortunateSon\", 500, 1, 0, 0, true];\n[helicopter1, player] say3D \"FortunateSon\";\n[helicopter1, player] say3D [\"FortunateSon\", 500, 1, 0, 0, true];\n```","code":["helicopter1 say3D \"FortunateSon\";\nhelicopter1 say3D [\"FortunateSon\", 500, 1, 0, 0, true];\n[helicopter1, player] say3D \"FortunateSon\";\n[helicopter1, player] say3D [\"FortunateSon\", 500, 1, 0, 0, true];"]},{"text":"Workaround for dead bodies:\n\n```sqf\nprivate _dummy = \"#particlesource\" createVehicleLocal ASLToAGL getPosWorld _corpse;\n_dummy say3D \"whatever\";\n_dummy spawn {\n    sleep 5; // at least the length of your sound\n    deleteVehicle _this;\n};\n```","code":["private _dummy = \"#particlesource\" createVehicleLocal ASLToAGL getPosWorld _corpse;\n_dummy say3D \"whatever\";\n_dummy spawn {\n\tsleep 5; // at least the length of your sound\n\tdeleteVehicle _this;\n};"]},{"text":"```sqf\n// Since Arma 3 v2.00, the sound source is returned and can be deleted directly\n_soundSrc = helicopter1 say3D \"Fortunateson\";\nsleep 5;\ndeleteVehicle _soundSrc; // stop the sound after ~5 seconds\n```","code":["// Since Arma 3 v2.00, the sound source is returned and can be deleted directly\n_soundSrc = helicopter1 say3D \"Fortunateson\";\nsleep 5;\ndeleteVehicle _soundSrc; // stop the sound after ~5 seconds"]}],"multiplayer":null,"problems":null,"aliases":[],"see_also":["say","say2D","playSound","playSound3D","createSoundSource","playSoundUI","setRandomLip","stopSound","soundParams"],"notes":[{"user":"Rocket","date":"2013-03-07T13:17:00Z","text":"The only difference with this command and say is during cutscenes (when some camera effect is active). In cutscenes, say3D is 3D, say is not."},{"user":"Benargee","date":"2015-06-19T21:26:00Z","text":"In Arma 2 1.63, the object this command is assigned to must be alive for the sound to broadcast. If the object is killed while the sound is still playing, the sound will stop immediately.\n\nHere is [a link to the forum](http://forums.bistudio.com/showthread.php?146122-Making-a-dead-soldier-play-a-sound-in-3d) to get around this issue.\n\nI have not tested this in Arma 3 yet."},{"user":"Killzone_Kid","date":"2017-03-11T14:43:00Z","text":"This command creates sound object \"#soundonvehicle\" which can be detected with allMissionObjects\n\n```sqf\nonEachFrame { hintSilent str allMissionObjects \"#soundonvehicle\" };\n0 spawn { sleep 1; player say3D \"Alarm\" };\n```"}],"categories":["Arma 2: New Scripting Commands","Arma 2: Operation Arrowhead: Scripting Commands","Arma 2: Scripting Commands","Arma 3: Scripting Commands","Command Group: Sounds","Introduced with Arma 2 version 1.00","Scripting Commands","Scripting Commands: Local Effect","Take On Helicopters: Scripting Commands"]}