aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp68
1 files changed, 40 insertions, 28 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 0fca0b23daf..3571126b444 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -5102,60 +5102,72 @@ void Unit::UpdateStatBuffMod(Stats stat)
{
float modPos = 0.0f;
float modNeg = 0.0f;
- float factor = 0.0f;
+ float currentValue = 0.0f;
+ float previousValue = 0.0f;
UnitMods const unitMod = static_cast<UnitMods>(UNIT_MOD_STAT_START + AsUnderlyingType(stat));
// includes value from items and enchantments
- float modValue = GetFlatModifierValue(unitMod, BASE_VALUE);
- if (modValue > 0.f)
- modPos += modValue;
+ float baseModValue = GetFlatModifierValue(unitMod, BASE_VALUE);
+ if (IsGuardian())
+ baseModValue = static_cast<Guardian*>(this)->GetBonusStatFromOwner(stat);
+
+ if (baseModValue >= 0.0f)
+ modPos = baseModValue;
else
- modNeg += modValue;
+ modNeg = baseModValue;
- if (IsGuardian())
- {
- modValue = static_cast<Guardian*>(this)->GetBonusStatFromOwner(stat);
- if (modValue > 0.f)
- modPos += modValue;
- else
- modNeg += modValue;
- }
+ previousValue = baseModValue;
// SPELL_AURA_MOD_STAT_BONUS_PCT only affects BASE_VALUE
- modPos = CalculatePct(modPos, std::max(GetFlatModifierValue(unitMod, BASE_PCT_EXCLUDE_CREATE), -100.0f));
- modNeg = CalculatePct(modNeg, std::max(GetFlatModifierValue(unitMod, BASE_PCT_EXCLUDE_CREATE), -100.0f));
+ currentValue = CalculatePct(baseModValue, std::max(GetFlatModifierValue(unitMod, BASE_PCT_EXCLUDE_CREATE), -100.0f));
+ if (G3D::fuzzyGe(currentValue, previousValue))
+ modPos += currentValue - previousValue;
+ else
+ modNeg -= previousValue - currentValue;
- modPos += GetTotalAuraModifier(SPELL_AURA_MOD_STAT, [stat](AuraEffect const* aurEff) -> bool
+ // SPELL_AURA_MOD_PERCENT_STAT affects the base_value as well as the create stat
+ previousValue += GetCreateStat(stat);
+ float multiplier = GetTotalAuraMultiplier(SPELL_AURA_MOD_PERCENT_STAT, [stat](AuraEffect const* aurEff) -> bool
{
- if ((aurEff->GetMiscValue() < 0 || aurEff->GetMiscValue() == stat) && aurEff->GetAmount() > 0)
+ if (aurEff->GetMiscValue() == -1 || aurEff->GetMiscValue() == stat)
return true;
return false;
});
- modNeg += GetTotalAuraModifier(SPELL_AURA_MOD_STAT, [stat](AuraEffect const* aurEff) -> bool
- {
- if ((aurEff->GetMiscValue() < 0 || aurEff->GetMiscValue() == stat) && aurEff->GetAmount() < 0)
- return true;
- return false;
- });
+ currentValue = previousValue * multiplier;
+ if (G3D::fuzzyGe(currentValue, previousValue))
+ modPos += currentValue - previousValue;
+ else
+ modNeg -= previousValue - currentValue;
- factor = GetTotalAuraMultiplier(SPELL_AURA_MOD_PERCENT_STAT, [stat](AuraEffect const* aurEff) -> bool
+ // total_value offsets
+ previousValue += GetTotalAuraModifier(SPELL_AURA_MOD_STAT, [&](AuraEffect const* aurEff) -> bool
{
- if (aurEff->GetMiscValue() == -1 || aurEff->GetMiscValue() == stat)
+ if (aurEff->GetMiscValue() < 0 || aurEff->GetMiscValue() == stat)
+ {
+ if (aurEff->GetAmount() > 0)
+ modPos += aurEff->GetAmount();
+ else
+ modNeg += aurEff->GetAmount();
return true;
+ }
return false;
});
- factor *= GetTotalAuraMultiplier(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, [stat](AuraEffect const* aurEff) -> bool
+ // total_pct multiplier
+ multiplier = GetTotalAuraMultiplier(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, [stat](AuraEffect const* aurEff) -> bool
{
if (aurEff->GetMiscValue() == -1 || aurEff->GetMiscValue() == stat)
return true;
return false;
});
- modPos *= factor;
- modNeg *= factor;
+ currentValue = previousValue * multiplier;
+ if (G3D::fuzzyGe(currentValue, previousValue))
+ modPos += currentValue - previousValue;
+ else
+ modNeg -= previousValue - currentValue;
m_floatStatPosBuff[stat] = modPos;
m_floatStatNegBuff[stat] = modNeg;