diff options
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index e2656495467..0df4abea54f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -61,6 +61,7 @@ #include "DuelPackets.h" #include "MiscPackets.h" #include "SpellPackets.h" +#include "TalentPackets.h" pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= { @@ -3923,6 +3924,40 @@ void Spell::EffectApplyGlyph(SpellEffIndex /*effIndex*/) Player* player = m_caster->ToPlayer(); if (!player) return; + + std::vector<uint32>& glyphs = player->GetGlyphs(player->GetActiveTalentGroup()); + std::size_t replacedGlyph = glyphs.size(); + for (std::size_t i = 0; i < glyphs.size(); ++i) + { + if (std::vector<uint32> const* activeGlyphBindableSpells = sDB2Manager.GetGlyphBindableSpells(glyphs[i])) + { + if (std::find(activeGlyphBindableSpells->begin(), activeGlyphBindableSpells->end(), m_misc.SpellId) != activeGlyphBindableSpells->end()) + { + replacedGlyph = i; + player->RemoveAurasDueToSpell(sGlyphPropertiesStore.AssertEntry(glyphs[i])->SpellID); + break; + } + } + } + + uint32 glyphId = effectInfo->MiscValue; + if (replacedGlyph < glyphs.size()) + { + if (glyphId) + glyphs[replacedGlyph] = glyphId; + else + glyphs.erase(glyphs.begin() + replacedGlyph); + } + else if (glyphId) + glyphs.push_back(glyphId); + + if (GlyphPropertiesEntry const* glyphProperties = sGlyphPropertiesStore.LookupEntry(glyphId)) + player->CastSpell(player, glyphProperties->SpellID, true); + + WorldPackets::Talent::ActiveGlyphs activeGlyphs; + activeGlyphs.Glyphs.emplace_back(m_misc.SpellId, uint16(glyphId)); + activeGlyphs.IsFullUpdate = false; + player->SendDirectMessage(activeGlyphs.Write()); } void Spell::EffectEnchantHeldItem(SpellEffIndex /*effIndex*/) |