#nullable enable using System; using System.Collections.Generic; using Content.Client.GameObjects.EntitySystems.DoAfter; using Content.Shared.GameObjects.Components; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.Network; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Players; namespace Content.Client.GameObjects.Components { [RegisterComponent] public sealed class DoAfterComponent : SharedDoAfterComponent { public override string Name => "DoAfter"; public IReadOnlyDictionary DoAfters => _doAfters; private readonly Dictionary _doAfters = new Dictionary(); public readonly List<(TimeSpan CancelTime, DoAfterMessage Message)> CancelledDoAfters = new List<(TimeSpan CancelTime, DoAfterMessage Message)>(); public override void HandleNetworkMessage(ComponentMessage message, INetChannel netChannel, ICommonSession? session = null) { base.HandleNetworkMessage(message, netChannel, session); switch (message) { case DoAfterMessage msg: _doAfters.Add(msg.ID, msg); EntitySystem.Get().Gui?.AddDoAfter(msg); break; case CancelledDoAfterMessage msg: Cancel(msg.ID); break; } } /// /// Remove a DoAfter without showing a cancellation graphic. /// /// public void Remove(DoAfterMessage doAfter) { if (_doAfters.ContainsKey(doAfter.ID)) { _doAfters.Remove(doAfter.ID); } for (var i = CancelledDoAfters.Count - 1; i >= 0; i--) { var cancelled = CancelledDoAfters[i]; if (cancelled.Message == doAfter) { CancelledDoAfters.RemoveAt(i); break; } } EntitySystem.Get().Gui?.RemoveDoAfter(doAfter.ID); } /// /// Mark a DoAfter as cancelled and show a cancellation graphic. /// /// Actual removal is handled by DoAfterEntitySystem. /// /// public void Cancel(byte id, TimeSpan? currentTime = null) { foreach (var (_, cancelled) in CancelledDoAfters) { if (cancelled.ID == id) { return; } } var doAfterMessage = _doAfters[id]; currentTime ??= IoCManager.Resolve().CurTime; CancelledDoAfters.Add((currentTime.Value, doAfterMessage)); EntitySystem.Get().Gui?.CancelDoAfter(id); } } }