Example #1
0
        public SpecialData(Ability ability, Func <uint, float> baseData)
        {
            try
            {
                this.value = new float[Math.Max(ability.MaximumLevel, 1)];

                for (var i = 0u; i < this.value.Length; i++)
                {
                    this.value[i] = baseData(i);
                }

                this.getDataFunc = this.GetValueDefault;
            }
            catch
            {
                this.getDataFunc = _ => 1;

                var ex = new BrokenAbilityException(ability.Name);
                if (ability.IsValid)
                {
                    ex.Data["Ability"] = new
                    {
                        Ability         = ability.Name,
                        BaseSpecialData = baseData.Method.Name
                    };
                }

                Logger.Error(ex);
            }
        }
Example #2
0
        public SpecialData(Entity talentOwner, AbilityId talentId)
        {
            try
            {
                this.talent = EntityManager9.BaseAbilities.FirstOrDefault(x => x.Id == talentId && x.Owner?.Handle == talentOwner.Handle);

                if (this.talent != null)
                {
                    this.talentValue = this.talent.AbilitySpecialData.First(x => x.Name == "value").Value;
                    this.getDataFunc = this.GetTalentValue;
                }
                else
                {
                    this.getDataFunc = _ => 1;
                }
            }
            catch
            {
                this.getDataFunc = _ => 0;

                var ex = new BrokenAbilityException(talentId.ToString());
                if (this.talent?.IsValid == true)
                {
                    ex.Data["Ability"] = new
                    {
                        Ability = this.talent.Name
                    };
                }

                Logger.Error(ex);
            }
        }
Example #3
0
        public SpecialData(Ability ability, string name)
        {
            try
            {
                var data     = ability.AbilitySpecialData.First(x => x.Name == name);
                var talentId = data.SpecialBonusAbility;

                if (talentId != AbilityId.ability_base)
                {
                    var unit = ability.Owner as Unit;
                    if (unit != null)
                    {
                        this.talent = unit.Spellbook.Spells.FirstOrDefault(x => x.Id == talentId);
                    }
                }

                if (this.talent != null)
                {
                    this.talentValue = this.talent.AbilitySpecialData.First(x => x.Name == "value").Value;
                    this.getDataFunc = this.GetValueWithTalent;
                }
                else
                {
                    this.getDataFunc = this.GetValueDefault;
                }

                if (data.Count == 0)
                {
                    this.value = ability.KeyValues.FindKeyValues(name)
                                 .StringValue.Split()
                                 .Select(x => float.Parse(x, CultureInfo.InvariantCulture))
                                 .ToArray();
                }
                else
                {
                    this.value = new float[data.Count];

                    for (var i = 0u; i < this.value.Length; i++)
                    {
                        this.value[i] = data.GetValue(i);
                    }
                }
            }
            catch
            {
                this.getDataFunc = _ => 1;

                var ex = new BrokenAbilityException(ability.Name);
                if (ability.IsValid)
                {
                    ex.Data["Ability"] = new
                    {
                        Ability     = ability.Name,
                        SpecialData = name,
                    };
                }

                Logger.Error(ex);
            }
        }
 // Token: 0x0600042D RID: 1069 RVA: 0x0001E4C8 File Offset: 0x0001C6C8
 public SpecialData(Ability ability, Func <uint, float> baseData)
 {
     try
     {
         this.value = new float[Math.Max(ability.MaximumLevel, 1)];
         uint num = 0u;
         while ((ulong)num < (ulong)((long)this.value.Length))
         {
             this.value[(int)num] = baseData(num);
             num += 1u;
         }
         this.getDataFunc = new Func <uint, float>(this.GetValueDefault);
     }
     catch
     {
         this.getDataFunc = ((uint _) => 1f);
         BrokenAbilityException ex = new BrokenAbilityException(ability.Name);
         if (ability.IsValid)
         {
             ex.Data["Ability"] = new
             {
                 Ability         = ability.Name,
                 BaseSpecialData = baseData.Method.Name
             };
         }
         Logger.Error(ex, null);
     }
 }
 // Token: 0x0600042A RID: 1066 RVA: 0x0001E110 File Offset: 0x0001C310
 public SpecialData(Ability ability, string name)
 {
     try
     {
         AbilitySpecialData abilitySpecialData = ability.AbilitySpecialData.First((AbilitySpecialData x) => x.Name == name);
         AbilityId          talentId           = abilitySpecialData.SpecialBonusAbility;
         if (talentId != AbilityId.ability_base)
         {
             Unit unit = ability.Owner as Unit;
             if (unit != null)
             {
                 this.talent = unit.Spellbook.Spells.FirstOrDefault((Ability x) => x.Id == talentId);
             }
         }
         if (this.talent != null)
         {
             this.talentValue = this.talent.AbilitySpecialData.First((AbilitySpecialData x) => x.Name == "value").Value;
             this.getDataFunc = new Func <uint, float>(this.GetValueWithTalent);
         }
         else
         {
             this.getDataFunc = new Func <uint, float>(this.GetValueDefault);
         }
         this.value = new float[abilitySpecialData.Count];
         uint num = 0u;
         Func <AbilitySpecialData, bool> < > 9__3;
         while ((ulong)num < (ulong)((long)this.value.Length))
         {
             float[] array = this.value;
             int     num2  = (int)num;
             IEnumerable <AbilitySpecialData> abilitySpecialData2 = ability.AbilitySpecialData;
             Func <AbilitySpecialData, bool>  predicate;
             if ((predicate = < > 9__3) == null)
             {
                 predicate = (< > 9__3 = ((AbilitySpecialData x) => x.Name == name));
             }
             array[num2] = abilitySpecialData2.First(predicate).GetValue(num);
             num        += 1u;
         }
     }
     catch
     {
         this.getDataFunc = ((uint _) => 1f);
         BrokenAbilityException ex = new BrokenAbilityException(ability.Name);
         if (ability.IsValid)
         {
             ex.Data["Ability"] = new
             {
                 Ability     = ability.Name,
                 SpecialData = name
             };
         }
         Logger.Error(ex, null);
     }
 }
Example #6
0
        public SpecialData(Ability ability, AbilityId talentId, string name)
        {
            try
            {
                var data = ability.AbilitySpecialData.First(x => x.Name == name);

                var unit = ability.Owner as Unit;
                if (unit != null)
                {
                    this.talent = unit.Spellbook.Spells.FirstOrDefault(x => x.Id == talentId);
                }

                if (this.talent != null)
                {
                    this.talentValue = this.talent.AbilitySpecialData.First(x => x.Name == "value").Value;
                    this.getDataFunc = this.GetValueWithTalent;
                }
                else
                {
                    this.getDataFunc = this.GetValueDefault;
                }

                this.value = new float[data.Count];

                for (var i = 0u; i < this.value.Length; i++)
                {
                    this.value[i] = data.GetValue(i);
                }
            }
            catch
            {
                this.getDataFunc = _ => 1;

                var ex = new BrokenAbilityException(ability.Name);
                if (ability.IsValid)
                {
                    ex.Data["Ability"] = new
                    {
                        Ability     = ability.Name,
                        SpecialData = name,
                    };
                }

                Logger.Error(ex);
            }
        }
 // Token: 0x06000428 RID: 1064 RVA: 0x0001DDF4 File Offset: 0x0001BFF4
 public SpecialData(Entity talentOwner, AbilityId talentId)
 {
     try
     {
         this.talent = EntityManager9.BaseAbilities.FirstOrDefault(delegate(Ability x)
         {
             if (x.Id == talentId)
             {
                 Entity owner = x.Owner;
                 EntityHandle?entityHandle = (owner != null) ? new EntityHandle?(owner.Handle) : null;
                 EntityHandle handle       = talentOwner.Handle;
                 return(entityHandle != null && (entityHandle == null || entityHandle.GetValueOrDefault() == handle));
             }
             return(false);
         });
         if (this.talent != null)
         {
             this.talentValue = this.talent.AbilitySpecialData.First((AbilitySpecialData x) => x.Name == "value").Value;
             this.getDataFunc = new Func <uint, float>(this.GetTalentValue);
         }
         else
         {
             this.getDataFunc = ((uint _) => 1f);
         }
     }
     catch
     {
         this.getDataFunc = ((uint _) => 0f);
         BrokenAbilityException ex = new BrokenAbilityException(talentId.ToString());
         Ability ability           = this.talent;
         if (ability != null && ability.IsValid)
         {
             ex.Data["Ability"] = new
             {
                 Ability = this.talent.Name
             };
         }
         Logger.Error(ex, null);
     }
 }
Example #8
0
        public SpecialData(AbilityId abilityId, string key)
        {
            try
            {
                var abilityData = Ability.GetAbilityDataById(abilityId);
                var specialData = abilityData.AbilitySpecialData.FirstOrDefault(x => x.Name == key);

                if (specialData != null)
                {
                    this.value = new float[specialData.Count];

                    for (var i = 0u; i < this.value.Length; i++)
                    {
                        this.value[i] = specialData.GetValue(i);
                    }
                }
                else
                {
                    var keyData      = abilityData.KeyValues.FindKeyValues(key).StringValue;
                    var stringValues = keyData.Split(' ');

                    this.value = new float[stringValues.Length];

                    for (var i = 0u; i < this.value.Length; i++)
                    {
                        this.value[i] = float.Parse(stringValues[i], CultureInfo.InvariantCulture);
                    }
                }

                this.getDataFunc = this.GetValueDefault;
            }
            catch
            {
                this.getDataFunc = _ => 0;
                var ex = new BrokenAbilityException(abilityId + "/" + key);
                Logger.Error(ex);
            }
        }
Example #9
0
        private Dictionary <KillStealAbility, int> GetDamage(Unit9 target)
        {
            var abilities            = new List <KillStealAbility>();
            var additionalAmplifiers = new DamageAmplifier();
            var damageBlockers       = target.GetDamageBlockers().ToDictionary(x => x, x => x.BlockValue(target));

            foreach (var ability in this.activeAbilities.Where(x => this.KillStealMenu.IsAbilityEnabled(x.Ability.Name)))
            {
                if (!ability.Ability.IsValid)
                {
                    continue;
                }

                if (!this.AbilitySleeper.IsSleeping(ability.Ability.Handle) && !ability.Ability.CanBeCasted(false))
                {
                    continue;
                }

                //todo remove positive amplifiers
                if (ability.Ability is IHasDamageAmplify amplifier)
                {
                    if ((amplifier.IsIncomingDamageAmplifier() && !target.HasModifier(amplifier.AmplifierModifierNames)) ||
                        (amplifier.IsOutgoingDamageAmplifier() && !ability.Ability.Owner.HasModifier(amplifier.AmplifierModifierNames)))
                    {
                        if (amplifier.IsPhysicalDamageAmplifier())
                        {
                            additionalAmplifiers[DamageType.Physical] *= 1 + amplifier.AmplifierValue(ability.Ability.Owner, target);
                        }

                        if (amplifier.IsMagicalDamageAmplifier())
                        {
                            additionalAmplifiers[DamageType.Magical] *= 1 + amplifier.AmplifierValue(ability.Ability.Owner, target);
                        }

                        if (amplifier.IsPureDamageAmplifier())
                        {
                            additionalAmplifiers[DamageType.Pure] *= 1 + amplifier.AmplifierValue(ability.Ability.Owner, target);
                        }
                    }
                }

                abilities.Add(ability);
            }

            var remainingHealth = target.Health;
            var finalDamage     = new Dictionary <KillStealAbility, int>();
            var remainingMana   = new Dictionary <Unit9, float>();

            foreach (var ability in abilities)
            {
                if (!remainingMana.TryGetValue(ability.Ability.Owner, out var mana))
                {
                    remainingMana[ability.Ability.Owner] = mana = ability.Ability.Owner.Mana;
                }

                if (mana < ability.Ability.ManaCost)
                {
                    continue;
                }

                foreach (var damagePair in ability.Ability.GetRawDamage(target, remainingHealth))
                {
                    var damageType = damagePair.Key;
                    var damage     = damagePair.Value;

                    if (damageType == DamageType.None)
                    {
                        if (damage > 0)
                        {
                            var ex = new BrokenAbilityException("DamageType");
                            Logger.Error(ex, ability.Ability.Name);
                            this.activeAbilities.RemoveAll(x => x.Ability.Handle == ability.Ability.Handle);
                        }

                        finalDamage.Add(ability, 0);
                        continue;
                    }

                    if (damageType == DamageType.HealthRemoval)
                    {
                        finalDamage.TryGetValue(ability, out var hpRemovalDamage);
                        finalDamage[ability] = hpRemovalDamage + (int)damage;
                        remainingHealth     -= damage;
                        continue;
                    }

                    var amp = target.GetDamageAmplification(ability.Ability.Owner, damageType, ability.Ability.IntelligenceAmplify);
                    if (amp <= 0)
                    {
                        continue;
                    }

                    foreach (var damageBlock in damageBlockers.ToList())
                    {
                        var blockAbility = damageBlock.Key;
                        if (!blockAbility.CanBlock(damageType))
                        {
                            continue;
                        }

                        var blockedDamage = Math.Min(damage, damageBlock.Value);
                        damageBlockers[blockAbility] -= blockedDamage;

                        if (blockAbility.BlocksDamageAfterReduction)
                        {
                            damage -= Math.Min(damage, blockedDamage * (1 / (amp * additionalAmplifiers[damageType])));
                        }
                        else
                        {
                            damage -= blockedDamage;
                        }
                    }

                    var amplifiedDamage = (int)(damage * amp * additionalAmplifiers[damageType]);
                    if (amplifiedDamage <= 0)
                    {
                        continue;
                    }

                    remainingMana[ability.Ability.Owner] -= ability.Ability.ManaCost;
                    finalDamage.TryGetValue(ability, out var savedDamage);
                    finalDamage[ability] = savedDamage + amplifiedDamage;
                    remainingHealth     -= amplifiedDamage;
                }
            }

            return(finalDamage);
        }
Example #10
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);
        }