using Content.Server.Station.Systems; using Content.Shared.Audio; using Robust.Shared.Audio; using Robust.Shared.Console; using Robust.Shared.Player; namespace Content.Server.Audio; public sealed class ServerGlobalSoundSystem : SharedGlobalSoundSystem { [Dependency] private readonly IConsoleHost _conHost = default!; [Dependency] private readonly StationSystem _stationSystem = default!; public override void Shutdown() { base.Shutdown(); _conHost.UnregisterCommand("playglobalsound"); } public void PlayAdminGlobal(Filter playerFilter, string filename, AudioParams? audioParams = null, bool replay = true) { var msg = new AdminSoundEvent(filename, audioParams); RaiseNetworkEvent(msg, playerFilter, recordReplay: replay); } private Filter GetStationAndPvs(EntityUid source) { var stationFilter = _stationSystem.GetInOwningStation(source); stationFilter.AddPlayersByPvs(source, entityManager: EntityManager); return stationFilter; } public void PlayGlobalOnStation(EntityUid source, string filename, AudioParams? audioParams = null) { var msg = new GameGlobalSoundEvent(filename, audioParams); var filter = GetStationAndPvs(source); RaiseNetworkEvent(msg, filter); } public void StopStationEventMusic(EntityUid source, StationEventMusicType type) { // TODO REPLAYS // these start & stop events are gonna be a PITA // theres probably some nice way of handling them. Maybe it just needs dedicated replay data (in which case these events should NOT get recorded). var msg = new StopStationEventMusic(type); var filter = GetStationAndPvs(source); RaiseNetworkEvent(msg, filter); } public void DispatchStationEventMusic(EntityUid source, SoundSpecifier sound, StationEventMusicType type) { var audio = AudioParams.Default.WithVolume(-8); var soundFile = sound.GetSound(); var msg = new StationEventMusicEvent(soundFile, type, audio); var filter = GetStationAndPvs(source); RaiseNetworkEvent(msg, filter); } }