using System; using System.Threading; namespace ACE.Server.Entity.Actions { /// /// Action that will not return until Timer.PortalYearTicks >= EndTime /// must only be inserted into DelayManager actor /// public class DelayAction : ActionEventBase, IComparable { public double WaitTime { get; } public double EndTime { get; private set; } // For breaking ties on compareto, two actions cannot be equal private readonly long sequence; private static long glblSequence; public DelayAction(double waitTimePortalYearTicks) { WaitTime = waitTimePortalYearTicks; sequence = Interlocked.Increment(ref glblSequence); } public void Start() { EndTime = Timers.PortalYearTicks + WaitTime; } public int CompareTo(DelayAction rhs) { int ret = EndTime.CompareTo(rhs.EndTime); if (ret == 0) return sequence.CompareTo(rhs.sequence); return ret; } } }