PlayGlobalSoundCommand.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using System.Linq;
  2. using Content.Server.Audio;
  3. using Content.Shared.Administration;
  4. using Robust.Server.Player;
  5. using Robust.Shared.Audio;
  6. using Robust.Shared.Console;
  7. using Robust.Shared.ContentPack;
  8. using Robust.Shared.Player;
  9. using Robust.Shared.Prototypes;
  10. namespace Content.Server.Administration.Commands;
  11. [AdminCommand(AdminFlags.Fun)]
  12. public sealed class PlayGlobalSoundCommand : IConsoleCommand
  13. {
  14. [Dependency] private readonly IEntityManager _entManager = default!;
  15. [Dependency] private readonly IPlayerManager _playerManager = default!;
  16. [Dependency] private readonly IPrototypeManager _protoManager = default!;
  17. [Dependency] private readonly IResourceManager _res = default!;
  18. public string Command => "playglobalsound";
  19. public string Description => Loc.GetString("play-global-sound-command-description");
  20. public string Help => Loc.GetString("play-global-sound-command-help");
  21. public void Execute(IConsoleShell shell, string argStr, string[] args)
  22. {
  23. Filter filter;
  24. var audio = AudioParams.Default;
  25. bool replay = true;
  26. switch (args.Length)
  27. {
  28. // No arguments, show command help.
  29. case 0:
  30. shell.WriteLine(Loc.GetString("play-global-sound-command-help"));
  31. return;
  32. // No users, play sound for everyone.
  33. case 1:
  34. // Filter.Broadcast does resolves IPlayerManager, so use this instead.
  35. filter = Filter.Empty().AddAllPlayers(_playerManager);
  36. break;
  37. // One or more users specified.
  38. default:
  39. var volumeOffset = 0;
  40. // Try to specify a new volume to play it at.
  41. if (int.TryParse(args[1], out var volume))
  42. {
  43. audio = audio.WithVolume(volume);
  44. volumeOffset = 1;
  45. }
  46. else
  47. {
  48. shell.WriteError(Loc.GetString("play-global-sound-command-volume-parse", ("volume", args[1])));
  49. return;
  50. }
  51. // No users specified so play for them all.
  52. if (args.Length == 2)
  53. {
  54. filter = Filter.Empty().AddAllPlayers(_playerManager);
  55. }
  56. else
  57. {
  58. replay = false;
  59. filter = Filter.Empty();
  60. // Skip the first argument, which is the sound path.
  61. for (var i = 1 + volumeOffset; i < args.Length; i++)
  62. {
  63. var username = args[i];
  64. if (!_playerManager.TryGetSessionByUsername(username, out var session))
  65. {
  66. shell.WriteError(Loc.GetString("play-global-sound-command-player-not-found", ("username", username)));
  67. continue;
  68. }
  69. filter.AddPlayer(session);
  70. }
  71. }
  72. break;
  73. }
  74. audio = audio.AddVolume(-8);
  75. _entManager.System<ServerGlobalSoundSystem>().PlayAdminGlobal(filter, args[0], audio, replay);
  76. }
  77. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  78. {
  79. if (args.Length == 1)
  80. {
  81. var hint = Loc.GetString("play-global-sound-command-arg-path");
  82. var options = CompletionHelper.AudioFilePath(args[0], _protoManager, _res);
  83. return CompletionResult.FromHintOptions(options, hint);
  84. }
  85. if (args.Length == 2)
  86. return CompletionResult.FromHint(Loc.GetString("play-global-sound-command-arg-volume"));
  87. if (args.Length > 2)
  88. {
  89. var options = _playerManager.Sessions.Select<ICommonSession, string>(c => c.Name);
  90. return CompletionResult.FromHintOptions(
  91. options,
  92. Loc.GetString("play-global-sound-command-arg-usern", ("user", args.Length - 2)));
  93. }
  94. return CompletionResult.Empty;
  95. }
  96. }