aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp95
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h4
-rw-r--r--src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp12
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;