diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
4 files changed, 23 insertions, 16 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e2f970031da..de9e29342fc 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7740,7 +7740,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply) if (uint32 armor = proto->GetArmor(itemLevel)) { - HandleStatFlatModifier(UNIT_MOD_ARMOR, BASE_VALUE, float(armor), apply); + HandleStatFlatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(armor), apply); if (proto->GetClass() == ITEM_CLASS_ARMOR && proto->GetSubClass() == ITEM_SUBCLASS_ARMOR_SHIELD) SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ShieldBlock), apply ? int32(armor * 2.5f) : 0); } @@ -21651,7 +21651,7 @@ void Player::_SaveStats(CharacterDatabaseTransaction& trans) const stmt->setUInt32(index++, GetStat(Stats(i))); for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) - stmt->setUInt32(index++, GetResistance(SpellSchools(i)) + GetBonusResistanceMod(SpellSchools(i))); + stmt->setUInt32(index++, GetResistance(SpellSchools(i))); stmt->setFloat(index++, m_activePlayerData->BlockPercentage); stmt->setFloat(index++, m_activePlayerData->DodgePercentage); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 4017ceab3b9..05b85293d0d 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -239,24 +239,23 @@ void Player::UpdateArmor() { UnitMods unitMod = UNIT_MOD_ARMOR; - float value = GetFlatModifierValue(unitMod, BASE_VALUE); // base armor (from items) - float baseValue = value; + float value = GetFlatModifierValue(unitMod, BASE_VALUE); // base armor + value *= GetPctModifierValue(unitMod, BASE_PCT); // armor percent - GetTotalAuraModifier(SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT, [this, &baseValue](AuraEffect const* aurEff) { + // SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT counts as base armor + GetTotalAuraModifier(SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT, [this, &value](AuraEffect const* aurEff) { int32 miscValue = aurEff->GetMiscValue(); Stats stat = (miscValue != -2) ? Stats(miscValue) : GetPrimaryStat(); - - int32 armorAmount = CalculatePct(GetStat(stat), aurEff->GetAmount()); - baseValue += armorAmount; - + value += CalculatePct(float(GetStat(stat)), aurEff->GetAmount()); return true; }); - value *= GetPctModifierValue(unitMod, BASE_PCT); // armor percent from items - value += GetFlatModifierValue(unitMod, TOTAL_VALUE); + float baseValue = value; + + value += GetFlatModifierValue(unitMod, TOTAL_VALUE); // bonus armor from auras and items value *= GetPctModifierValue(unitMod, TOTAL_PCT); - SetArmor(int32(baseValue), int32(value - baseValue)); + SetArmor(int32(value), int32(value - baseValue)); Pet* pet = GetPet(); if (pet) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 759a111136a..cdec9be3caa 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9856,8 +9856,16 @@ void Unit::UpdateResistances(uint32 school) { UnitMods unitMod = UnitMods(UNIT_MOD_RESISTANCE_START + school); - SetResistance(SpellSchools(school), int32(GetFlatModifierValue(unitMod, BASE_VALUE))); - SetBonusResistanceMod(SpellSchools(school), int32(GetTotalAuraModValue(unitMod) - GetResistance(SpellSchools(school)))); + float value = CalculatePct(GetFlatModifierValue(unitMod, BASE_VALUE), std::max(GetFlatModifierValue(unitMod, BASE_PCT_EXCLUDE_CREATE), -100.0f)); + value *= GetPctModifierValue(unitMod, BASE_PCT); + + float baseValue = value; + + value += GetFlatModifierValue(unitMod, TOTAL_VALUE); + value *= GetPctModifierValue(unitMod, TOTAL_PCT); + + SetResistance(SpellSchools(school), int32(value)); + SetBonusResistanceMod(SpellSchools(school), int32(value - baseValue)); } else UpdateArmor(); @@ -13410,7 +13418,7 @@ int32 Unit::GetResistance(SpellSchoolMask mask) const Optional<int32> resist = boost::make_optional(false, 0); for (int32 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i) { - int32 schoolResistance = GetResistance(SpellSchools(i)) + GetBonusResistanceMod(SpellSchools(i)); + int32 schoolResistance = GetResistance(SpellSchools(i)); if (mask & (1 << i) && (!resist || *resist > schoolResistance)) resist = schoolResistance; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2b8122c6125..71da844b761 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1037,7 +1037,7 @@ class TC_GAME_API Unit : public WorldObject float GetStat(Stats stat) const { return float(m_unitData->Stats[stat]); } void SetStat(Stats stat, int32 val) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::Stats, stat), val); } - uint32 GetArmor() const { return GetResistance(SPELL_SCHOOL_NORMAL) + GetBonusResistanceMod(SPELL_SCHOOL_NORMAL); } + uint32 GetArmor() const { return GetResistance(SPELL_SCHOOL_NORMAL); } void SetArmor(int32 val, int32 bonusVal) { SetResistance(SPELL_SCHOOL_NORMAL, val); |