diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/SkillHandler.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TalentPackets.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TalentPackets.h | 10 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
6 files changed, 37 insertions, 3 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 533bc3c0bb9..7c92af82dd8 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -26232,7 +26232,6 @@ bool Player::LearnTalent(uint32 talentId, uint8 requestedRank) // update free talent points SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::CharacterPoints), static_cast<int32>(CalculateTalentsPoints() - GetSpentTalentPointsCount())); - SendTalentsInfoData(); return true; } diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp index c86725d2a52..15dcfc8083c 100644 --- a/src/server/game/Handlers/SkillHandler.cpp +++ b/src/server/game/Handlers/SkillHandler.cpp @@ -32,7 +32,16 @@ void WorldSession::HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& void WorldSession::HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& packet) { - _player->LearnTalent(packet.TalentID, packet.RequestedRank); + if (_player->LearnTalent(packet.TalentID, packet.RequestedRank)) + _player->SendTalentsInfoData(); +} + +void WorldSession::HandleLearnPreviewTalentsOpcode(WorldPackets::Talent::LearnPreviewTalents& packet) +{ + for (WorldPackets::Talent::TalentInfo const& talent : packet.Talents) + _player->LearnTalent(talent.TalentID, talent.Rank); + + _player->SendTalentsInfoData(); } void WorldSession::HandleLearnPvpTalentsOpcode(WorldPackets::Talent::LearnPvpTalents& /*packet*/) diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp index d223af5f95c..96affd32715 100644 --- a/src/server/game/Server/Packets/TalentPackets.cpp +++ b/src/server/game/Server/Packets/TalentPackets.cpp @@ -38,6 +38,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Talent::TalentInfo const& return data; } +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Talent::TalentInfo& talentInfo) +{ + data >> talentInfo.TalentID; + data >> talentInfo.Rank; + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Talent::TalentGroupInfo const& talentGroupInfo) { data << uint8(talentGroupInfo.Talents.size()); @@ -84,6 +91,13 @@ void WorldPackets::Talent::LearnTalent::Read() _worldPacket >> RequestedRank; } +void WorldPackets::Talent::LearnPreviewTalents::Read() +{ + Talents.resize(_worldPacket.read<uint32>()); + for (TalentInfo& talent : Talents) + _worldPacket >> talent; +} + WorldPacket const* WorldPackets::Talent::RespecWipeConfirm::Write() { _worldPacket << int8(RespecType); diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h index cbee012a09b..9b2f6c29f57 100644 --- a/src/server/game/Server/Packets/TalentPackets.h +++ b/src/server/game/Server/Packets/TalentPackets.h @@ -155,6 +155,16 @@ namespace WorldPackets uint16 RequestedRank = 0; }; + class LearnPreviewTalents final : public ClientPacket + { + public: + LearnPreviewTalents(WorldPacket&& packet) : ClientPacket(CMSG_LEARN_PREVIEW_TALENTS, std::move(packet)) { } + + void Read() override; + + Array<TalentInfo, 60> Talents; + }; + class RemoveGlyph final : public ClientPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index d6260702863..4074f5ecdb1 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -555,7 +555,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_LATENCY_REPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LEARN_PVP_TALENTS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleLearnPvpTalentsOpcode); DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleLearnTalentsOpcode); - DEFINE_HANDLER(CMSG_LEARN_PREVIEW_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_LEARN_PREVIEW_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPreviewTalentsOpcode); DEFINE_HANDLER(CMSG_LEARN_PREVIEW_TALENTS_PET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentOpcode); DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveGroupOpcode); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 6c194c64e89..f7aa278fb27 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -735,6 +735,7 @@ namespace WorldPackets { class LearnTalent; class LearnTalents; + class LearnPreviewTalents; class LearnPvpTalents; class ConfirmRespecWipe; class RemoveGlyph; @@ -1517,6 +1518,7 @@ class TC_GAME_API WorldSession void HandleLearnPvpTalentsOpcode(WorldPackets::Talent::LearnPvpTalents& packet); void HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet); void HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& packet); + void HandleLearnPreviewTalentsOpcode(WorldPackets::Talent::LearnPreviewTalents& packet); void HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRespecWipe& confirmRespecWipe); void HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& packet); void HandleTradeSkillSetFavorite(WorldPackets::Spells::TradeSkillSetFavorite const& tradeSkillSetFavorite); |