예제 #1
0
 internal void Blocker(IHasDamageBlock block, bool added)
 {
     if (added)
     {
         this.blockers[block.BlockModifierName] = block;
     }
     else
     {
         this.blockers.Remove(block.BlockModifierName);
     }
 }
        // Token: 0x0600048C RID: 1164 RVA: 0x0001F188 File Offset: 0x0001D388
        private void OnAbilityRemoved(Ability9 ability)
        {
            IHasDamageAmplify amplifier;

            if ((amplifier = (ability as IHasDamageAmplify)) != null)
            {
                if (amplifier.IsAmplifierPermanent)
                {
                    ability.Owner.Amplifier(amplifier, false);
                    return;
                }
                if (amplifier.IsAmplifierAddedToStats)
                {
                    return;
                }
                foreach (Unit9 unit in EntityManager9.Units)
                {
                    unit.Amplifier(amplifier, false);
                }
                IHasDamageAmplify hasDamageAmplify = EntityManager9.Abilities.OfType <IHasDamageAmplify>().FirstOrDefault((IHasDamageAmplify x) => x.AmplifierModifierName == amplifier.AmplifierModifierName);
                if (hasDamageAmplify != null)
                {
                    this.amplifiers[hasDamageAmplify.AmplifierModifierName] = hasDamageAmplify;
                    IEnumerable <Unit9> units = EntityManager9.Units;
                    Func <Unit9, bool> < > 9__1;
                    Func <Unit9, bool> predicate;
                    if ((predicate = < > 9__1) == null)
                    {
                        predicate = (< > 9__1 = ((Unit9 x) => x.HasModifier(amplifier.AmplifierModifierName)));
                    }
                    using (IEnumerator <Unit9> enumerator = units.Where(predicate).GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            Unit9 unit2 = enumerator.Current;
                            unit2.Amplifier(hasDamageAmplify, true);
                        }
                        goto IL_117;
                    }
                }
                this.amplifiers.Remove(amplifier.AmplifierModifierName);
            }
IL_117:
            IHasPassiveDamageIncrease passive;

            if ((passive = (ability as IHasPassiveDamageIncrease)) != null)
            {
                if (passive.IsPassiveDamagePermanent)
                {
                    ability.Owner.Passive(passive, false);
                    return;
                }
                foreach (Unit9 unit3 in EntityManager9.Units)
                {
                    unit3.Passive(passive, false);
                }
                IHasPassiveDamageIncrease hasPassiveDamageIncrease = EntityManager9.Abilities.OfType <IHasPassiveDamageIncrease>().FirstOrDefault((IHasPassiveDamageIncrease x) => x.PassiveDamageModifierName == passive.PassiveDamageModifierName);
                if (hasPassiveDamageIncrease != null)
                {
                    this.passives[hasPassiveDamageIncrease.PassiveDamageModifierName] = hasPassiveDamageIncrease;
                    IEnumerable <Unit9> units2 = EntityManager9.Units;
                    Func <Unit9, bool> < > 9__3;
                    Func <Unit9, bool> predicate2;
                    if ((predicate2 = < > 9__3) == null)
                    {
                        predicate2 = (< > 9__3 = ((Unit9 x) => x.HasModifier(passive.PassiveDamageModifierName)));
                    }
                    using (IEnumerator <Unit9> enumerator = units2.Where(predicate2).GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            Unit9 unit4 = enumerator.Current;
                            unit4.Passive(hasPassiveDamageIncrease, true);
                        }
                        goto IL_221;
                    }
                }
                this.passives.Remove(passive.PassiveDamageModifierName);
            }
IL_221:
            IHasDamageBlock block;

            if ((block = (ability as IHasDamageBlock)) != null)
            {
                if (block.IsDamageBlockPermanent)
                {
                    ability.Owner.Blocker(block, false);
                    return;
                }
                foreach (Unit9 unit5 in EntityManager9.Units)
                {
                    unit5.Blocker(block, false);
                }
                IHasDamageBlock hasDamageBlock = EntityManager9.Abilities.OfType <IHasDamageBlock>().FirstOrDefault((IHasDamageBlock x) => x.BlockModifierName == block.BlockModifierName);
                if (hasDamageBlock != null)
                {
                    this.blockers[hasDamageBlock.BlockModifierName] = hasDamageBlock;
                    IEnumerable <Unit9> units3 = EntityManager9.Units;
                    Func <Unit9, bool> < > 9__5;
                    Func <Unit9, bool> predicate3;
                    if ((predicate3 = < > 9__5) == null)
                    {
                        predicate3 = (< > 9__5 = ((Unit9 x) => x.HasModifier(block.BlockModifierName)));
                    }
                    using (IEnumerator <Unit9> enumerator = units3.Where(predicate3).GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            Unit9 unit6 = enumerator.Current;
                            unit6.Blocker(block, true);
                        }
                        goto IL_32F;
                    }
                }
                this.blockers.Remove(block.BlockModifierName);
            }
IL_32F:
            IAppliesImmobility disable;

            if ((disable = (ability as IAppliesImmobility)) != null)
            {
                IAppliesImmobility appliesImmobility = EntityManager9.Abilities.OfType <IAppliesImmobility>().FirstOrDefault((IAppliesImmobility x) => x.ImmobilityModifierName == disable.ImmobilityModifierName);
                if (appliesImmobility == null)
                {
                    this.disablers.Remove(disable.ImmobilityModifierName);
                    return;
                }
                this.disablers[disable.ImmobilityModifierName] = appliesImmobility;
            }
        }
예제 #3
0
        // Token: 0x060003B6 RID: 950 RVA: 0x0001D02C File Offset: 0x0001B22C
        private void CheckModifier(uint senderHandle, Modifier modifier, bool added)
        {
            string name     = modifier.Name;
            Unit9  unitFast = EntityManager9.GetUnitFast(senderHandle);

            if (unitFast == null)
            {
                return;
            }
            Action <Unit9, bool> action;

            if (this.specialModifiers.TryGetValue(name, out action))
            {
                action(unitFast, added);
            }
            IHasRangeIncrease range = this.rangeFactory.GetRange(name);

            if (range != null)
            {
                unitFast.Range(range, added);
                return;
            }
            if (modifier.IsHidden)
            {
                return;
            }
            IAppliesImmobility disable = this.damageFactory.GetDisable(name);

            if (disable != null)
            {
                IDisable disable2;
                bool     invulnerability = (disable2 = (disable as IDisable)) != null && (disable2.AppliesUnitState & UnitState.Invulnerable) > (UnitState)0UL;
                unitFast.Disabler(modifier, added, invulnerability);
                return;
            }
            if (modifier.IsStunDebuff)
            {
                unitFast.Disabler(modifier, added, false);
                return;
            }
            IHasDamageAmplify amplifier = this.damageFactory.GetAmplifier(name);

            if (amplifier != null)
            {
                unitFast.Amplifier(amplifier, added);
                return;
            }
            IHasPassiveDamageIncrease passive = this.damageFactory.GetPassive(name);

            if (passive != null)
            {
                unitFast.Passive(passive, added);
                return;
            }
            IHasDamageBlock blocker = this.damageFactory.GetBlocker(name);

            if (blocker != null)
            {
                unitFast.Blocker(blocker, added);
                return;
            }
        }
예제 #4
0
 public static bool IsPureDamageBlock(this IHasDamageBlock block)
 {
     return((block.BlockDamageType & DamageType.Pure) != 0);
 }
예제 #5
0
 public static bool IsPhysicalDamageBlock(this IHasDamageBlock block)
 {
     return((block.BlockDamageType & DamageType.Physical) != 0);
 }
예제 #6
0
 public static bool CanBlock(this IHasDamageBlock block, DamageType damageType)
 {
     return((block.BlockDamageType & damageType) != 0);
 }
예제 #7
0
        // Token: 0x06000110 RID: 272 RVA: 0x0000B0E0 File Offset: 0x000092E0
        private Dictionary <KillStealAbility, int> GetDamage(Unit9 target)
        {
            List <KillStealAbility>             list            = new List <KillStealAbility>();
            DamageAmplifier                     damageAmplifier = new DamageAmplifier();
            Dictionary <IHasDamageBlock, float> dictionary      = target.GetDamageBlockers().ToDictionary((IHasDamageBlock x) => x, (IHasDamageBlock x) => x.BlockValue(target));
            IEnumerable <KillStealAbility>      source          = this.activeAbilities;

            Func <KillStealAbility, bool> < > 9__2;
            Func <KillStealAbility, bool> predicate;

            if ((predicate = < > 9__2) == null)
            {
                predicate = (< > 9__2 = ((KillStealAbility x) => this.KillStealMenu.IsAbilityEnabled(x.Ability.Name)));
            }
            foreach (KillStealAbility killStealAbility in source.Where(predicate))
            {
                if (killStealAbility.Ability.IsValid && (this.AbilitySleeper.IsSleeping(killStealAbility.Ability.Handle) || killStealAbility.Ability.CanBeCasted(false)))
                {
                    IHasDamageAmplify hasDamageAmplify;
                    if ((hasDamageAmplify = (killStealAbility.Ability as IHasDamageAmplify)) != null && ((AbilityExtensions.IsIncomingDamageAmplifier(hasDamageAmplify) && !target.HasModifier(hasDamageAmplify.AmplifierModifierName)) || (AbilityExtensions.IsOutgoingDamageAmplifier(hasDamageAmplify) && !killStealAbility.Ability.Owner.HasModifier(hasDamageAmplify.AmplifierModifierName))))
                    {
                        if (AbilityExtensions.IsPhysicalDamageAmplifier(hasDamageAmplify))
                        {
                            DamageAmplifier damageAmplifier2 = damageAmplifier;
                            damageAmplifier2[DamageType.Physical] = damageAmplifier2[DamageType.Physical] * (1f + hasDamageAmplify.AmplifierValue(killStealAbility.Ability.Owner, target));
                        }
                        if (AbilityExtensions.IsMagicalDamageAmplifier(hasDamageAmplify))
                        {
                            DamageAmplifier damageAmplifier2 = damageAmplifier;
                            damageAmplifier2[DamageType.Magical] = damageAmplifier2[DamageType.Magical] * (1f + hasDamageAmplify.AmplifierValue(killStealAbility.Ability.Owner, target));
                        }
                        if (AbilityExtensions.IsPureDamageAmplifier(hasDamageAmplify))
                        {
                            DamageAmplifier damageAmplifier2 = damageAmplifier;
                            damageAmplifier2[DamageType.Pure] = damageAmplifier2[DamageType.Pure] * (1f + hasDamageAmplify.AmplifierValue(killStealAbility.Ability.Owner, target));
                        }
                    }
                    list.Add(killStealAbility);
                }
            }
            float num = target.Health;
            Dictionary <KillStealAbility, int> dictionary2 = new Dictionary <KillStealAbility, int>();
            Dictionary <Unit9, float>          dictionary3 = new Dictionary <Unit9, float>();

            using (List <KillStealAbility> .Enumerator enumerator2 = list.GetEnumerator())
            {
                while (enumerator2.MoveNext())
                {
                    KillStealAbility ability = enumerator2.Current;
                    float            num2;
                    if (!dictionary3.TryGetValue(ability.Ability.Owner, out num2))
                    {
                        num2 = (dictionary3[ability.Ability.Owner] = ability.Ability.Owner.Mana);
                    }
                    if (num2 >= ability.Ability.ManaCost)
                    {
                        Predicate <KillStealAbility> < > 9__3;
                        foreach (KeyValuePair <DamageType, float> keyValuePair in ability.Ability.GetRawDamage(target, new float?(num)))
                        {
                            DamageType key  = keyValuePair.Key;
                            float      num3 = keyValuePair.Value;
                            if (key == DamageType.None)
                            {
                                if (num3 > 0f)
                                {
                                    Logger.Error(new BrokenAbilityException("DamageType"), ability.Ability.Name);
                                    List <KillStealAbility>      list2 = this.activeAbilities;
                                    Predicate <KillStealAbility> match;
                                    if ((match = < > 9__3) == null)
                                    {
                                        match = (< > 9__3 = ((KillStealAbility x) => x.Ability.Handle == ability.Ability.Handle));
                                    }
                                    list2.RemoveAll(match);
                                }
                                dictionary2.Add(ability, 0);
                            }
                            else if (key == DamageType.HealthRemoval)
                            {
                                int num4;
                                dictionary2.TryGetValue(ability, out num4);
                                dictionary2[ability] = num4 + (int)num3;
                                num -= num3;
                            }
                            else
                            {
                                float damageAmplification = target.GetDamageAmplification(ability.Ability.Owner, key, ability.Ability.IntelligenceAmplify);
                                if (damageAmplification > 0f)
                                {
                                    foreach (KeyValuePair <IHasDamageBlock, float> keyValuePair2 in dictionary.ToList <KeyValuePair <IHasDamageBlock, float> >())
                                    {
                                        IHasDamageBlock key2 = keyValuePair2.Key;
                                        if (AbilityExtensions.CanBlock(key2, key))
                                        {
                                            float num5 = Math.Min(num3, keyValuePair2.Value);
                                            Dictionary <IHasDamageBlock, float> dictionary4 = dictionary;
                                            IHasDamageBlock key3 = key2;
                                            dictionary4[key3] -= num5;
                                            if (key2.BlocksDamageAfterReduction)
                                            {
                                                num3 -= Math.Min(num3, num5 * (1f / (damageAmplification * damageAmplifier[key])));
                                            }
                                            else
                                            {
                                                num3 -= num5;
                                            }
                                        }
                                    }
                                    int num6 = (int)(num3 * damageAmplification * damageAmplifier[key]);
                                    if (num6 > 6000 || num6 < 0)
                                    {
                                        BrokenAbilityException ex = new BrokenAbilityException("Amplified");
                                        ex.Data["Ability"] = new
                                        {
                                            Ability         = ability.Ability.Name,
                                            Target          = target.Name,
                                            Damage          = num3.ToString(),
                                            AmplifiedDamage = num6.ToString(),
                                            Type            = key.ToString(),
                                            Amp             = damageAmplification.ToString(),
                                            Amp2            = damageAmplifier[key].ToString(),
                                            TargetAmps      = (from x in target.amplifiers
                                                               where x.IsValid && AbilityExtensions.IsIncomingDamageAmplifier(x)
                                                               select x.AmplifierModifierName).ToArray <string>(),
                                            OwnerAmps = (from x in ability.Ability.Owner.amplifiers
                                                         where x.IsValid && AbilityExtensions.IsOutgoingDamageAmplifier(x)
                                                         select x.AmplifierModifierName).ToArray <string>()
                                        };
                                        Logger.Error(ex, null);
                                    }
                                    else
                                    {
                                        Dictionary <Unit9, float> dictionary5 = dictionary3;
                                        Unit9 owner = ability.Ability.Owner;
                                        dictionary5[owner] -= ability.Ability.ManaCost;
                                        int num7;
                                        dictionary2.TryGetValue(ability, out num7);
                                        dictionary2[ability] = num7 + num6;
                                        num -= (float)num6;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(dictionary2);
        }
 // Token: 0x060004A1 RID: 1185 RVA: 0x00004E61 File Offset: 0x00003061
 public static bool IsMagicalDamageBlock(this IHasDamageBlock block)
 {
     return((block.BlockDamageType & DamageType.Magical) > DamageType.None);
 }