From bb0634c7c2f38409205db8b9c8b89f2bb6f54fb9 Mon Sep 17 00:00:00 2001 From: tobmaps Date: Sat, 23 Jul 2011 22:17:16 +0700 Subject: [PATCH] Core/Spells: Bonuses from SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN should be multiplicative --- src/server/game/Entities/Unit/Unit.cpp | 39 +++++-------------- .../scripts/World/areatrigger_scripts.cpp | 4 +- 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index cced511c307a7..c9698b6984d14 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10756,20 +10756,11 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellEntry const* spellProto, uint32 } // ..taken - int32 maxPositiveMod = 0; // max of the positive amount aura (that increase the damage taken) - int32 sumNegativeMod = 0; // sum the negative amount aura (that reduce the damage taken) - AuraEffectList const& mModDamagePercentTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); - for (AuraEffectList::const_iterator i = mModDamagePercentTaken.begin(); i != mModDamagePercentTaken.end(); ++i) - if ((*i)->GetMiscValue() & GetSpellSchoolMask(spellProto)) - { - if ((*i)->GetAmount() > 0) - { - if ((*i)->GetAmount() > maxPositiveMod) - maxPositiveMod = (*i)->GetAmount(); - } - else - sumNegativeMod += (*i)->GetAmount(); - } + float TakenTotalMod = 1.0f; + + // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN + // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085) + TakenTotalMod *= victim->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetSpellSchoolMask(spellProto)); // .. taken pct: dummy auras AuraEffectList const& mDummyAuras = victim->GetAuraEffectsByType(SPELL_AURA_DUMMY); @@ -10784,18 +10775,13 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellEntry const* spellProto, uint32 if (victim->GetTypeId() != TYPEID_PLAYER) continue; float mod = victim->ToPlayer()->GetRatingBonusValue(CR_CRIT_TAKEN_MELEE) * (-8.0f); - if (mod < (*i)->GetAmount()) - mod = (float)(*i)->GetAmount(); - sumNegativeMod += int32(mod); + AddPctF(TakenTotalMod, std::max(mod, float((*i)->GetAmount()))); } break; // Ebon Plague case 1933: if ((*i)->GetMiscValue() & (spellProto ? GetSpellSchoolMask(spellProto) : 0)) - { - if ((*i)->GetAmount() > maxPositiveMod) - maxPositiveMod = (*i)->GetAmount(); - } + AddPctN(TakenTotalMod, (*i)->GetAmount()); break; } } @@ -10804,7 +10790,7 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellEntry const* spellProto, uint32 AuraEffectList const& mOwnerTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) if ((*i)->GetCasterGUID() == GetGUID() && (*i)->IsAffectedOnSpell(spellProto)) - sumNegativeMod += (*i)->GetAmount(); + AddPctN(TakenTotalMod, (*i)->GetAmount()); // Mod damage from spell mechanic if (uint32 mechanicMask = GetAllSpellMechanicMask(spellProto)) @@ -10812,11 +10798,9 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellEntry const* spellProto, uint32 AuraEffectList const& mDamageDoneMechanic = victim->GetAuraEffectsByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT); for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i) if (mechanicMask & uint32(1<<((*i)->GetMiscValue()))) - sumNegativeMod += (*i)->GetAmount(); + AddPctN(TakenTotalMod, (*i)->GetAmount()); } - float TakenTotalMod = (sumNegativeMod + maxPositiveMod + 100.0f) / 100.0f; - // Taken/Done fixed damage bonus auras int32 DoneAdvertisedBenefit = SpellBaseDamageBonus(GetSpellSchoolMask(spellProto)); int32 TakenAdvertisedBenefit = SpellBaseDamageBonusForVictim(GetSpellSchoolMask(spellProto), victim); @@ -11937,10 +11921,7 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT } // ..taken - AuraEffectList const& mModDamagePercentTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); - for (AuraEffectList::const_iterator i = mModDamagePercentTaken.begin(); i != mModDamagePercentTaken.end(); ++i) - if ((*i)->GetMiscValue() & GetMeleeDamageSchoolMask()) - AddPctN(TakenTotalMod, (*i)->GetAmount()); + TakenTotalMod *= victim->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, GetMeleeDamageSchoolMask()); // From caster spells AuraEffectList const& mOwnerTaken = victim->GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); diff --git a/src/server/scripts/World/areatrigger_scripts.cpp b/src/server/scripts/World/areatrigger_scripts.cpp index 51c0cbff8e27e..9161ea27ec1fe 100644 --- a/src/server/scripts/World/areatrigger_scripts.cpp +++ b/src/server/scripts/World/areatrigger_scripts.cpp @@ -339,8 +339,8 @@ enum eWaygate AT_SHOLAZAR = 5046, AT_UNGORO = 5047, - QUEST_THE_MAKERS_OVERLOOK = 12613, - QUEST_THE_MAKERS_PERCH = 12559, + QUEST_THE_MAKERS_OVERLOOK = 12613, + QUEST_THE_MAKERS_PERCH = 12559, }; class AreaTrigger_at_sholazar_waygate : public AreaTriggerScript