コード例 #1
0
            internal void RemoveAurasWithEffectMechanics(AuraEffectType auraEffectType, SpellMechanics mechanics)
            {
                IReadOnlyList <AuraEffect> auraEffects = GetAuraEffects(auraEffectType);

                if (auraEffects == null)
                {
                    return;
                }

                var auraEffectsToRemove = ListPoolContainer <AuraEffect> .Take();

                for (int i = 0; i < auraEffects.Count; i++)
                {
                    if (auraEffects[i].EffectInfo.Mechanics == mechanics)
                    {
                        auraEffectsToRemove.Add(auraEffects[i]);
                    }
                }

                foreach (AuraEffect auraEffectToRemove in auraEffectsToRemove)
                {
                    if (!auraEffectToRemove.Aura.IsRemoved)
                    {
                        auraEffectToRemove.Aura.Remove(AuraRemoveMode.Spell);
                    }
                }

                ListPoolContainer <AuraEffect> .Return(auraEffectsToRemove);
            }
コード例 #2
0
    private Sprite GetSprite(AuraEffectType typeToSearchFor)
    {
        for (int i = 0; i < _auraEffectSprites.Length; i++)
        {
            if (_auraEffectSprites[i].Type == typeToSearchFor)
            {
                return(_auraEffectSprites[i].IconSprite);
            }
        }

        return(null);
    }
コード例 #3
0
            internal float MaxPositiveAuraModifier(AuraEffectType auraType)
            {
                if (!auraEffectsByAuraType.TryGetValue(auraType, out List <AuraEffect> auraEffects))
                {
                    return(0.0f);
                }

                float modifier = 0.0f;

                foreach (AuraEffect auraEffect in auraEffects)
                {
                    modifier = Mathf.Max(modifier, auraEffect.Value);
                }

                return(modifier);
            }
コード例 #4
0
            internal float TotalAuraMultiplier(AuraEffectType auraType)
            {
                if (!auraEffectsByAuraType.TryGetValue(auraType, out List <AuraEffect> auraEffects))
                {
                    return(1.0f);
                }

                float multiplier = 1.0f;

                foreach (AuraEffect auraEffect in auraEffects)
                {
                    multiplier = multiplier.AddPercentage(auraEffect.Value);
                }

                return(multiplier);
            }
コード例 #5
0
            internal float TotalAuraModifier(AuraEffectType auraType)
            {
                if (!auraEffectsByAuraType.TryGetValue(auraType, out List <AuraEffect> auraEffects))
                {
                    return(0.0f);
                }

                float modifier = 0.0f;

                foreach (AuraEffect auraEffect in auraEffects)
                {
                    modifier += auraEffect.Value;
                }

                return(modifier);
            }
コード例 #6
0
            internal float TotalAuraMultiplier(AuraEffectType auraType, float secondaryValue, ComparisonOperator comparison)
            {
                if (!auraEffectsByAuraType.TryGetValue(auraType, out List <AuraEffect> auraEffects))
                {
                    return(1.0f);
                }

                float multiplier = 1.0f;

                foreach (AuraEffect auraEffect in auraEffects)
                {
                    if (auraEffect.EffectInfo.SecondaryValue.CompareWith(secondaryValue, comparison))
                    {
                        multiplier = multiplier.AddPercentage(auraEffect.Value);
                    }
                }

                return(multiplier);
            }
コード例 #7
0
            internal void RemoveAurasWithEffect(AuraEffectType auraEffectType, AuraEffect exceptEffect = null, Aura exceptAura = null, Unit onlyWithCaster = null)
            {
                IReadOnlyList <AuraEffect> auraEffects = GetAuraEffects(auraEffectType);

                if (auraEffects == null)
                {
                    return;
                }

                var auraEffectsToRemove = ListPoolContainer <AuraEffect> .Take();

                for (int i = 0; i < auraEffects.Count; i++)
                {
                    if (onlyWithCaster != null && auraEffects[i].Aura.Caster != onlyWithCaster)
                    {
                        continue;
                    }

                    if (exceptEffect == auraEffects[i])
                    {
                        continue;
                    }

                    if (exceptAura == auraEffects[i].Aura)
                    {
                        continue;
                    }

                    auraEffectsToRemove.Add(auraEffects[i]);
                }

                foreach (AuraEffect auraEffectToRemove in auraEffectsToRemove)
                {
                    if (!auraEffectToRemove.Aura.IsRemoved)
                    {
                        auraEffectToRemove.Aura.Remove(AuraRemoveMode.Spell);
                    }
                }

                ListPoolContainer <AuraEffect> .Return(auraEffectsToRemove);
            }
コード例 #8
0
        public bool CanCancelAuraType(AuraEffectType auraEffectType, Unit caster)
        {
            IReadOnlyList <AuraEffect> activeEffects = caster.Auras.GetAuraEffects(auraEffectType);

            if (activeEffects == null)
            {
                return(true);
            }

            for (int i = 0; i < activeEffects.Count; i++)
            {
                if (CanCancelAura(activeEffects[i]))
                {
                    continue;
                }

                return(false);
            }

            return(true);
        }
コード例 #9
0
            internal float MinPositiveAuraModifier(AuraEffectType auraType)
            {
                if (!auraEffectsByAuraType.TryGetValue(auraType, out List <AuraEffect> auraEffects))
                {
                    return(0.0f);
                }

                float modifier    = float.MaxValue;
                bool  hasPositive = false;

                foreach (AuraEffect auraEffect in auraEffects)
                {
                    if (auraEffect.Value > 0.0f)
                    {
                        modifier    = Mathf.Min(modifier, auraEffect.Value);
                        hasPositive = true;
                    }
                }

                return(hasPositive ? modifier : 0.0f);
            }
コード例 #10
0
        private SpellCastResult ValidateMechanics(AuraEffectType auraEffectType)
        {
            IReadOnlyList <AuraEffect> activeEffects = Caster.Auras.GetAuraEffects(auraEffectType);

            if (activeEffects == null)
            {
                return(SpellCastResult.Success);
            }

            for (int i = 0; i < activeEffects.Count; i++)
            {
                SpellMechanicsFlags combinedEffectMechanics = activeEffects[i].Aura.SpellInfo.CombinedEffectMechanics;
                if (combinedEffectMechanics == 0)
                {
                    continue;
                }

                if (!SpellInfo.CastIgnoringMechanics.HasTargetFlag(combinedEffectMechanics))
                {
                    switch (auraEffectType)
                    {
                    case AuraEffectType.StunState:
                        return(SpellCastResult.Stunned);

                    case AuraEffectType.ModFear:
                        return(SpellCastResult.Fleeing);

                    case AuraEffectType.ConfusionState:
                        return(SpellCastResult.Confused);

                    default:
                        return(SpellCastResult.NotKnown);
                    }
                }
            }

            return(SpellCastResult.Success);
        }
コード例 #11
0
            internal void RemoveAurasWithEffect(AuraEffectType auraEffectType, AuraEffect except = null)
            {
                IReadOnlyList <AuraEffect> auraEffects = GetAuraEffects(auraEffectType);

                if (auraEffects == null)
                {
                    return;
                }

                var auraEffectsToRemove = ListPoolContainer <AuraEffect> .Take();

                auraEffectsToRemove.AddRange(auraEffects);
                auraEffectsToRemove.Remove(except);

                foreach (AuraEffect auraEffectToRemove in auraEffectsToRemove)
                {
                    if (!auraEffectToRemove.Aura.IsRemoved)
                    {
                        auraEffectToRemove.Aura.Remove(AuraRemoveMode.Spell);
                    }
                }

                ListPoolContainer <AuraEffect> .Return(auraEffectsToRemove);
            }
コード例 #12
0
 internal IReadOnlyList <AuraEffect> GetAuraEffects(AuraEffectType auraEffectType)
 {
     return(auraEffectsByAuraType.TryGetValue(auraEffectType, out List <AuraEffect> effectList) ? effectList : null);
 }
コード例 #13
0
 internal bool HasAuraType(AuraEffectType auraEffectType) => auraEffectsByAuraType.ContainsKey(auraEffectType);
コード例 #14
0
 public AuraEffectDetails(AuraEffectType type, bool isApplying)
 {
     Type       = type;
     IsApplying = isApplying;
 }