aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp9
-rw-r--r--src/server/game/Entities/Player/Player.h8
-rw-r--r--src/server/game/Handlers/SkillHandler.cpp16
-rw-r--r--src/server/game/Server/Packets/TalentPackets.cpp16
-rw-r--r--src/server/game/Server/Packets/TalentPackets.h23
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h3
7 files changed, 64 insertions, 15 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index a26c1f3c841..82c5bb27e5c 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -9045,10 +9045,11 @@ void Player::SetBindPoint(ObjectGuid guid) const
void Player::SendRespecWipeConfirm(ObjectGuid const& guid, uint32 cost) const
{
- WorldPacket data(SMSG_RESPEC_WIPE_CONFIRM, 8 + 4);
- data << guid;
- data << cost;
- GetSession()->SendPacket(&data);
+ WorldPackets::Talent::RespecWipeConfirm respecWipeConfirm;
+ respecWipeConfirm.RespecMaster = guid;
+ respecWipeConfirm.Cost = cost;
+ respecWipeConfirm.RespecType = SPEC_RESET_TALENTS;
+ GetSession()->SendPacket(respecWipeConfirm.Write());
}
void Player::ResetPetTalents()
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 6b235a3d0e0..d6fcd7a3cee 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -155,6 +155,14 @@ enum TalentSpecialization // talent tabs
TALENT_SPEC_MONK_MISTWEAVER = 270
};
+enum SpecResetType
+{
+ SPEC_RESET_TALENTS = 0,
+ SPEC_RESET_SPECIALIZATION = 1,
+ SPEC_RESET_GLYPHS = 2,
+ SPEC_RESET_PET_TALENTS = 3
+};
+
// Spell modifier (used for modify other spells)
struct SpellModifier
{
diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp
index 59ffde0d6b4..2060468a41a 100644
--- a/src/server/game/Handlers/SkillHandler.cpp
+++ b/src/server/game/Handlers/SkillHandler.cpp
@@ -37,16 +37,18 @@ void WorldSession::HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents&
_player->SendTalentsInfoData();
}
-void WorldSession::HandleConfirmRespecWipeOpcode(WorldPacket& recvData)
+void WorldSession::HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRespecWipe& confirmRespecWipe)
{
- TC_LOG_DEBUG("network", "MSG_TALENT_WIPE_CONFIRM");
- ObjectGuid guid;
- recvData >> guid;
-
- Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_TRAINER);
+ Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(confirmRespecWipe.RespecMaster, UNIT_NPC_FLAG_TRAINER);
if (!unit)
{
- TC_LOG_DEBUG("network", "WORLD: HandleConfirmRespecWipeOpcode - %s not found or you can't interact with him.", guid.ToString().c_str());
+ TC_LOG_DEBUG("network", "WORLD: HandleConfirmRespecWipeOpcode - %s not found or you can't interact with him.", confirmRespecWipe.RespecMaster.ToString().c_str());
+ return;
+ }
+
+ if (confirmRespecWipe.RespecType != SPEC_RESET_TALENTS)
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleConfirmRespecWipeOpcode - reset type %d is not implemented.", confirmRespecWipe.RespecType);
return;
}
diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp
index 932392e0cb4..7dc2daaa706 100644
--- a/src/server/game/Server/Packets/TalentPackets.cpp
+++ b/src/server/game/Server/Packets/TalentPackets.cpp
@@ -54,4 +54,18 @@ void WorldPackets::Talent::LearnTalents::Read()
_worldPacket >> talent;
Talents.push_back(talent);
}
-} \ No newline at end of file
+}
+
+WorldPacket const* WorldPackets::Talent::RespecWipeConfirm::Write()
+{
+ _worldPacket << int8(RespecType);
+ _worldPacket << uint32(Cost);
+ _worldPacket << RespecMaster;
+ return &_worldPacket;
+}
+
+void WorldPackets::Talent::ConfirmRespecWipe::Read()
+{
+ _worldPacket >> RespecMaster;
+ _worldPacket >> RespecType;
+}
diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h
index 47519ba4e3b..ca6b0217a28 100644
--- a/src/server/game/Server/Packets/TalentPackets.h
+++ b/src/server/game/Server/Packets/TalentPackets.h
@@ -68,8 +68,31 @@ namespace WorldPackets
void Read() override;
std::vector<uint16> Talents;
+ };
+
+ class RespecWipeConfirm final : public ServerPacket
+ {
+ public:
+ RespecWipeConfirm() : ServerPacket(SMSG_RESPEC_WIPE_CONFIRM, 16 + 4 +1) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid RespecMaster;
+ uint32 Cost = 0;
+ int8 RespecType = 0;
+ };
+
+ class ConfirmRespecWipe final : public ClientPacket
+ {
+ public:
+ ConfirmRespecWipe(WorldPacket&& packet) : ClientPacket(CMSG_CONFIRM_RESPEC_WIPE, std::move(packet)) { }
+ void Read() override;
+
+ ObjectGuid RespecMaster;
+ uint8 RespecType = 0;
};
+
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index e006a352c4b..a40564aa1f2 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -294,7 +294,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_COMPLAINT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleComplainOpcode );
DEFINE_HANDLER(CMSG_COMPLETE_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::CompleteCinematic, &WorldSession::HandleCompleteCinematic);
DEFINE_HANDLER(CMSG_COMPLETE_MOVIE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CONFIRM_RESPEC_WIPE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleConfirmRespecWipeOpcode );
+ DEFINE_HANDLER(CMSG_CONFIRM_RESPEC_WIPE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::ConfirmRespecWipe, &WorldSession::HandleConfirmRespecWipeOpcode);
DEFINE_HANDLER(CMSG_CONNECT_TO_FAILED, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess);
DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ConvertRaid, &WorldSession::HandleConvertRaidOpcode);
DEFINE_HANDLER(CMSG_CREATE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CreateCharacter, &WorldSession::HandleCharCreateOpcode);
@@ -1527,7 +1527,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_RANGED_COMBAT_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_WEEKLY_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPEC_WIPE_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPEC_WIPE_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_CAST_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_COMMS, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index dc4f3b32417..529aa3a56d2 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -582,6 +582,7 @@ namespace WorldPackets
{
class SetSpecialization;
class LearnTalents;
+ class ConfirmRespecWipe;
}
namespace Taxi
@@ -1369,7 +1370,7 @@ class WorldSession
void HandleCancelAutoRepeatSpellOpcode(WorldPackets::Spells::CancelAutoRepeatSpell& cancelAutoRepeatSpell);
void HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet);
- void HandleConfirmRespecWipeOpcode(WorldPacket& recvPacket);
+ void HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRespecWipe& confirmRespecWipe);
void HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& packet);
void HandleSetSpecializationOpcode(WorldPackets::Talent::SetSpecialization& packet);