using DataStructures; using Robust.Shared.GameObjects.EntitySystemMessages; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using System.Collections.Generic; namespace Robust.Server.GameObjects.EntitySystems { /// /// An entity system that displays temporary effects to the user /// public class EffectSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing; /// /// Priority queue sorted by how soon the effect will die, we remove messages from the front of the queue during update until caught up /// private readonly PriorityQueue _CurrentEffects = new PriorityQueue(new EffectMessageComparer()); public void CreateParticle(EffectSystemMessage effect) { _CurrentEffects.Add(effect); //For now we will use this which sends to ALL clients //TODO: Client bubbling RaiseNetworkEvent(effect); } public override void Update(float frameTime) { //Take elements from front of priority queue until they are old while (_CurrentEffects.Count != 0 && _CurrentEffects.Peek().DeathTime < _timing.CurTime) { _CurrentEffects.Take(); } } /// /// Comparer that keeps the device dictionary sorted by powernet priority /// public class EffectMessageComparer : IComparer { public int Compare(EffectSystemMessage x, EffectSystemMessage y) { return y.DeathTime.CompareTo(x.DeathTime); } } //TODO: Send all current effects to new clients on login //TODO: Send effects only to relevant client bubbles } }