diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 0e719d348..ae446efe4 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -2210,7 +2210,7 @@ namespace Game.Entities stmt.AddValue(index++, GetStat((Stats)i)); for (int i = 0; i < (int)SpellSchools.Max; ++i) - stmt.AddValue(index++, GetResistance((SpellSchools)i) + GetBonusResistanceMod((SpellSchools)i)); + stmt.AddValue(index++, GetResistance((SpellSchools)i))); stmt.AddValue(index++, (float)m_activePlayerData.BlockPercentage); stmt.AddValue(index++, (float)m_activePlayerData.DodgePercentage); diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 9c1b9480c..40211f2a1 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -3828,7 +3828,7 @@ namespace Game.Entities uint armor = proto.GetArmor(itemLevel); if (armor != 0) { - HandleStatFlatModifier(UnitMods.Armor, UnitModifierFlatType.Base, (float)armor, apply); + HandleStatFlatModifier(UnitMods.Armor, UnitModifierFlatType.Total, (float)armor, apply); if (proto.GetClass() == ItemClass.Armor && (ItemSubClassArmor)proto.GetSubClass() == ItemSubClassArmor.Shield) SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ShieldBlock), apply ? (uint)(armor * 2.5f) : 0); } @@ -6691,7 +6691,7 @@ namespace Game.Entities }); // If main hand is a 2h weapon, count it twice - if (!bestItemLevels.TryGetValue(EquipmentSlot.MainHand, out Tuple mainHand) && mainHand.Item1 == InventoryType.Weapon2Hand) + if (bestItemLevels.TryGetValue(EquipmentSlot.MainHand, out Tuple mainHand) && mainHand.Item1 == InventoryType.Weapon2Hand) sum += mainHand.Item2; sum /= 16.0f; diff --git a/Source/Game/Entities/StatSystem.cs b/Source/Game/Entities/StatSystem.cs index a37509d90..5843886e3 100644 --- a/Source/Game/Entities/StatSystem.cs +++ b/Source/Game/Entities/StatSystem.cs @@ -324,8 +324,16 @@ namespace Game.Entities if (school > SpellSchools.Normal) { UnitMods unitMod = UnitMods.ResistanceStart + (int)school; - SetResistance(school, (int)GetFlatModifierValue(unitMod, UnitModifierFlatType.Base)); - SetBonusResistanceMod(school, (int)(GetTotalAuraModValue(unitMod) - GetResistance(school))); + float value = MathFunctions.CalculatePct(GetFlatModifierValue(unitMod, UnitModifierFlatType.Base), Math.Max(GetFlatModifierValue(unitMod, UnitModifierFlatType.BasePCTExcludeCreate), -100.0f)); + value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base); + + float baseValue = value; + + value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total); + value *= GetPctModifierValue(unitMod, UnitModifierPctType.Total); + + SetResistance(school, (int)value); + SetBonusResistanceMod(school, (int)(value - baseValue)); } else UpdateArmor(); @@ -374,7 +382,7 @@ namespace Game.Entities public void SetCreateMana(uint val) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BaseMana), val); } public uint GetArmor() { - return (uint)(GetResistance(SpellSchools.Normal) + GetBonusResistanceMod(SpellSchools.Normal)); + return (uint)GetResistance(SpellSchools.Normal); } public void SetArmor(int val, int bonusVal) { @@ -404,7 +412,7 @@ namespace Game.Entities int? resist = null; for (int i = (int)SpellSchools.Normal; i < (int)SpellSchools.Max; ++i) { - int schoolResistance = GetResistance((SpellSchools)i) + GetBonusResistanceMod((SpellSchools)i); + int schoolResistance = GetResistance((SpellSchools)i); if (Convert.ToBoolean((int)mask & (1 << i)) && (!resist.HasValue || resist.Value > schoolResistance)) resist = schoolResistance; } @@ -1299,25 +1307,25 @@ namespace Game.Entities { UnitMods unitMod = UnitMods.Armor; - float value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base); // base armor (from items) - float baseValue = value; + float value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base); // base armor + value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base); // armor percent + // SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT counts as base armor GetTotalAuraModifier(AuraType.ModArmorPctFromStat, aurEff => { int miscValue = aurEff.GetMiscValue(); Stats stat = (miscValue != -2) ? (Stats)miscValue : GetPrimaryStat(); - int armorAmount = (int)MathFunctions.CalculatePct(GetStat(stat), aurEff.GetAmount()); - baseValue += armorAmount; - + value += MathFunctions.CalculatePct((float)GetStat(stat), aurEff.GetAmount()); return true; }); - value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base); // armor percent from items - value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total); + float baseValue = value; + + value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total); // bonus armor from auras and items value *= GetPctModifierValue(unitMod, UnitModifierPctType.Total); - SetArmor((int)baseValue, (int)(value - baseValue)); + SetArmor((int)value, (int)(value - baseValue)); Pet pet = GetPet(); if (pet)