diff --git a/Content.Client/Administration/Commands/PlayGlobalSoundCommand.cs b/Content.Client/Administration/Commands/PlayGlobalSoundCommand.cs deleted file mode 100644 index e52bf2d33a..0000000000 --- a/Content.Client/Administration/Commands/PlayGlobalSoundCommand.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Linq; -using Robust.Client.Player; -using Robust.Shared.Console; -using Robust.Shared.ContentPack; - -namespace Content.Client.Administration.Commands; - -/// -/// Proxy to server-side playglobalsound command. Implements completions. -/// -public sealed class PlayGlobalSoundCommand : IConsoleCommand -{ - public string Command => "playglobalsound"; - public string Description => Loc.GetString("play-global-sound-command-description"); - public string Help => Loc.GetString("play-global-sound-command-help"); - - public void Execute(IConsoleShell shell, string argStr, string[] args) - { - shell.RemoteExecuteCommand(argStr); - } - - public CompletionResult GetCompletion(IConsoleShell shell, string[] args) - { - if (args.Length == 1) - { - var hint = Loc.GetString("play-global-sound-command-arg-path"); - var res = IoCManager.Resolve(); - - var options = CompletionHelper.ContentFilePath(args[0], res); - - return CompletionResult.FromHintOptions(options, hint); - } - - if (args.Length == 2) - return CompletionResult.FromHint(Loc.GetString("play-global-sound-command-arg-volume")); - - if (args.Length > 2) - { - var plyMgr = IoCManager.Resolve(); - var options = plyMgr.Sessions.Select(c => c.Name); - return CompletionResult.FromHintOptions( - options, - Loc.GetString("play-global-sound-command-arg-usern", ("user", args.Length - 2))); - } - - return CompletionResult.Empty; - } -} diff --git a/Content.Server/Administration/Commands/PlayGlobalSoundCommand.cs b/Content.Server/Administration/Commands/PlayGlobalSoundCommand.cs new file mode 100644 index 0000000000..fdd3173809 --- /dev/null +++ b/Content.Server/Administration/Commands/PlayGlobalSoundCommand.cs @@ -0,0 +1,119 @@ +using System.Linq; +using Content.Server.Audio; +using Content.Shared.Administration; +using Robust.Server.Player; +using Robust.Shared.Audio; +using Robust.Shared.Console; +using Robust.Shared.ContentPack; +using Robust.Shared.Player; +using Robust.Shared.Players; +using Robust.Shared.Prototypes; + +namespace Content.Server.Administration.Commands; + +[AdminCommand(AdminFlags.Fun)] +public sealed class PlayGlobalSoundCommand : IConsoleCommand +{ + [Dependency] private readonly IEntityManager _entManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IResourceManager _res = default!; + + public string Command => "playglobalsound"; + public string Description => Loc.GetString("play-global-sound-command-description"); + public string Help => Loc.GetString("play-global-sound-command-help"); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + Filter filter; + var audio = AudioParams.Default; + + bool replay = true; + + switch (args.Length) + { + // No arguments, show command help. + case 0: + shell.WriteLine(Loc.GetString("play-global-sound-command-help")); + return; + + // No users, play sound for everyone. + case 1: + // Filter.Broadcast does resolves IPlayerManager, so use this instead. + filter = Filter.Empty().AddAllPlayers(_playerManager); + break; + + // One or more users specified. + default: + var volumeOffset = 0; + + // Try to specify a new volume to play it at. + if (int.TryParse(args[1], out var volume)) + { + audio = audio.WithVolume(volume); + volumeOffset = 1; + } + else + { + shell.WriteError(Loc.GetString("play-global-sound-command-volume-parse", ("volume", args[1]))); + return; + } + + // No users specified so play for them all. + if (args.Length == 2) + { + filter = Filter.Empty().AddAllPlayers(_playerManager); + } + else + { + // TODO REPLAYS uhhh.. what to do with this? + replay = false; + + filter = Filter.Empty(); + + // Skip the first argument, which is the sound path. + for (var i = 1 + volumeOffset; i < args.Length; i++) + { + var username = args[i]; + + if (!_playerManager.TryGetSessionByUsername(username, out var session)) + { + shell.WriteError(Loc.GetString("play-global-sound-command-player-not-found", ("username", username))); + continue; + } + + filter.AddPlayer(session); + } + } + + break; + } + + audio = audio.AddVolume(-8); + _entManager.System().PlayAdminGlobal(filter, args[0], audio, replay); + } + + public CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + var hint = Loc.GetString("play-global-sound-command-arg-path"); + + var options = CompletionHelper.ContentFilePath(args[0], _res); + + return CompletionResult.FromHintOptions(options, hint); + } + + if (args.Length == 2) + return CompletionResult.FromHint(Loc.GetString("play-global-sound-command-arg-volume")); + + if (args.Length > 2) + { + var options = _playerManager.Sessions.Select(c => c.Name); + return CompletionResult.FromHintOptions( + options, + Loc.GetString("play-global-sound-command-arg-usern", ("user", args.Length - 2))); + } + + return CompletionResult.Empty; + } +} diff --git a/Content.Server/Audio/ServerGlobalSoundSystem.cs b/Content.Server/Audio/ServerGlobalSoundSystem.cs index 714403fe83..df8771df8d 100644 --- a/Content.Server/Audio/ServerGlobalSoundSystem.cs +++ b/Content.Server/Audio/ServerGlobalSoundSystem.cs @@ -1,9 +1,5 @@ -using Content.Server.Administration; -using Content.Server.Station.Components; -using Content.Server.Station.Systems; -using Content.Shared.Administration; +using Content.Server.Station.Systems; using Content.Shared.Audio; -using Robust.Server.Player; using Robust.Shared.Audio; using Robust.Shared.Console; using Robust.Shared.Player; @@ -13,22 +9,15 @@ namespace Content.Server.Audio; public sealed class ServerGlobalSoundSystem : SharedGlobalSoundSystem { [Dependency] private readonly IConsoleHost _conHost = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly StationSystem _stationSystem = default!; - public override void Initialize() - { - base.Initialize(); - _conHost.RegisterCommand("playglobalsound", Loc.GetString("play-global-sound-command-description"), Loc.GetString("play-global-sound-command-help"), PlayGlobalSoundCommand); - } - public override void Shutdown() { base.Shutdown(); _conHost.UnregisterCommand("playglobalsound"); } - private void PlayAdminGlobal(Filter playerFilter, string filename, AudioParams? audioParams = null, bool replay = true) + public void PlayAdminGlobal(Filter playerFilter, string filename, AudioParams? audioParams = null, bool replay = true) { var msg = new AdminSoundEvent(filename, audioParams); RaiseNetworkEvent(msg, playerFilter, recordReplay: replay); @@ -68,78 +57,4 @@ public sealed class ServerGlobalSoundSystem : SharedGlobalSoundSystem var filter = GetStationAndPvs(source); RaiseNetworkEvent(msg, filter); } - - /// - /// Command that allows admins to play global sounds. - /// - [AdminCommand(AdminFlags.Fun)] - public void PlayGlobalSoundCommand(IConsoleShell shell, string argStr, string[] args) - { - Filter filter; - var audio = AudioParams.Default; - - bool replay = true; - - switch (args.Length) - { - // No arguments, show command help. - case 0: - shell.WriteLine(Loc.GetString("play-global-sound-command-help")); - return; - - // No users, play sound for everyone. - case 1: - // Filter.Broadcast does resolves IPlayerManager, so use this instead. - filter = Filter.Empty().AddAllPlayers(_playerManager); - break; - - // One or more users specified. - default: - var volumeOffset = 0; - - // Try to specify a new volume to play it at. - if (int.TryParse(args[1], out var volume)) - { - audio = audio.WithVolume(volume); - volumeOffset = 1; - } - else - { - shell.WriteError(Loc.GetString("play-global-sound-command-volume-parse", ("volume", args[1]))); - return; - } - - // No users specified so play for them all. - if (args.Length == 2) - { - filter = Filter.Empty().AddAllPlayers(_playerManager); - } - else - { - // TODO REPLAYS uhhh.. what to do with this? - replay = false; - - filter = Filter.Empty(); - - // Skip the first argument, which is the sound path. - for (var i = 1 + volumeOffset; i < args.Length; i++) - { - var username = args[i]; - - if (!_playerManager.TryGetSessionByUsername(username, out var session)) - { - shell.WriteError(Loc.GetString("play-global-sound-command-player-not-found", ("username", username))); - continue; - } - - filter.AddPlayer(session); - } - } - - break; - } - - audio = audio.AddVolume(-8); - PlayAdminGlobal(filter, args[0], audio, replay); - } }