diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 943f3e53c9..df8d54a9d4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2844,6 +2844,49 @@ void Player::SendInitialSpells() SendDirectMessage(&data); } +void Player::SendUnlearnSpells() +{ + WorldPacket data(SMSG_SEND_UNLEARN_SPELLS, 4 + 4 * m_spells.size()); + + uint32 spellCount = 0; + size_t countPos = data.wpos(); + data << uint32(spellCount); + + for (auto const& itr : m_spells) + { + if (itr.second->State == PLAYERSPELL_REMOVED || itr.second->Active) + continue; + + auto skillLineAbilities = sSpellMgr->GetSkillLineAbilityMapBounds(itr.first); + if (skillLineAbilities.first == skillLineAbilities.second) + continue; + + uint32 nextRank = sSpellMgr->GetNextSpellInChain(itr.first); + if (!nextRank || !HasSpell(nextRank)) + continue; + + data << uint32(itr.first); + ++spellCount; + } + + data.put(countPos, spellCount); + SendDirectMessage(&data); +} + +bool Player::IsUnlearnNeededForSpell(uint32 spellId) +{ + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(spellId); + if (spellInfo->IsRanked() && !spellInfo->IsStackableWithRanks()) + { + auto skillLineAbilities = sSpellMgr->GetSkillLineAbilityMapBounds(spellId); + if (skillLineAbilities.first != skillLineAbilities.second) + { + return true; + } + } + return false; +} + void Player::RemoveMail(uint32 id) { for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index a95f44b2a8..9892a4fe94 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1638,6 +1638,9 @@ public: void UpdateNextMailTimeAndUnreads(); void AddNewMailDeliverTime(time_t deliver_time); + void SendUnlearnSpells(); + static bool IsUnlearnNeededForSpell(uint32 spellId); + void RemoveMail(uint32 id); void AddMail(Mail* mail) { m_mail.push_front(mail); }// for call from WorldSession::SendMailTo diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index b969e81057..dbbdcc347d 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -264,6 +264,9 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket& recvData) else _player->learnSpell(spellId); + if (Player::IsUnlearnNeededForSpell(spellId)) + _player->SendUnlearnSpells(); + WorldPacket data(SMSG_TRAINER_BUY_SUCCEEDED, 12); data << guid; data << uint32(spellId); // should be same as in packet from client