From 7c2be4ce3cb4830543942e237fe82b000c0e08b3 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 21 Dec 2022 15:03:18 +1300 Subject: [PATCH] Implement state prediction for lobby ready checkbox. --- .../Widgets/Logic/Lobby/LobbyUtils.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs index 4ca5af861b..4ea09c6e27 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyUtils.cs @@ -657,12 +657,21 @@ namespace OpenRA.Mods.Common.Widgets.Logic public static void SetupEditableReadyWidget(Widget parent, Session.Client c, OrderManager orderManager, MapPreview map, bool isEnabled) { var status = parent.Get("STATUS_CHECKBOX"); - status.IsChecked = () => orderManager.LocalClient.IsReady || c.Bot != null; status.IsVisible = () => true; status.IsDisabled = () => c.Bot != null || map.Status != MapStatus.Available || !isEnabled; - - var state = orderManager.LocalClient.IsReady ? Session.ClientState.NotReady : Session.ClientState.Ready; - status.OnClick = () => orderManager.IssueOrder(Order.Command($"state {state}")); + if (c.Bot == null) + { + var isChecked = new PredictedCachedTransform(cc => cc.IsReady); + status.IsChecked = () => isChecked.Update(c); + status.OnClick = () => + { + var state = isChecked.Update(c) ? Session.ClientState.NotReady : Session.ClientState.Ready; + orderManager.IssueOrder(Order.Command($"state {state}")); + isChecked.Predict(!c.IsReady); + }; + } + else + status.IsChecked = () => true; } public static void SetupReadyWidget(Widget parent, Session.Client c)