using Robust.Client.GameObjects; using Robust.Client.Player; using Robust.Shared.ContentPack; using Robust.Shared.Timing; using Robust.Shared.Utility; namespace Content.Client.UserInterface; /// /// Interface for s that need some updating logic /// ran in the stage. /// /// /// /// This is called on all open s that implement this interface. /// /// /// One intended use case is coalescing input events (e.g. via ) to send them to the /// server only once per tick. /// /// /// public interface IBuiPreTickUpdate { void PreTickUpdate(); } /// /// Implements . /// public sealed class BuiPreTickUpdateSystem : EntitySystem { [Dependency] private readonly IPlayerManager _playerManager = null!; [Dependency] private readonly UserInterfaceSystem _uiSystem = null!; [Dependency] private readonly IGameTiming _gameTiming = null!; private EntityQuery _userQuery; public override void Initialize() { base.Initialize(); _userQuery = GetEntityQuery(); } public void RunUpdates() { if (!_gameTiming.IsFirstTimePredicted) return; var localSession = _playerManager.LocalSession; if (localSession?.AttachedEntity is not { } localEntity) return; if (!_userQuery.TryGetComponent(localEntity, out var userUIComp)) return; foreach (var (entity, uis) in userUIComp.OpenInterfaces) { foreach (var key in uis) { if (!_uiSystem.TryGetOpenUi(entity, key, out var ui)) { DebugTools.Assert("Unable to find UI that was in the open UIs list??"); continue; } if (ui is IBuiPreTickUpdate tickUpdate) { tickUpdate.PreTickUpdate(); } } } } }