/// <summary> /// Updates all effects added to this target. /// </summary> public virtual void UpdateEffects() { lock (Effects) { for (var i = EffectTimes.Count - 1; i >= 0; i--) { var effectTime = EffectTimes[i]; var currentTicks = DateTime.Now.Ticks; float deltaTime; if (effectTime.TicksAtLastUpdate < 0) { effectTime.TicksAtLastUpdate = currentTicks; deltaTime = 0f; } else { deltaTime = (currentTicks - effectTime.TicksAtLastUpdate) / 10000000f; } effectTime.TicksAtLastUpdate = currentTicks; effectTime.Effect.Update(deltaTime); if (effectTime.Effect.IsDone) { EffectTimes.RemoveAt(i); } } } }
/// <summary> /// Removes an effect /// </summary> /// <param name="effect">The effect to remove.</param> public virtual void RemoveEffect(IEffect <T> effect) { var effectTimeToRemove = EffectTimes.FirstOrDefault(x => x.Effect == effect); if (effectTimeToRemove == null) { return; } effect.OnDetach(EffectTarget); EffectTimes.Remove(effectTimeToRemove); }
/// <summary> /// Adds an affect. /// </summary> /// <param name="effect">The effect to add.</param> public virtual void AddEffect(IEffect <T> effect) { if (EffectTimes.Any(x => x.Effect == effect)) { return; } if (!effect.CanBeAppliedTo(EffectTarget)) { throw new WrapperException($"Failed to add effect.\r\nThe effect of type '{effect.GetType()}' can't be applied to the target of type '{EffectTarget.GetType()}'."); } effect.OnAttach(EffectTarget); EffectTimes.Add(new EffectTimeContainer(effect, -1)); }