using Robust.Server.Audio;
using Robust.Server.GameObjects;
using Robust.Server.Player;
+using Robust.Shared.Player;
namespace Content.Server.Radiation.Systems;
if (!component.Sounds.TryGetValue(component.DangerLevel, out var sounds))
return;
- if (component.User == null)
- return;
-
- if (!_player.TryGetSessionByEntity(component.User.Value, out var session))
- return;
-
var sound = _audio.ResolveSound(sounds);
- var param = sounds.Params.WithLoop(true).WithVolume(-4f);
+ var param = sounds.Params.WithLoop(true).WithVolume(component.Volume);
- component.Stream = _audio.PlayGlobal(sound, session, param)?.Entity;
+ if (component.BroadcastAudio)
+ {
+ // For some reason PlayPvs sounds quieter even at distance 0, so we need to boost the volume a bit for consistency
+ param = sounds.Params.WithLoop(true).WithVolume(component.Volume + 1.5f).WithMaxDistance(component.BroadcastRange);
+ component.Stream = _audio.PlayPvs(sound, uid, param)?.Entity;
+ }
+ else if(component.User is not null && _player.TryGetSessionByEntity(component.User.Value, out var session))
+ component.Stream = _audio.PlayGlobal(sound, session, param)?.Entity;
}
public static GeigerDangerLevel RadsToLevel(float rads)
/// Played only for current user.
/// </summary>
public EntityUid? Stream;
+
+ /// <summary>
+ /// Mark true if the audio should be heard by everyone around the device
+ /// </summary>
+ [DataField]
+ public bool BroadcastAudio = false;
+
+ /// <summary>
+ /// The distance within which the broadcast tone can be heard.
+ /// </summary>
+ [DataField]
+ public float BroadcastRange = 4f;
+
+ /// <summary>
+ /// The volume of the warning tone.
+ /// </summary>
+ [DataField]
+ public float Volume = -4f;
}
[Serializable, NetSerializable]
name: Geiger counter
description: A handheld device used for detecting and measuring radiation pulses.
components:
- - type: Sprite
- sprite: Objects/Tools/geiger.rsi
- layers:
- - state: geiger_base
- - state: geiger_on_idle
- map: ["enum.GeigerLayers.Screen"]
- shader: unshaded
- visible: false
- - type: Item
- sprite: Objects/Tools/geiger.rsi
- - type: Geiger
- showControl: true
- showExamine: true
- - type: Appearance
- - type: GenericVisualizer
- visuals:
- enum.GeigerVisuals.IsEnabled:
- GeigerLayers.Screen:
- True: { visible: True }
- False: { visible: False }
- enum.GeigerVisuals.DangerLevel:
- GeigerLayers.Screen:
- None: {state: geiger_on_idle}
- Low: {state: geiger_on_low}
- Med: {state: geiger_on_med}
- High: {state: geiger_on_high}
- Extreme: {state: geiger_on_ext}
- - type: PhysicalComposition
- materialComposition:
- Plastic: 100
-
+ - type: Sprite
+ sprite: Objects/Tools/geiger.rsi
+ layers:
+ - state: geiger_base
+ - state: geiger_on_idle
+ map: ["enum.GeigerLayers.Screen"]
+ shader: unshaded
+ visible: false
+ - type: Item
+ sprite: Objects/Tools/geiger.rsi
+ - type: Geiger
+ showControl: true
+ showExamine: true
+ broadcastAudio: true
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.GeigerVisuals.IsEnabled:
+ GeigerLayers.Screen:
+ True: { visible: True }
+ False: { visible: False }
+ enum.GeigerVisuals.DangerLevel:
+ GeigerLayers.Screen:
+ None: {state: geiger_on_idle}
+ Low: {state: geiger_on_low}
+ Med: {state: geiger_on_med}
+ High: {state: geiger_on_high}
+ Extreme: {state: geiger_on_ext}
+ - type: PhysicalComposition
+ materialComposition:
+ Plastic: 100