diff options
| author | Shauren <shauren.trinity@gmail.com> | 2021-10-16 22:05:02 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-10-16 22:05:02 +0200 |
| commit | ba4fa060d765a35507f1a73287504c3f2e440fdb (patch) | |
| tree | e166fc1f4de33ddb87243482d159077cda2879d8 /src/server/game/Spells | |
| parent | 3e81db7b9380269d4561eb5deb21fbef26913779 (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.h | 4 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 45 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 19 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 3 |
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; |
