aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-10-16 22:05:02 +0200
committerShauren <shauren.trinity@gmail.com>2021-10-16 22:05:02 +0200
commitba4fa060d765a35507f1a73287504c3f2e440fdb (patch)
treee166fc1f4de33ddb87243482d159077cda2879d8 /src/server/game/Spells
parent3e81db7b9380269d4561eb5deb21fbef26913779 (diff)
Core/Auras: Implemented SPELL_AURA_ADD_PCT_MODIFIER_BY_SPELL_LABEL and SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL
Diffstat (limited to 'src/server/game/Spells')
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h4
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp45
-rw-r--r--src/server/game/Spells/SpellInfo.cpp19
-rw-r--r--src/server/game/Spells/SpellMgr.cpp3
4 files changed, 57 insertions, 14 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index 2287a1f772f..d81015afa44 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -303,8 +303,8 @@ enum AuraType : uint32
SPELL_AURA_ARENA_PREPARATION = 215,
SPELL_AURA_HASTE_SPELLS = 216,
SPELL_AURA_MOD_MELEE_HASTE_2 = 217,
- SPELL_AURA_ADD_PCT_MODIFIER_BY_SPELL_LABEL = 218, // NYI
- SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL = 219, // NYI
+ SPELL_AURA_ADD_PCT_MODIFIER_BY_SPELL_LABEL = 218,
+ SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL = 219,
SPELL_AURA_MOD_ABILITY_SCHOOL_MASK = 220, // NYI
SPELL_AURA_MOD_DETAUNT = 221,
SPELL_AURA_REMOVE_TRANSMOG_COST = 222,
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index ff7ffd5f443..38a5ac9c563 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -286,8 +286,8 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleArenaPreparation, //215 SPELL_AURA_ARENA_PREPARATION
&AuraEffect::HandleModCastingSpeed, //216 SPELL_AURA_HASTE_SPELLS
&AuraEffect::HandleModMeleeSpeedPct, //217 SPELL_AURA_MOD_MELEE_HASTE_2
- &AuraEffect::HandleNULL, //218 SPELL_AURA_ADD_PCT_MODIFIER_BY_SPELL_LABEL
- &AuraEffect::HandleNULL, //219 SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL
+ &AuraEffect::HandleNoImmediateEffect, //218 SPELL_AURA_ADD_PCT_MODIFIER_BY_SPELL_LABEL implemented in AuraEffect::CalculateSpellMod()
+ &AuraEffect::HandleNoImmediateEffect, //219 SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL implemented in AuraEffect::CalculateSpellMod()
&AuraEffect::HandleNULL, //220 SPELL_AURA_MOD_ABILITY_SCHOOL_MASK
&AuraEffect::HandleModDetaunt, //221 SPELL_AURA_MOD_DETAUNT
&AuraEffect::HandleNoImmediateEffect, //222 SPELL_AURA_REMOVE_TRANSMOG_COST implemented in WorldSession::HandleTransmogrifyItems
@@ -808,14 +808,43 @@ void AuraEffect::CalculateSpellMod()
case SPELL_AURA_ADD_PCT_MODIFIER:
if (!m_spellmod)
{
- m_spellmod = new SpellModifier(GetBase());
- m_spellmod->op = SpellModOp(GetMiscValue());
+ SpellModifierByClassMask* spellmod = new SpellModifierByClassMask(GetBase());
+ spellmod->op = SpellModOp(GetMiscValue());
- m_spellmod->type = GetAuraType() == SPELL_AURA_ADD_PCT_MODIFIER ? SPELLMOD_PCT : SPELLMOD_FLAT;
- m_spellmod->spellId = GetId();
- m_spellmod->mask = GetSpellEffectInfo().SpellClassMask;
+ spellmod->type = GetAuraType() == SPELL_AURA_ADD_PCT_MODIFIER ? SPELLMOD_PCT : SPELLMOD_FLAT;
+ spellmod->spellId = GetId();
+ spellmod->mask = GetSpellEffectInfo().SpellClassMask;
+ m_spellmod = spellmod;
}
- m_spellmod->value = GetAmount();
+ static_cast<SpellModifierByClassMask*>(m_spellmod)->value = GetAmount();
+ break;
+ case SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL:
+ if (!m_spellmod)
+ {
+ SpellFlatModifierByLabel* spellmod = new SpellFlatModifierByLabel(GetBase());
+ spellmod->op = SpellModOp(GetMiscValue());
+
+ spellmod->type = SPELLMOD_LABEL_FLAT;
+ spellmod->spellId = GetId();
+ spellmod->value.ModIndex = GetMiscValue();
+ spellmod->value.LabelID = GetMiscValueB();
+ m_spellmod = spellmod;
+ }
+ static_cast<SpellFlatModifierByLabel*>(m_spellmod)->value.ModifierValue = GetAmount();
+ break;
+ case SPELL_AURA_ADD_PCT_MODIFIER_BY_SPELL_LABEL:
+ if (!m_spellmod)
+ {
+ SpellPctModifierByLabel* spellmod = new SpellPctModifierByLabel(GetBase());
+ spellmod->op = SpellModOp(GetMiscValue());
+
+ spellmod->type = SPELLMOD_LABEL_PCT;
+ spellmod->spellId = GetId();
+ spellmod->value.ModIndex = GetMiscValue();
+ spellmod->value.LabelID = GetMiscValueB();
+ m_spellmod = spellmod;
+ }
+ static_cast<SpellPctModifierByLabel*>(m_spellmod)->value.ModifierValue = 1.0f + CalculatePct(1.0f, GetAmount());
break;
default:
break;
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 44896751acb..3ae31465448 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1729,9 +1729,22 @@ bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const
if (!affectSpell)
return false;
- // TEMP: dont use IsAffected - !familyName and !familyFlags are not valid options for spell mods
- // TODO: investigate if the !familyName and !familyFlags conditions are even valid for all other (nonmod) uses of SpellInfo::IsAffected
- return affectSpell->SpellFamilyName == SpellFamilyName && mod->mask & SpellFamilyFlags;
+ switch (mod->type)
+ {
+ case SPELLMOD_FLAT:
+ case SPELLMOD_PCT:
+ // TEMP: dont use IsAffected - !familyName and !familyFlags are not valid options for spell mods
+ // TODO: investigate if the !familyName and !familyFlags conditions are even valid for all other (nonmod) uses of SpellInfo::IsAffected
+ return affectSpell->SpellFamilyName == SpellFamilyName && static_cast<SpellModifierByClassMask const*>(mod)->mask & SpellFamilyFlags;
+ case SPELLMOD_LABEL_FLAT:
+ return HasLabel(static_cast<SpellFlatModifierByLabel const*>(mod)->value.LabelID);
+ case SPELLMOD_LABEL_PCT:
+ return HasLabel(static_cast<SpellPctModifierByLabel const*>(mod)->value.LabelID);
+ default:
+ break;
+ }
+
+ return false;
}
bool SpellInfo::CanPierceImmuneAura(SpellInfo const* auraSpellInfo) const
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index acbd500edba..6824392d3d0 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -1618,7 +1618,8 @@ void SpellMgr::LoadSpellProcs()
if (!spellEffectInfo.IsAura())
continue;
- if (spellEffectInfo.ApplyAuraName == SPELL_AURA_ADD_PCT_MODIFIER || spellEffectInfo.ApplyAuraName == SPELL_AURA_ADD_FLAT_MODIFIER)
+ if (spellEffectInfo.ApplyAuraName == SPELL_AURA_ADD_PCT_MODIFIER || spellEffectInfo.ApplyAuraName == SPELL_AURA_ADD_FLAT_MODIFIER
+ || spellEffectInfo.ApplyAuraName == SPELL_AURA_ADD_PCT_MODIFIER_BY_SPELL_LABEL || spellEffectInfo.ApplyAuraName == SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL)
{
found = true;
break;