/// <summary> /// Removes modifications from a status effect from a character. Takes into account how many stacks /// have been previously applied to a character. /// </summary> /// <param name="status">The status effect to remove modifications.</param> /// <param name="character">The character to remove modifications from.</param> private void RemoveStatusEffects(AppliedStatus status, Character character, bool removePermanent = false) { if (status.BaseStatus.IsPermanent && !removePermanent) { return; } int preSpeedChange = character.CurrentStats.Speed; var baseStatus = status.BaseStatus; character.Armor -= baseStatus.Armor * status.StackCount; character.ArmorPercentage -= baseStatus.ArmorPercentage * status.StackCount; character.CurrentMaxHealth -= baseStatus.ModifyMaxHealth * status.StackCount; character.CurrentMaxMana -= baseStatus.ModifyMaxMana * status.StackCount; character.CurrentStats -= baseStatus.ModifyStats * status.StackCount; character.DamageModifier -= baseStatus.DamageModifier * status.StackCount; character.DamagePercentageModifier -= baseStatus.DamagePercentageModifier * status.StackCount; character.CritChance -= baseStatus.CritChance * status.StackCount; character.CritMultiplier -= baseStatus.CritMultiplier * status.StackCount; character.ResistAll -= baseStatus.ResistAll * status.StackCount; character.ResistAllPercentage -= baseStatus.ResistAllPercentage * status.StackCount; character.SpellDamageModifier -= baseStatus.SpellDamageModifier * status.StackCount; character.SpellDamagePercentageModifier -= baseStatus.SpellDamagePercentageModifier * status.StackCount; if (baseStatus.ModifyStats.Speed != 0) { CharacterSpeedChanged?.Invoke(this, new CharacterSpeedChangedEventArgs() { CharacterId = character.Id, PreSpeedChange = preSpeedChange, SpeedChange = baseStatus.ModifyStats.Speed }); } }
private void AddStatusFromTemplate(StatusTemplate status, Entity source, double duration, double[] values) { long removeTime = GetRemoveTime(duration); AppliedStatus newStatus = new AppliedStatus() { Source = source, LastTick = 0, RemovalTime = removeTime, Template = status, NumericValues = values }; MeNode intervalTree = Sanitizer.ReplaceTargetAndSource(status.Interval, source, this); newStatus.Interval = intervalTree.Resolve().Value.ToLong(); Statuses.Add(newStatus); foreach (MeNode tree in newStatus.Template.Modifiers) { StatModifier mod = Engine.GetSanitizer().ResolveStatus(tree, newStatus.NumericValues).ToModifier(); newStatus.MyMods.Add(mod); Attributes[mod.StatKey].Modifiers.Add(mod); } RefreshProperties(); int stackCount = 0; foreach (AppliedStatus sts in Statuses) { if (sts.Template.Key.Equals(newStatus.Template.Key)) { ++stackCount; } } Engine.Log().Log($"[{Name}] Affected by {status.Name}[{stackCount}]."); }
private bool IsTime(AppliedStatus status) { if (status.LastTick == 0) { return(true); } if (Engine.GetTimer().GetNow() - status.LastTick > status.Interval * 1000) { return(true); } return(false); }
public override void ApplyStatus(StatusTemplate status, Entity source, double duration, double[] values) { switch (status.Type) { case StackingType.Refresh: { AppliedStatus refresh = GetStatusInstance(status.Key); if (refresh != null) { refresh.RemovalTime = Engine.GetTimer().GetNow() + (long)duration * 1000; } else { AddStatusFromTemplate(status, source, duration, values); } break; } case StackingType.None: { AppliedStatus refresh = GetStatusInstance(status.Key); if (refresh == null) { AddStatusFromTemplate(status, source, duration, values); } break; } case StackingType.Independent: { long maxStacks = status.MaxStacks.Resolve().Value.ToLong(); int currentStacks = GetStatusStackCount(status.Key); if (maxStacks == 0 || maxStacks > currentStacks) { AddStatusFromTemplate(status, source, duration, values); } break; } } }