diff --git a/Content.Client/Administration/UI/ManageSolutions/EditSolutionsEui.cs b/Content.Client/Administration/UI/ManageSolutions/EditSolutionsEui.cs index 4bee78fa09..625dafa23b 100644 --- a/Content.Client/Administration/UI/ManageSolutions/EditSolutionsEui.cs +++ b/Content.Client/Administration/UI/ManageSolutions/EditSolutionsEui.cs @@ -34,9 +34,7 @@ namespace Content.Client.Administration.UI.ManageSolutions public override void HandleState(EuiStateBase baseState) { var state = (EditSolutionsEuiState) baseState; - _window.SetTargetEntity(state.Target); - _window.UpdateSolutions(state.Solutions); - _window.UpdateReagents(); + _window.SetState(state); } } } diff --git a/Content.Client/Administration/UI/ManageSolutions/EditSolutionsWindow.xaml.cs b/Content.Client/Administration/UI/ManageSolutions/EditSolutionsWindow.xaml.cs index ecc26d6026..812f2de3a0 100644 --- a/Content.Client/Administration/UI/ManageSolutions/EditSolutionsWindow.xaml.cs +++ b/Content.Client/Administration/UI/ManageSolutions/EditSolutionsWindow.xaml.cs @@ -1,10 +1,13 @@ +using Content.Shared.Administration; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Robust.Client.AutoGenerated; using Robust.Client.Console; +using Robust.Client.Timing; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; +using Robust.Shared.Timing; namespace Content.Client.Administration.UI.ManageSolutions { @@ -16,11 +19,13 @@ namespace Content.Client.Administration.UI.ManageSolutions { [Dependency] private readonly IClientConsoleHost _consoleHost = default!; [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IClientGameTiming _timing = default!; private NetEntity _target = NetEntity.Invalid; private string? _selectedSolution; private AddReagentWindow? _addReagentWindow; private Dictionary? _solutions; + private EditSolutionsEuiState? _nextState; public EditSolutionsWindow() { @@ -327,5 +332,27 @@ namespace Content.Client.Administration.UI.ManageSolutions SolutionOption.Select(selectedIndex); _selectedSolution = (string?) SolutionOption.SelectedMetadata; } + + protected override void FrameUpdate(FrameEventArgs args) + { + // TODO: THIS IS FUCKING TERRIBLE. + // Ok so the problem is that this shouldn't be via an EUI at all. Why? + // The EUI update notification comes in *before* the game state it updates from. + // So the UI doesn't update properly. Heck. + // I didn't wanna completely rewrite this thing to work properly so instead you get terrible hacks. + + if (_nextState != null && _timing.LastRealTick >= _nextState.Tick) + { + SetTargetEntity(_nextState.Target); + UpdateSolutions(_nextState.Solutions); + UpdateReagents(); + _nextState = null; + } + } + + public void SetState(EditSolutionsEuiState state) + { + _nextState = state; + } } } diff --git a/Content.Server/Administration/UI/EditSolutionsEui.cs b/Content.Server/Administration/UI/EditSolutionsEui.cs index 228463d5ce..2a78a27bc0 100644 --- a/Content.Server/Administration/UI/EditSolutionsEui.cs +++ b/Content.Server/Administration/UI/EditSolutionsEui.cs @@ -5,6 +5,7 @@ using Content.Shared.Administration; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Eui; using JetBrains.Annotations; +using Robust.Shared.Timing; namespace Content.Server.Administration.UI { @@ -15,6 +16,7 @@ namespace Content.Server.Administration.UI public sealed class EditSolutionsEui : BaseEui { [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; private readonly SolutionContainerSystem _solutionContainerSystem = default!; public readonly EntityUid Target; @@ -55,7 +57,7 @@ namespace Content.Server.Administration.UI else netSolutions = null; - return new EditSolutionsEuiState(_entityManager.GetNetEntity(Target), netSolutions); + return new EditSolutionsEuiState(_entityManager.GetNetEntity(Target), netSolutions, _gameTiming.CurTick); } } } diff --git a/Content.Shared/Administration/EditSolutionsEuiState.cs b/Content.Shared/Administration/EditSolutionsEuiState.cs index 12fae34962..636a57c520 100644 --- a/Content.Shared/Administration/EditSolutionsEuiState.cs +++ b/Content.Shared/Administration/EditSolutionsEuiState.cs @@ -1,5 +1,6 @@ using Content.Shared.Eui; using Robust.Shared.Serialization; +using Robust.Shared.Timing; namespace Content.Shared.Administration { @@ -8,11 +9,13 @@ namespace Content.Shared.Administration { public readonly NetEntity Target; public readonly List<(string, NetEntity)>? Solutions; + public readonly GameTick Tick; - public EditSolutionsEuiState(NetEntity target, List<(string, NetEntity)>? solutions) + public EditSolutionsEuiState(NetEntity target, List<(string, NetEntity)>? solutions, GameTick tick) { Target = target; Solutions = solutions; + Tick = tick; } } }