コード例 #1
0
        /// <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
                });
            }
        }
コード例 #2
0
        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}].");
        }
コード例 #3
0
 private bool IsTime(AppliedStatus status)
 {
     if (status.LastTick == 0)
     {
         return(true);
     }
     if (Engine.GetTimer().GetNow() - status.LastTick > status.Interval * 1000)
     {
         return(true);
     }
     return(false);
 }
コード例 #4
0
        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;
            }
            }
        }