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); } }
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); } }
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); } }
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); } }
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); } }
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); }
// 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); }