diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d019dc549..de25b81c4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7636,8 +7636,7 @@ int32 Unit::SpellAbsorbBonusDone(Unit* victim, SpellInfo const* spellProto, int3 return owner->SpellAbsorbBonusDone(victim, spellProto, absorbamount, spellEffectInfo, stack, aurEff); if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS) - || spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALING_MODIFIERS) - || spellProto->HasAttribute(SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS)) + || spellProto->HasAttribute(SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS)) return absorbamount; int32 doneTotal = 0; @@ -7707,64 +7706,23 @@ float Unit::SpellAbsorbPctDone(Unit* victim, SpellInfo const* spellProto) const if (Player* modOwner = GetSpellModOwner()) AddPct(doneTotalMod, modOwner->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE) + modOwner->GetTotalAuraModifier(SPELL_AURA_MOD_VERSATILITY)); - if (Player const* thisPlayer = ToPlayer()) - { - float maxModHealingPercentSchool = 0.f; - for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i) - if (spellProto->GetSchoolMask() & (1 << i)) - maxModHealingPercentSchool = std::max(maxModHealingPercentSchool, thisPlayer->m_activePlayerData->ModHealingDonePercent[i]); - - doneTotalMod *= maxModHealingPercentSchool; - } - else - doneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT); + doneTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_ABSORB_DONE_PCT); return doneTotalMod; } -int32 Unit::SpellAbsorbBonusTaken(Unit* caster, SpellInfo const* spellProto, int32 absorbamount) const +int32 Unit::SpellAbsorbBonusTaken(Unit* /*caster*/, SpellInfo const* spellProto, int32 absorbamount) const { - bool allowPositive = !spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALING_MODIFIERS); - bool allowNegative = !spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALING_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR13_ALWAYS_ALLOW_NEGATIVE_HEALING_PERCENT_MODIFIERS); - if (!allowPositive && !allowNegative) + if (spellProto->HasAttribute(SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS)) return absorbamount; + int32 doneTotal = 0; float takenTotalMod = 1.f; - if (allowNegative) - { - float minval = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT)); - if (minval) - AddPct(takenTotalMod, minval); - } + takenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_ABSORB_TAKEN_PCT); - if (allowPositive) - { - float maxval = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT)); - if (maxval) - AddPct(takenTotalMod, maxval); - } + float absorb = float(absorbamount + doneTotal) * takenTotalMod; - if (caster) - { - takenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_RECEIVED, [caster, spellProto, allowPositive, allowNegative](AuraEffect const* aurEff) - { - if (caster->GetGUID() != aurEff->GetCasterGUID() || !aurEff->IsAffectingSpell(spellProto)) - return false; - - if (aurEff->GetAmount() > 0) - { - if (!allowPositive) - return false; - } - else if (!allowNegative) - return false; - - return true; - }); - } - - float absorb = absorbamount * takenTotalMod; return static_cast(std::round(absorb)); } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 7af95dfc9..08024c884 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -859,8 +859,8 @@ enum SpellAttr11 : uint32 SPELL_ATTR11_UNK15 = 0x00008000, // TITLE Unknown attribute 15@Attr11 SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE = 0x00010000, // TITLE Not in Mythic+ Mode (Challenge Mode) SPELL_ATTR11_UNK17 = 0x00020000, // TITLE Unknown attribute 17@Attr11 - SPELL_ATTR11_UNK18 = 0x00040000, // TITLE Unknown attribute 18@Attr11 - SPELL_ATTR11_UNK19 = 0x00080000, // TITLE Unknown attribute 19@Attr11 + SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS = 0x00040000, // TITLE Ignore Caster Absorb Modifiers + SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS = 0x00080000, // TITLE Ignore Target Absorb Modifiers SPELL_ATTR11_UNK20 = 0x00100000, // TITLE Unknown attribute 20@Attr11 SPELL_ATTR11_UNK21 = 0x00200000, // TITLE Unknown attribute 21@Attr11 SPELL_ATTR11_UNK22 = 0x00400000, // TITLE Unknown attribute 22@Attr11 diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp index b61388595..4aa5c2557 100644 --- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -1714,8 +1714,8 @@ TC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr11 value) case SPELL_ATTR11_UNK15: return { "SPELL_ATTR11_UNK15", "Unknown attribute 15@Attr11", "" }; case SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE: return { "SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE", "Not in Mythic+ Mode (Challenge Mode)", "" }; case SPELL_ATTR11_UNK17: return { "SPELL_ATTR11_UNK17", "Unknown attribute 17@Attr11", "" }; - case SPELL_ATTR11_UNK18: return { "SPELL_ATTR11_UNK18", "Unknown attribute 18@Attr11", "" }; - case SPELL_ATTR11_UNK19: return { "SPELL_ATTR11_UNK19", "Unknown attribute 19@Attr11", "" }; + case SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS: return { "SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS", "Ignore Caster Absorb Modifiers", "" }; + case SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS: return { "SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS", "Ignore Target Absorb Modifiers", "" }; case SPELL_ATTR11_UNK20: return { "SPELL_ATTR11_UNK20", "Unknown attribute 20@Attr11", "" }; case SPELL_ATTR11_UNK21: return { "SPELL_ATTR11_UNK21", "Unknown attribute 21@Attr11", "" }; case SPELL_ATTR11_UNK22: return { "SPELL_ATTR11_UNK22", "Unknown attribute 22@Attr11", "" }; @@ -1758,8 +1758,8 @@ TC_API_EXPORT SpellAttr11 EnumUtils::FromIndex(size_t index) case 15: return SPELL_ATTR11_UNK15; case 16: return SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE; case 17: return SPELL_ATTR11_UNK17; - case 18: return SPELL_ATTR11_UNK18; - case 19: return SPELL_ATTR11_UNK19; + case 18: return SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS; + case 19: return SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS; case 20: return SPELL_ATTR11_UNK20; case 21: return SPELL_ATTR11_UNK21; case 22: return SPELL_ATTR11_UNK22; @@ -1799,8 +1799,8 @@ TC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr11 value) case SPELL_ATTR11_UNK15: return 15; case SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE: return 16; case SPELL_ATTR11_UNK17: return 17; - case SPELL_ATTR11_UNK18: return 18; - case SPELL_ATTR11_UNK19: return 19; + case SPELL_ATTR11_IGNORE_CASTER_ABSORB_MODIFIERS: return 18; + case SPELL_ATTR11_IGNORE_TARGET_ABSORB_MODIFIERS: return 19; case SPELL_ATTR11_UNK20: return 20; case SPELL_ATTR11_UNK21: return 21; case SPELL_ATTR11_UNK22: return 22; @@ -2333,6 +2333,135 @@ TC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr15 value) } } +/*******************************************************************\ +|* data for enum 'SpellAttr16' in 'SharedDefines.h' auto-generated *| +\*******************************************************************/ +template <> +TC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr16 value) +{ + switch (value) + { + case SPELL_ATTR16_UNK0: return { "SPELL_ATTR16_UNK0", "Unknown attribute 0@Attr16", "" }; + case SPELL_ATTR16_UNK1: return { "SPELL_ATTR16_UNK1", "Unknown attribute 1@Attr16", "" }; + case SPELL_ATTR16_UNK2: return { "SPELL_ATTR16_UNK2", "Unknown attribute 2@Attr16", "" }; + case SPELL_ATTR16_UNK3: return { "SPELL_ATTR16_UNK3", "Unknown attribute 3@Attr16", "" }; + case SPELL_ATTR16_UNK4: return { "SPELL_ATTR16_UNK4", "Unknown attribute 4@Attr16", "" }; + case SPELL_ATTR16_UNK5: return { "SPELL_ATTR16_UNK5", "Unknown attribute 5@Attr16", "" }; + case SPELL_ATTR16_UNK6: return { "SPELL_ATTR16_UNK6", "Unknown attribute 6@Attr16", "" }; + case SPELL_ATTR16_UNK7: return { "SPELL_ATTR16_UNK7", "Unknown attribute 7@Attr16", "" }; + case SPELL_ATTR16_UNK8: return { "SPELL_ATTR16_UNK8", "Unknown attribute 8@Attr16", "" }; + case SPELL_ATTR16_UNK9: return { "SPELL_ATTR16_UNK9", "Unknown attribute 9@Attr16", "" }; + case SPELL_ATTR16_UNK10: return { "SPELL_ATTR16_UNK10", "Unknown attribute 10@Attr16", "" }; + case SPELL_ATTR16_UNK11: return { "SPELL_ATTR16_UNK11", "Unknown attribute 11@Attr16", "" }; + case SPELL_ATTR16_UNK12: return { "SPELL_ATTR16_UNK12", "Unknown attribute 12@Attr16", "" }; + case SPELL_ATTR16_UNK13: return { "SPELL_ATTR16_UNK13", "Unknown attribute 13@Attr16", "" }; + case SPELL_ATTR16_UNK14: return { "SPELL_ATTR16_UNK14", "Unknown attribute 14@Attr16", "" }; + case SPELL_ATTR16_UNK15: return { "SPELL_ATTR16_UNK15", "Unknown attribute 15@Attr16", "" }; + case SPELL_ATTR16_UNK16: return { "SPELL_ATTR16_UNK16", "Unknown attribute 16@Attr16", "" }; + case SPELL_ATTR16_UNK17: return { "SPELL_ATTR16_UNK17", "Unknown attribute 17@Attr16", "" }; + case SPELL_ATTR16_UNK18: return { "SPELL_ATTR16_UNK18", "Unknown attribute 18@Attr16", "" }; + case SPELL_ATTR16_UNK19: return { "SPELL_ATTR16_UNK19", "Unknown attribute 19@Attr16", "" }; + case SPELL_ATTR16_UNK20: return { "SPELL_ATTR16_UNK20", "Unknown attribute 20@Attr16", "" }; + case SPELL_ATTR16_UNK21: return { "SPELL_ATTR16_UNK21", "Unknown attribute 21@Attr16", "" }; + case SPELL_ATTR16_UNK22: return { "SPELL_ATTR16_UNK22", "Unknown attribute 22@Attr16", "" }; + case SPELL_ATTR16_UNK23: return { "SPELL_ATTR16_UNK23", "Unknown attribute 23@Attr16", "" }; + case SPELL_ATTR16_UNK24: return { "SPELL_ATTR16_UNK24", "Unknown attribute 24@Attr16", "" }; + case SPELL_ATTR16_UNK25: return { "SPELL_ATTR16_UNK25", "Unknown attribute 25@Attr16", "" }; + case SPELL_ATTR16_UNK26: return { "SPELL_ATTR16_UNK26", "Unknown attribute 26@Attr16", "" }; + case SPELL_ATTR16_UNK27: return { "SPELL_ATTR16_UNK27", "Unknown attribute 27@Attr16", "" }; + case SPELL_ATTR16_UNK28: return { "SPELL_ATTR16_UNK28", "Unknown attribute 28@Attr16", "" }; + case SPELL_ATTR16_UNK29: return { "SPELL_ATTR16_UNK29", "Unknown attribute 29@Attr16", "" }; + case SPELL_ATTR16_UNK30: return { "SPELL_ATTR16_UNK30", "Unknown attribute 30@Attr16", "" }; + case SPELL_ATTR16_UNK31: return { "SPELL_ATTR16_UNK31", "Unknown attribute 31@Attr16", "" }; + default: throw std::out_of_range("value"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils::Count() { return 32; } + +template <> +TC_API_EXPORT SpellAttr16 EnumUtils::FromIndex(size_t index) +{ + switch (index) + { + case 0: return SPELL_ATTR16_UNK0; + case 1: return SPELL_ATTR16_UNK1; + case 2: return SPELL_ATTR16_UNK2; + case 3: return SPELL_ATTR16_UNK3; + case 4: return SPELL_ATTR16_UNK4; + case 5: return SPELL_ATTR16_UNK5; + case 6: return SPELL_ATTR16_UNK6; + case 7: return SPELL_ATTR16_UNK7; + case 8: return SPELL_ATTR16_UNK8; + case 9: return SPELL_ATTR16_UNK9; + case 10: return SPELL_ATTR16_UNK10; + case 11: return SPELL_ATTR16_UNK11; + case 12: return SPELL_ATTR16_UNK12; + case 13: return SPELL_ATTR16_UNK13; + case 14: return SPELL_ATTR16_UNK14; + case 15: return SPELL_ATTR16_UNK15; + case 16: return SPELL_ATTR16_UNK16; + case 17: return SPELL_ATTR16_UNK17; + case 18: return SPELL_ATTR16_UNK18; + case 19: return SPELL_ATTR16_UNK19; + case 20: return SPELL_ATTR16_UNK20; + case 21: return SPELL_ATTR16_UNK21; + case 22: return SPELL_ATTR16_UNK22; + case 23: return SPELL_ATTR16_UNK23; + case 24: return SPELL_ATTR16_UNK24; + case 25: return SPELL_ATTR16_UNK25; + case 26: return SPELL_ATTR16_UNK26; + case 27: return SPELL_ATTR16_UNK27; + case 28: return SPELL_ATTR16_UNK28; + case 29: return SPELL_ATTR16_UNK29; + case 30: return SPELL_ATTR16_UNK30; + case 31: return SPELL_ATTR16_UNK31; + default: throw std::out_of_range("index"); + } +} + +template <> +TC_API_EXPORT size_t EnumUtils::ToIndex(SpellAttr16 value) +{ + switch (value) + { + case SPELL_ATTR16_UNK0: return 0; + case SPELL_ATTR16_UNK1: return 1; + case SPELL_ATTR16_UNK2: return 2; + case SPELL_ATTR16_UNK3: return 3; + case SPELL_ATTR16_UNK4: return 4; + case SPELL_ATTR16_UNK5: return 5; + case SPELL_ATTR16_UNK6: return 6; + case SPELL_ATTR16_UNK7: return 7; + case SPELL_ATTR16_UNK8: return 8; + case SPELL_ATTR16_UNK9: return 9; + case SPELL_ATTR16_UNK10: return 10; + case SPELL_ATTR16_UNK11: return 11; + case SPELL_ATTR16_UNK12: return 12; + case SPELL_ATTR16_UNK13: return 13; + case SPELL_ATTR16_UNK14: return 14; + case SPELL_ATTR16_UNK15: return 15; + case SPELL_ATTR16_UNK16: return 16; + case SPELL_ATTR16_UNK17: return 17; + case SPELL_ATTR16_UNK18: return 18; + case SPELL_ATTR16_UNK19: return 19; + case SPELL_ATTR16_UNK20: return 20; + case SPELL_ATTR16_UNK21: return 21; + case SPELL_ATTR16_UNK22: return 22; + case SPELL_ATTR16_UNK23: return 23; + case SPELL_ATTR16_UNK24: return 24; + case SPELL_ATTR16_UNK25: return 25; + case SPELL_ATTR16_UNK26: return 26; + case SPELL_ATTR16_UNK27: return 27; + case SPELL_ATTR16_UNK28: return 28; + case SPELL_ATTR16_UNK29: return 29; + case SPELL_ATTR16_UNK30: return 30; + case SPELL_ATTR16_UNK31: return 31; + default: throw std::out_of_range("value"); + } +} + /***********************************************************************\ |* data for enum 'SpellCastResult' in 'SharedDefines.h' auto-generated *| \***********************************************************************/ @@ -2664,13 +2793,14 @@ TC_API_EXPORT EnumText EnumUtils::ToString(SpellCastResult valu case SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN: return { "SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN", "SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN", "" }; case SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT: return { "SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT", "SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT", "" }; case SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN: return { "SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN", "SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN", "" }; + case SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN: return { "SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN", "SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN", "" }; case SPELL_FAILED_UNKNOWN: return { "SPELL_FAILED_UNKNOWN", "SPELL_FAILED_UNKNOWN", "" }; default: throw std::out_of_range("value"); } } template <> -TC_API_EXPORT size_t EnumUtils::Count() { return 324; } +TC_API_EXPORT size_t EnumUtils::Count() { return 325; } template <> TC_API_EXPORT SpellCastResult EnumUtils::FromIndex(size_t index) @@ -3000,7 +3130,8 @@ TC_API_EXPORT SpellCastResult EnumUtils::FromIndex(size_t index case 320: return SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN; case 321: return SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT; case 322: return SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN; - case 323: return SPELL_FAILED_UNKNOWN; + case 323: return SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN; + case 324: return SPELL_FAILED_UNKNOWN; default: throw std::out_of_range("index"); } } @@ -3333,7 +3464,8 @@ TC_API_EXPORT size_t EnumUtils::ToIndex(SpellCastResult value) case SPELL_FAILED_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN: return 320; case SPELL_FAILED_ITEM_CREATION_DISABLED_FOR_EVENT: return 321; case SPELL_FAILED_WARBAND_SCENE_ALREADY_KNOWN: return 322; - case SPELL_FAILED_UNKNOWN: return 323; + case SPELL_FAILED_TRANSMOG_OUTFIT_ALREADY_KNOWN: return 323; + case SPELL_FAILED_UNKNOWN: return 324; default: throw std::out_of_range("value"); } } diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index e5bf0b1c0..5e1e7c01a 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -505,8 +505,8 @@ enum AuraType : uint32 SPELL_AURA_MOD_MAX_POWER = 418, SPELL_AURA_MOD_BASE_MANA_PCT = 419, SPELL_AURA_MOD_BATTLE_PET_XP_PCT = 420, - SPELL_AURA_MOD_ABSORB_EFFECTS_DONE_PCT = 421, // NYI - SPELL_AURA_MOD_ABSORB_EFFECTS_TAKEN_PCT = 422, // NYI + SPELL_AURA_MOD_ABSORB_DONE_PCT = 421, + SPELL_AURA_MOD_ABSORB_TAKEN_PCT = 422, SPELL_AURA_MOD_MANA_COST_PCT = 423, SPELL_AURA_CASTER_IGNORE_LOS = 424, // NYI SPELL_AURA_425 = 425, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index ed1052d28..1d8bc7eb4 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -490,8 +490,8 @@ NonDefaultConstructible AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleAuraModMaxPower, //418 SPELL_AURA_MOD_MAX_POWER &AuraEffect::HandleAuraModIncreaseBaseManaPercent, //419 SPELL_AURA_MOD_BASE_MANA_PCT &AuraEffect::HandleNoImmediateEffect, //420 SPELL_AURA_MOD_BATTLE_PET_XP_PCT - Implemented in BattlePetMgr::GrantBattlePetExperience - &AuraEffect::HandleNULL, //421 SPELL_AURA_MOD_ABSORB_EFFECTS_DONE_PCT - &AuraEffect::HandleNULL, //422 SPELL_AURA_MOD_ABSORB_EFFECTS_TAKEN_PCT + &AuraEffect::HandleNoImmediateEffect, //421 SPELL_AURA_MOD_ABSORB_DONE_PCT implemented in Unit::SpellAbsorbPctDone + &AuraEffect::HandleNoImmediateEffect, //422 SPELL_AURA_MOD_ABSORB_TAKEN_PCT implemented in Unit::SpellAbsorbBonusTaken &AuraEffect::HandleModManaCostPct, //423 SPELL_AURA_MOD_MANA_COST_PCT &AuraEffect::HandleNULL, //424 SPELL_AURA_CASTER_IGNORE_LOS &AuraEffect::HandleNULL, //425