From 4a8295c49dcc6418cf93390ae10965450cd19c42 Mon Sep 17 00:00:00 2001 From: orwenn22 <46846090+orwenn22@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:57:21 +0100 Subject: [PATCH] Add keybindings for readying and spectating in multi rooms --- .../Input/Bindings/GlobalActionContainer.cs | 17 ++++++++++++ .../GlobalActionKeyBindingStrings.cs | 10 +++++++ osu.Game/Localisation/InputSettingsStrings.cs | 5 ++++ .../Input/GlobalKeyBindingsSection.cs | 1 + .../Multiplayer/Match/MatchStartControl.cs | 27 ++++++++++++++++++- .../Match/MultiplayerSpectateButton.cs | 27 ++++++++++++++++++- 6 files changed, 85 insertions(+), 2 deletions(-) diff --git a/osu.Game/Input/Bindings/GlobalActionContainer.cs b/osu.Game/Input/Bindings/GlobalActionContainer.cs index 170d247023..282aafb960 100644 --- a/osu.Game/Input/Bindings/GlobalActionContainer.cs +++ b/osu.Game/Input/Bindings/GlobalActionContainer.cs @@ -36,6 +36,7 @@ namespace osu.Game.Input.Bindings .Concat(editorKeyBindings) .Concat(editorTestPlayKeyBindings) .Concat(inGameKeyBindings) + .Concat(multiplayerKeyBindings) .Concat(replayKeyBindings) .Concat(songSelectKeyBindings) .Concat(audioControlKeyBindings) @@ -57,6 +58,9 @@ namespace osu.Game.Input.Bindings case GlobalActionCategory.InGame: return inGameKeyBindings; + case GlobalActionCategory.Multiplayer: + return multiplayerKeyBindings; + case GlobalActionCategory.Replay: return replayKeyBindings; @@ -186,6 +190,12 @@ namespace osu.Game.Input.Bindings new KeyBinding(InputKey.Minus, GlobalAction.DecreaseOffset), }; + private static IEnumerable multiplayerKeyBindings => new[] + { + new KeyBinding(new[] { InputKey.Control, InputKey.R }, GlobalAction.MultiplayerReady), + new KeyBinding(new[] { InputKey.Control, InputKey.S }, GlobalAction.MultiplayerSpectate), + }; + private static IEnumerable replayKeyBindings => new[] { new KeyBinding(InputKey.Space, GlobalAction.TogglePauseReplay), @@ -492,6 +502,12 @@ namespace osu.Game.Input.Bindings [LocalisableDescription(typeof(GlobalActionKeyBindingStrings), nameof(GlobalActionKeyBindingStrings.EditorSeekToNextBookmark))] EditorSeekToNextBookmark, + + [LocalisableDescription(typeof(GlobalActionKeyBindingStrings), nameof(GlobalActionKeyBindingStrings.MultiplayerReady))] + MultiplayerReady, + + [LocalisableDescription(typeof(GlobalActionKeyBindingStrings), nameof(GlobalActionKeyBindingStrings.MultiplayerSpectate))] + MultiplayerSpectate, } public enum GlobalActionCategory @@ -499,6 +515,7 @@ namespace osu.Game.Input.Bindings General, Editor, InGame, + Multiplayer, Replay, SongSelect, AudioControl, diff --git a/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs b/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs index f9db0461ce..412eca6949 100644 --- a/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs +++ b/osu.Game/Localisation/GlobalActionKeyBindingStrings.cs @@ -449,6 +449,16 @@ namespace osu.Game.Localisation /// public static LocalisableString EditorSeekToNextBookmark => new TranslatableString(getKey(@"editor_seek_to_next_bookmark"), @"Seek to next bookmark"); + /// + /// "Ready" + /// + public static LocalisableString MultiplayerReady => new TranslatableString(getKey(@"multiplayer_ready"), @"Ready"); + + /// + /// "Spectate" + /// + public static LocalisableString MultiplayerSpectate => new TranslatableString(getKey(@"multiplayer_spectate"), @"Spectate"); + private static string getKey(string key) => $@"{prefix}:{key}"; } } diff --git a/osu.Game/Localisation/InputSettingsStrings.cs b/osu.Game/Localisation/InputSettingsStrings.cs index bc1a7e68ab..3201b5de09 100644 --- a/osu.Game/Localisation/InputSettingsStrings.cs +++ b/osu.Game/Localisation/InputSettingsStrings.cs @@ -34,6 +34,11 @@ namespace osu.Game.Localisation /// public static LocalisableString InGameSection => new TranslatableString(getKey(@"in_game_section"), @"In Game"); + /// + /// "Multiplayer" + /// + public static LocalisableString MultiplayerSection => new TranslatableString(getKey(@"multiplayer_section"), @"Multiplayer"); + /// /// "Replay" /// diff --git a/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSection.cs b/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSection.cs index e5bc6cbe8a..1d5599e022 100644 --- a/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSection.cs +++ b/osu.Game/Overlays/Settings/Sections/Input/GlobalKeyBindingsSection.cs @@ -29,6 +29,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input new GlobalKeyBindingsSubsection(InputSettingsStrings.AudioSection, GlobalActionCategory.AudioControl), new GlobalKeyBindingsSubsection(InputSettingsStrings.SongSelectSection, GlobalActionCategory.SongSelect), new GlobalKeyBindingsSubsection(InputSettingsStrings.InGameSection, GlobalActionCategory.InGame), + new GlobalKeyBindingsSubsection(InputSettingsStrings.MultiplayerSection, GlobalActionCategory.Multiplayer), new GlobalKeyBindingsSubsection(InputSettingsStrings.ReplaySection, GlobalActionCategory.Replay), new GlobalKeyBindingsSubsection(InputSettingsStrings.EditorSection, GlobalActionCategory.Editor), new GlobalKeyBindingsSubsection(InputSettingsStrings.EditorTestPlaySection, GlobalActionCategory.EditorTestPlay), diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MatchStartControl.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MatchStartControl.cs index 0d90d44496..c812dbd1a7 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MatchStartControl.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MatchStartControl.cs @@ -11,7 +11,10 @@ using osu.Framework.Bindables; using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Input.Bindings; +using osu.Framework.Input.Events; using osu.Framework.Threading; +using osu.Game.Input.Bindings; using osu.Game.Online.Multiplayer; using osu.Game.Online.Multiplayer.Countdown; using osu.Game.Online.Rooms; @@ -21,7 +24,7 @@ using osuTK; namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match { - public partial class MatchStartControl : CompositeDrawable + public partial class MatchStartControl : CompositeDrawable, IKeyBindingHandler { public required Bindable SelectedItem { @@ -251,6 +254,28 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match }); } + public bool OnPressed(KeyBindingPressEvent e) + { + if (!readyButton.Enabled.Value) + { + return false; + } + + switch (e.Action) + { + case GlobalAction.MultiplayerReady: + onReadyButtonClick(); + return true; + + default: + return false; + } + } + + public void OnReleased(KeyBindingReleaseEvent e) + { + } + protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerSpectateButton.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerSpectateButton.cs index 3186cf89a4..5f7ced4ed3 100644 --- a/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerSpectateButton.cs +++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Match/MultiplayerSpectateButton.cs @@ -8,18 +8,21 @@ using osu.Framework.Extensions; using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Input.Bindings; +using osu.Framework.Input.Events; using osu.Game.Beatmaps; using osu.Game.Configuration; using osu.Game.Database; using osu.Game.Graphics; using osu.Game.Graphics.UserInterfaceV2; +using osu.Game.Input.Bindings; using osu.Game.Online.Multiplayer; using osu.Game.Online.Rooms; using osuTK; namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match { - public partial class MultiplayerSpectateButton : CompositeDrawable + public partial class MultiplayerSpectateButton : CompositeDrawable, IKeyBindingHandler { public required Bindable SelectedItem { @@ -104,6 +107,28 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match Scheduler.AddOnce(checkForAutomaticDownload); } + public bool OnPressed(KeyBindingPressEvent e) + { + if (operationInProgress.Value) + { + return false; + } + + switch (e.Action) + { + case GlobalAction.MultiplayerSpectate: + onClick(); + return true; + + default: + return false; + } + } + + public void OnReleased(KeyBindingReleaseEvent e) + { + } + #region Automatic download handling [Resolved]