Core/Packets: added opcode handlers and packet structures for CMSG_LEARN_TALENT and CMSG_SET_PRIMARY_TALENT_TREE

This commit is contained in:
Ovahlord
2024-07-24 22:10:54 +02:00
parent ddbcf5f60b
commit 09885238ac
5 changed files with 34 additions and 31 deletions

View File

@@ -26,34 +26,18 @@
#include "SpellPackets.h"
#include "TalentPackets.h"
void WorldSession::HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet)
void WorldSession::HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& /*packet*/)
{
WorldPackets::Talent::LearnTalentFailed learnTalentFailed;
bool anythingLearned = false;
for (uint32 talentId : packet.Talents)
{
if (TalentLearnResult result = _player->LearnTalent(talentId, &learnTalentFailed.SpellID))
{
if (!learnTalentFailed.Reason)
learnTalentFailed.Reason = result;
learnTalentFailed.Talents.push_back(talentId);
}
else
anythingLearned = true;
}
if (learnTalentFailed.Reason)
SendPacket(learnTalentFailed.Write());
if (anythingLearned)
_player->SendTalentsInfoData();
}
void WorldSession::HandleLearnPreviewTalentsOpcode(WorldPackets::Talent::LearnPreviewTalents& /*packet*/)
{
}
void WorldSession::HandleSetPrimaryTalentTreeOpcode(WorldPackets::Talent::SetPrimaryTalentTree& /*packet*/)
{
}
void WorldSession::HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRespecWipe& confirmRespecWipe)
{
Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(confirmRespecWipe.RespecMaster, UNIT_NPC_FLAG_TRAINER, UNIT_NPC_FLAG_2_NONE);

View File

@@ -60,11 +60,10 @@ WorldPacket const* WorldPackets::Talent::UpdateTalentData::Write()
return &_worldPacket;
}
void WorldPackets::Talent::LearnTalents::Read()
void WorldPackets::Talent::LearnTalent::Read()
{
Talents.resize(_worldPacket.ReadBits(6));
for (uint32 i = 0; i < Talents.size(); ++i)
_worldPacket >> Talents[i];
_worldPacket >> TalentID;
_worldPacket >> TalentTab;
}
WorldPacket const* WorldPackets::Talent::RespecWipeConfirm::Write()
@@ -119,3 +118,8 @@ void WorldPackets::Talent::LearnPreviewTalents::Read()
for (TalentInfo& talent : Talents)
_worldPacket >> talent;
}
void WorldPackets::Talent::SetPrimaryTalentTree::Read()
{
_worldPacket >> TalentTab;
}

View File

@@ -60,13 +60,15 @@ namespace WorldPackets
TalentInfoUpdate Info;
};
class LearnTalents final : public ClientPacket
class LearnTalent final : public ClientPacket
{
public:
LearnTalents(WorldPacket&& packet) : ClientPacket(CMSG_LEARN_TALENTS, std::move(packet)) { }
LearnTalent(WorldPacket&& packet) : ClientPacket(CMSG_LEARN_TALENT, std::move(packet)) { }
void Read() override;
Array<uint16, MAX_TALENT_TIERS> Talents;
uint32 TalentID = 0;
uint16 TalentTab = 0;
};
class LearnPreviewTalents final : public ClientPacket
@@ -80,6 +82,16 @@ namespace WorldPackets
Array<TalentInfo, 100> Talents;
};
class SetPrimaryTalentTree final : public ClientPacket
{
public:
SetPrimaryTalentTree(WorldPacket&& packet) : ClientPacket(CMSG_SET_PRIMARY_TALENT_TREE, std::move(packet)) { }
void Read() override;
uint32 TalentTab = 0;
};
class RespecWipeConfirm final : public ServerPacket
{
public:

View File

@@ -516,7 +516,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_KEYBOUND_OVERRIDE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleKeyboundOverride);
DEFINE_HANDLER(CMSG_LATENCY_REPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_LEARN_PVP_TALENTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleLearnTalentsOpcode);
DEFINE_HANDLER(CMSG_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleLearnTalentOpcode);
DEFINE_HANDLER(CMSG_LEARN_PREVIEW_TALENTS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleLearnPreviewTalentsOpcode);
DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveGroupOpcode);
DEFINE_HANDLER(CMSG_LEAVE_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
@@ -854,6 +854,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_SET_PET_SLOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetPetSlot);
DEFINE_HANDLER(CMSG_SET_PLAYER_DECLINED_NAMES, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetPlayerDeclinedNames);
DEFINE_HANDLER(CMSG_SET_PREFERRED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SET_PRIMARY_TALENT_TREE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetPrimaryTalentTreeOpcode);
DEFINE_HANDLER(CMSG_SET_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetPvP);
DEFINE_HANDLER(CMSG_SET_RAID_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetRaidDifficultyOpcode);
DEFINE_HANDLER(CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetRestrictPingsToAssistants);

View File

@@ -710,9 +710,10 @@ namespace WorldPackets
namespace Talent
{
class LearnTalents;
class LearnTalent;
class LearnPreviewTalents;
class ConfirmRespecWipe;
class SetPrimaryTalentTree;
}
namespace Taxi
@@ -1492,8 +1493,9 @@ class TC_GAME_API WorldSession
void HandleMissileTrajectoryCollision(WorldPackets::Spells::MissileTrajectoryCollision& packet);
void HandleUpdateMissileTrajectory(WorldPackets::Spells::UpdateMissileTrajectory& packet);
void HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet);
void HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& packet);
void HandleLearnPreviewTalentsOpcode(WorldPackets::Talent::LearnPreviewTalents& packet);
void HandleSetPrimaryTalentTreeOpcode(WorldPackets::Talent::SetPrimaryTalentTree& packet);
void HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRespecWipe& confirmRespecWipe);
void HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& packet);
void HandleTradeSkillSetFavorite(WorldPackets::Spells::TradeSkillSetFavorite const& tradeSkillSetFavorite);