From 9d174cd87d81014763e029db0f15d52586b054a4 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 11 Nov 2023 22:56:21 +0000 Subject: [PATCH] Add a button to reset lobby options to default. --- .../ServerTraits/LobbyCommands.cs | 44 +++++++++++++++++++ .../Widgets/Logic/Lobby/LobbyLogic.cs | 28 +++++++++++- mods/cnc/chrome/lobby.yaml | 6 +++ mods/cnc/languages/chrome/en.ftl | 1 + mods/common/chrome/lobby.yaml | 7 +++ mods/common/languages/chrome/en.ftl | 1 + 6 files changed, 86 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index 67706e5c1c..c52204b90c 100644 --- a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs @@ -177,6 +177,7 @@ namespace OpenRA.Mods.Common.Server { "slot_bot", SlotBot }, { "map", Map }, { "option", Option }, + { "reset_options", ResetOptions }, { "assignteams", AssignTeams }, { "kick", Kick }, { "vote_kick", VoteKick }, @@ -744,6 +745,49 @@ namespace OpenRA.Mods.Common.Server } } + static bool ResetOptions(S server, Connection conn, Session.Client client, string s) + { + lock (server.LobbyInfo) + { + if (!client.IsAdmin) + { + server.SendLocalizedMessageTo(conn, NotAdmin); + return true; + } + + var allOptions = server.Map.PlayerActorInfo.TraitInfos() + .Concat(server.Map.WorldActorInfo.TraitInfos()) + .SelectMany(t => t.LobbyOptions(server.Map)); + + var options = new Dictionary(); + foreach (var o in allOptions) + { + if (o.DefaultValue != server.LobbyInfo.GlobalSettings.LobbyOptions[o.Id].Value) + server.SendLocalizedMessage(ValueChanged, Translation.Arguments( + "player", client.Name, + "name", o.Name, + "value", o.Label(o.DefaultValue))); + + options[o.Id] = new Session.LobbyOptionState + { + IsLocked = o.IsLocked, + Value = o.DefaultValue, + PreferredValue = o.DefaultValue + }; + } + + server.LobbyInfo.GlobalSettings.LobbyOptions = options; + server.SyncLobbyGlobalSettings(); + + foreach (var c in server.LobbyInfo.Clients) + c.State = Session.ClientState.NotReady; + + server.SyncLobbyClients(); + + return true; + } + } + static bool AssignTeams(S server, Connection conn, Session.Client client, string raw) { lock (server.LobbyInfo) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs index 248567fe01..280ebc5ea6 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs @@ -103,6 +103,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic bool insufficientPlayerSpawns; bool teamChat; bool updateDiscordStatus = true; + bool resetOptionsButtonEnabled; Dictionary spawnOccupants = new(); readonly string chatLineSound; @@ -167,6 +168,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic Game.LobbyInfoChanged += UpdatePlayerList; Game.LobbyInfoChanged += UpdateDiscordStatus; Game.LobbyInfoChanged += UpdateSpawnOccupants; + Game.LobbyInfoChanged += UpdateOptions; Game.BeforeGameStart += OnGameStart; Game.ConnectionStateChanged += ConnectionStateChanged; @@ -263,7 +265,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var slotsButton = lobby.GetOrNull("SLOTS_DROPDOWNBUTTON"); if (slotsButton != null) { - slotsButton.IsVisible = () => panel != PanelType.Servers; + slotsButton.IsVisible = () => panel != PanelType.Servers && panel != PanelType.Options; slotsButton.IsDisabled = () => configurationDisabled() || panel != PanelType.Players || (orderManager.LobbyInfo.Slots.Values.All(s => !s.AllowBots) && !orderManager.LobbyInfo.Slots.Any(s => !s.Value.LockTeam && orderManager.LobbyInfo.ClientInSlot(s.Key) != null)); @@ -357,6 +359,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; } + var resetOptionsButton = lobby.GetOrNull("RESET_OPTIONS_BUTTON"); + if (resetOptionsButton != null) + { + resetOptionsButton.IsVisible = () => panel == PanelType.Options; + resetOptionsButton.IsDisabled = () => configurationDisabled() || !resetOptionsButtonEnabled; + resetOptionsButton.OnMouseDown = _ => orderManager.IssueOrder(Order.Command("reset_options")); + } + var optionsBin = Ui.LoadWidget("LOBBY_OPTIONS_BIN", lobby.Get("TOP_PANELS_ROOT"), new WidgetArgs() { { "orderManager", orderManager }, @@ -910,6 +920,22 @@ namespace OpenRA.Mods.Common.Widgets.Logic .ToDictionary(c => c.SpawnPoint, c => new SpawnOccupant(c)); } + void UpdateOptions() + { + if (map == null || map.WorldActorInfo == null) + return; + + var serverOptions = orderManager.LobbyInfo.GlobalSettings.LobbyOptions; + var mapOptions = map.PlayerActorInfo.TraitInfos() + .Concat(map.WorldActorInfo.TraitInfos()) + .SelectMany(t => t.LobbyOptions(map)) + .Where(o => o.IsVisible) + .OrderBy(o => o.DisplayOrder) + .ToArray(); + + resetOptionsButtonEnabled = mapOptions.Any(o => o.DefaultValue != serverOptions[o.Id].Value); + } + void OnGameStart() { Ui.CloseWindow(); diff --git a/mods/cnc/chrome/lobby.yaml b/mods/cnc/chrome/lobby.yaml index 9914a4be3b..3164952124 100644 --- a/mods/cnc/chrome/lobby.yaml +++ b/mods/cnc/chrome/lobby.yaml @@ -34,6 +34,12 @@ Container@SERVER_LOBBY: Width: 211 Height: 25 Text: dropdownbutton-bg-slots + Button@RESET_OPTIONS_BUTTON: + X: 15 + Y: 254 + Width: 211 + Height: 25 + Text: button-bg-reset-options Container@SKIRMISH_TABS: X: 697 - WIDTH Width: 465 diff --git a/mods/cnc/languages/chrome/en.ftl b/mods/cnc/languages/chrome/en.ftl index 9d727b4d0f..ef1bf87753 100644 --- a/mods/cnc/languages/chrome/en.ftl +++ b/mods/cnc/languages/chrome/en.ftl @@ -409,6 +409,7 @@ dropdownbutton-lobby-servers-bin-filters = Filter Games ## lobby.yaml dropdownbutton-bg-slots = Slot Admin +button-bg-reset-options = Reset Defaults button-skirmish-tabs-players-tab = Players button-skirmish-tabs-options-tab = Options button-skirmish-tabs-music-tab = Music diff --git a/mods/common/chrome/lobby.yaml b/mods/common/chrome/lobby.yaml index 04fb04e9f2..c091372736 100644 --- a/mods/common/chrome/lobby.yaml +++ b/mods/common/chrome/lobby.yaml @@ -30,6 +30,13 @@ Background@SERVER_LOBBY: Height: 25 Font: Bold Text: dropdownbutton-server-lobby-slots + Button@RESET_OPTIONS_BUTTON: + X: 20 + Y: 291 + Width: 185 + Height: 25 + Font: Bold + Text: button-server-lobby-reset-options Container@SKIRMISH_TABS: X: 695 - WIDTH Width: 486 diff --git a/mods/common/languages/chrome/en.ftl b/mods/common/languages/chrome/en.ftl index 5ae2dce5b1..927ff8cd15 100644 --- a/mods/common/languages/chrome/en.ftl +++ b/mods/common/languages/chrome/en.ftl @@ -260,6 +260,7 @@ label-notice-container-playtest-available = A preview of the next OpenRA release ## lobby.yaml dropdownbutton-server-lobby-slots = Slot Admin +button-server-lobby-reset-options = Reset Defaults button-skirmish-tabs-players-tab = Players button-skirmish-tabs-options-tab = Options button-skirmish-tabs-music-tab = Music