aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp19
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp14
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
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);