Core/Units: Corrected values of UnitData::Resistances (should be total value)

Port From (https://github.com/TrinityCore/TrinityCore/commit/88f4d30445937b9de42f5cb25acad75fc89bdccb)
This commit is contained in:
hondacrx
2021-03-29 12:18:59 -04:00
parent 6e2c9a32e7
commit 6977599b1b
3 changed files with 23 additions and 15 deletions
+1 -1
View File
@@ -2210,7 +2210,7 @@ namespace Game.Entities
stmt.AddValue(index++, GetStat((Stats)i)); stmt.AddValue(index++, GetStat((Stats)i));
for (int i = 0; i < (int)SpellSchools.Max; ++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.BlockPercentage);
stmt.AddValue(index++, (float)m_activePlayerData.DodgePercentage); stmt.AddValue(index++, (float)m_activePlayerData.DodgePercentage);
+2 -2
View File
@@ -3828,7 +3828,7 @@ namespace Game.Entities
uint armor = proto.GetArmor(itemLevel); uint armor = proto.GetArmor(itemLevel);
if (armor != 0) 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) 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); 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 main hand is a 2h weapon, count it twice
if (!bestItemLevels.TryGetValue(EquipmentSlot.MainHand, out Tuple<InventoryType, uint> mainHand) && mainHand.Item1 == InventoryType.Weapon2Hand) if (bestItemLevels.TryGetValue(EquipmentSlot.MainHand, out Tuple<InventoryType, uint> mainHand) && mainHand.Item1 == InventoryType.Weapon2Hand)
sum += mainHand.Item2; sum += mainHand.Item2;
sum /= 16.0f; sum /= 16.0f;
+20 -12
View File
@@ -324,8 +324,16 @@ namespace Game.Entities
if (school > SpellSchools.Normal) if (school > SpellSchools.Normal)
{ {
UnitMods unitMod = UnitMods.ResistanceStart + (int)school; UnitMods unitMod = UnitMods.ResistanceStart + (int)school;
SetResistance(school, (int)GetFlatModifierValue(unitMod, UnitModifierFlatType.Base)); float value = MathFunctions.CalculatePct(GetFlatModifierValue(unitMod, UnitModifierFlatType.Base), Math.Max(GetFlatModifierValue(unitMod, UnitModifierFlatType.BasePCTExcludeCreate), -100.0f));
SetBonusResistanceMod(school, (int)(GetTotalAuraModValue(unitMod) - GetResistance(school))); 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 else
UpdateArmor(); 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 void SetCreateMana(uint val) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BaseMana), val); }
public uint GetArmor() public uint GetArmor()
{ {
return (uint)(GetResistance(SpellSchools.Normal) + GetBonusResistanceMod(SpellSchools.Normal)); return (uint)GetResistance(SpellSchools.Normal);
} }
public void SetArmor(int val, int bonusVal) public void SetArmor(int val, int bonusVal)
{ {
@@ -404,7 +412,7 @@ namespace Game.Entities
int? resist = null; int? resist = null;
for (int i = (int)SpellSchools.Normal; i < (int)SpellSchools.Max; ++i) 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)) if (Convert.ToBoolean((int)mask & (1 << i)) && (!resist.HasValue || resist.Value > schoolResistance))
resist = schoolResistance; resist = schoolResistance;
} }
@@ -1299,25 +1307,25 @@ namespace Game.Entities
{ {
UnitMods unitMod = UnitMods.Armor; UnitMods unitMod = UnitMods.Armor;
float value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base); // base armor (from items) float value = GetFlatModifierValue(unitMod, UnitModifierFlatType.Base); // base armor
float baseValue = value; value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base); // armor percent
// SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT counts as base armor
GetTotalAuraModifier(AuraType.ModArmorPctFromStat, aurEff => GetTotalAuraModifier(AuraType.ModArmorPctFromStat, aurEff =>
{ {
int miscValue = aurEff.GetMiscValue(); int miscValue = aurEff.GetMiscValue();
Stats stat = (miscValue != -2) ? (Stats)miscValue : GetPrimaryStat(); Stats stat = (miscValue != -2) ? (Stats)miscValue : GetPrimaryStat();
int armorAmount = (int)MathFunctions.CalculatePct(GetStat(stat), aurEff.GetAmount()); value += MathFunctions.CalculatePct((float)GetStat(stat), aurEff.GetAmount());
baseValue += armorAmount;
return true; return true;
}); });
value *= GetPctModifierValue(unitMod, UnitModifierPctType.Base); // armor percent from items float baseValue = value;
value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total);
value += GetFlatModifierValue(unitMod, UnitModifierFlatType.Total); // bonus armor from auras and items
value *= GetPctModifierValue(unitMod, UnitModifierPctType.Total); value *= GetPctModifierValue(unitMod, UnitModifierPctType.Total);
SetArmor((int)baseValue, (int)(value - baseValue)); SetArmor((int)value, (int)(value - baseValue));
Pet pet = GetPet(); Pet pet = GetPet();
if (pet) if (pet)