diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-07-01 00:05:09 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-07-01 00:05:09 +0200 |
commit | 96bfc5f39b4efc0c8437f97746f1a97f028c6dd4 (patch) | |
tree | 1ba4697ffbbcad6f2e648bf3c8b52ba647185b42 | |
parent | 08778dc1c8c7aad6820a12b3ba229afa80361dc2 (diff) |
Core/Spells: Implemented SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS and SPELL_ATTR13_ALWAYS_ALLOW_NEGATIVE_HEALING_PERCENT_MODIFIERS
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 95 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 4 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp | 12 |
3 files changed, 75 insertions, 36 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index acbcac3d13c..a70f5529b74 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7298,6 +7298,10 @@ float Unit::SpellHealingPctDone(Unit* victim, SpellInfo const* spellProto) const if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALING_MODIFIERS)) return 1.0f; + // Some spells don't benefit from done mods + if (spellProto->HasAttribute(SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS)) + return 1.0f; + // No bonus healing for potion spells if (spellProto->SpellFamilyName == SPELLFAMILY_POTION) return 1.0f; @@ -7336,50 +7340,85 @@ float Unit::SpellHealingPctDone(Unit* victim, SpellInfo const* spellProto) const int32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, int32 healamount, DamageEffectType damagetype) 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) + return healamount; + float TakenTotalMod = 1.0f; // Healing taken percent - float minval = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT)); - if (minval) - AddPct(TakenTotalMod, minval); - - float maxval = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT)); - if (maxval) - AddPct(TakenTotalMod, maxval); - - // Nourish cast - if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000) + if (allowNegative) { - // Rejuvenation, Regrowth, Lifebloom, or Wild Growth - if (GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, flag128(0x50, 0x4000010, 0))) - // increase healing by 20% - TakenTotalMod *= 1.2f; + float minval = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT)); + if (minval) + AddPct(TakenTotalMod, minval); + + if (damagetype == DOT) + { + // Healing over time taken percent + float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT)); + if (minval_hot) + AddPct(TakenTotalMod, minval_hot); + } } - if (damagetype == DOT) + if (allowPositive) { - // Healing over time taken percent - float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT)); - if (minval_hot) - AddPct(TakenTotalMod, minval_hot); + float maxval = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT)); + if (maxval) + AddPct(TakenTotalMod, maxval); + + if (damagetype == DOT) + { + // Healing over time taken percent + float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT)); + if (maxval_hot) + AddPct(TakenTotalMod, maxval_hot); + } - float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT)); - if (maxval_hot) - AddPct(TakenTotalMod, maxval_hot); + // Nourish cast + if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000) + { + // Rejuvenation, Regrowth, Lifebloom, or Wild Growth + if (GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, flag128(0x50, 0x4000010, 0))) + // increase healing by 20% + TakenTotalMod *= 1.2f; + } } if (caster) { - TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_RECEIVED, [caster, spellProto](AuraEffect const* aurEff) -> bool + TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_RECEIVED, [caster, spellProto, allowPositive, allowNegative](AuraEffect const* aurEff) -> bool { - if (caster->GetGUID() == aurEff->GetCasterGUID() && aurEff->IsAffectingSpell(spellProto)) - return true; - return false; + 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; }); - TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_TAKEN_FROM_CASTER, [caster](AuraEffect const* aurEff) -> bool + TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_TAKEN_FROM_CASTER, [caster, allowPositive, allowNegative](AuraEffect const* aurEff) -> bool { - return aurEff->GetCasterGUID() == caster->GetGUID(); + if (aurEff->GetCasterGUID() != caster->GetGUID()) + return false; + + if (aurEff->GetAmount() > 0) + { + if (!allowPositive) + return false; + } + else if (!allowNegative) + return false; + + return true; }); } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 11a43dedc5b..172b876a5c0 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -783,7 +783,7 @@ enum SpellAttr9 : uint32 SPELL_ATTR9_SUPPRESS_VISUAL_KIT_ERRORS = 0x00200000, // TITLE Suppress Visual Kit Errors (client only) SPELL_ATTR9_SPELLCAST_OVERRIDE_IN_SPELLBOOK = 0x00400000, // TITLE Spellcast Override In Spellbook (client only) SPELL_ATTR9_JUMPCHARGE__NO_FACING_CONTROL = 0x00800000, // TITLE JumpCharge - no facing control - SPELL_ATTR9_UNK24 = 0x01000000, // TITLE Unknown attribute 24@Attr9 + SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS = 0x01000000, // TITLE Ignore Caster Healing Modifiers SPELL_ATTR9_UNK25 = 0x02000000, // TITLE Unknown attribute 25@Attr9 SPELL_ATTR9_UNK26 = 0x04000000, // TITLE Unknown attribute 26@Attr9 SPELL_ATTR9_UNK27 = 0x08000000, // TITLE Unknown attribute 27@Attr9 @@ -933,7 +933,7 @@ enum SpellAttr13 : uint32 SPELL_ATTR13_UNK23 = 0x00800000, // TITLE Unknown attribute 23@Attr13 SPELL_ATTR13_UNK24 = 0x01000000, // TITLE Unknown attribute 24@Attr13 SPELL_ATTR13_UNK25 = 0x02000000, // TITLE Unknown attribute 25@Attr13 - SPELL_ATTR13_UNK26 = 0x04000000, // TITLE Unknown attribute 26@Attr13 + SPELL_ATTR13_ALWAYS_ALLOW_NEGATIVE_HEALING_PERCENT_MODIFIERS = 0x04000000, // TITLE Always Allow Negative Healing Percent Modifiers SPELL_ATTR13_DO_NOT_ALLOW_DISABLE_MOVEMENT_INTERRUPT = 0x08000000, // TITLE Do Not Allow "Disable Movement Interrupt" SPELL_ATTR13_UNK28 = 0x10000000, // TITLE Unknown attribute 28@Attr13 SPELL_ATTR13_UNK29 = 0x20000000, // TITLE Unknown attribute 29@Attr13 diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp index c1bcd4e70c6..cca34b9bea0 100644 --- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -1459,7 +1459,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr9>::ToString(SpellAttr9 value) case SPELL_ATTR9_SUPPRESS_VISUAL_KIT_ERRORS: return { "SPELL_ATTR9_SUPPRESS_VISUAL_KIT_ERRORS", "Suppress Visual Kit Errors (client only)", "" }; case SPELL_ATTR9_SPELLCAST_OVERRIDE_IN_SPELLBOOK: return { "SPELL_ATTR9_SPELLCAST_OVERRIDE_IN_SPELLBOOK", "Spellcast Override In Spellbook (client only)", "" }; case SPELL_ATTR9_JUMPCHARGE__NO_FACING_CONTROL: return { "SPELL_ATTR9_JUMPCHARGE__NO_FACING_CONTROL", "JumpCharge - no facing control", "" }; - case SPELL_ATTR9_UNK24: return { "SPELL_ATTR9_UNK24", "Unknown attribute 24@Attr9", "" }; + case SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS: return { "SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS", "Ignore Caster Healing Modifiers", "" }; case SPELL_ATTR9_UNK25: return { "SPELL_ATTR9_UNK25", "Unknown attribute 25@Attr9", "" }; case SPELL_ATTR9_UNK26: return { "SPELL_ATTR9_UNK26", "Unknown attribute 26@Attr9", "" }; case SPELL_ATTR9_UNK27: return { "SPELL_ATTR9_UNK27", "Unknown attribute 27@Attr9", "" }; @@ -1503,7 +1503,7 @@ TC_API_EXPORT SpellAttr9 EnumUtils<SpellAttr9>::FromIndex(size_t index) case 21: return SPELL_ATTR9_SUPPRESS_VISUAL_KIT_ERRORS; case 22: return SPELL_ATTR9_SPELLCAST_OVERRIDE_IN_SPELLBOOK; case 23: return SPELL_ATTR9_JUMPCHARGE__NO_FACING_CONTROL; - case 24: return SPELL_ATTR9_UNK24; + case 24: return SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS; case 25: return SPELL_ATTR9_UNK25; case 26: return SPELL_ATTR9_UNK26; case 27: return SPELL_ATTR9_UNK27; @@ -1544,7 +1544,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr9>::ToIndex(SpellAttr9 value) case SPELL_ATTR9_SUPPRESS_VISUAL_KIT_ERRORS: return 21; case SPELL_ATTR9_SPELLCAST_OVERRIDE_IN_SPELLBOOK: return 22; case SPELL_ATTR9_JUMPCHARGE__NO_FACING_CONTROL: return 23; - case SPELL_ATTR9_UNK24: return 24; + case SPELL_ATTR9_IGNORE_CASTER_HEALING_MODIFIERS: return 24; case SPELL_ATTR9_UNK25: return 25; case SPELL_ATTR9_UNK26: return 26; case SPELL_ATTR9_UNK27: return 27; @@ -1977,7 +1977,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr13>::ToString(SpellAttr13 value) case SPELL_ATTR13_UNK23: return { "SPELL_ATTR13_UNK23", "Unknown attribute 23@Attr13", "" }; case SPELL_ATTR13_UNK24: return { "SPELL_ATTR13_UNK24", "Unknown attribute 24@Attr13", "" }; case SPELL_ATTR13_UNK25: return { "SPELL_ATTR13_UNK25", "Unknown attribute 25@Attr13", "" }; - case SPELL_ATTR13_UNK26: return { "SPELL_ATTR13_UNK26", "Unknown attribute 26@Attr13", "" }; + case SPELL_ATTR13_ALWAYS_ALLOW_NEGATIVE_HEALING_PERCENT_MODIFIERS: return { "SPELL_ATTR13_ALWAYS_ALLOW_NEGATIVE_HEALING_PERCENT_MODIFIERS", "Always Allow Negative Healing Percent Modifiers", "" }; case SPELL_ATTR13_DO_NOT_ALLOW_DISABLE_MOVEMENT_INTERRUPT: return { "SPELL_ATTR13_DO_NOT_ALLOW_DISABLE_MOVEMENT_INTERRUPT", "Do Not Allow \042Disable Movement Interrupt\042", "" }; case SPELL_ATTR13_UNK28: return { "SPELL_ATTR13_UNK28", "Unknown attribute 28@Attr13", "" }; case SPELL_ATTR13_UNK29: return { "SPELL_ATTR13_UNK29", "Unknown attribute 29@Attr13", "" }; @@ -2021,7 +2021,7 @@ TC_API_EXPORT SpellAttr13 EnumUtils<SpellAttr13>::FromIndex(size_t index) case 23: return SPELL_ATTR13_UNK23; case 24: return SPELL_ATTR13_UNK24; case 25: return SPELL_ATTR13_UNK25; - case 26: return SPELL_ATTR13_UNK26; + case 26: return SPELL_ATTR13_ALWAYS_ALLOW_NEGATIVE_HEALING_PERCENT_MODIFIERS; case 27: return SPELL_ATTR13_DO_NOT_ALLOW_DISABLE_MOVEMENT_INTERRUPT; case 28: return SPELL_ATTR13_UNK28; case 29: return SPELL_ATTR13_UNK29; @@ -2062,7 +2062,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr13>::ToIndex(SpellAttr13 value) case SPELL_ATTR13_UNK23: return 23; case SPELL_ATTR13_UNK24: return 24; case SPELL_ATTR13_UNK25: return 25; - case SPELL_ATTR13_UNK26: return 26; + case SPELL_ATTR13_ALWAYS_ALLOW_NEGATIVE_HEALING_PERCENT_MODIFIERS: return 26; case SPELL_ATTR13_DO_NOT_ALLOW_DISABLE_MOVEMENT_INTERRUPT: return 27; case SPELL_ATTR13_UNK28: return 28; case SPELL_ATTR13_UNK29: return 29; |