aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorJeremy <Golrag@users.noreply.github.com>2018-03-04 22:32:08 +0100
committerShauren <shauren.trinity@gmail.com>2018-03-04 22:32:08 +0100
commitf411b7a90e4900c9e2df7c1e0c7a301360408cec (patch)
tree9793744cf0749d37bb13d6d69355b8672e5f6c34 /src/server/game/Server
parente0eafc1cac9d840f897f9269e8440aaebfab6a96 (diff)
Core/Player: Implement PvP Talents (#19962)
* SPELL_AURA_119 -> SPELL_AURA_PVP_TALENTS * Learn Honorable Medallion when pvp rules are enabled
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/TalentPackets.cpp18
-rw-r--r--src/server/game/Server/Packets/TalentPackets.h22
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h2
4 files changed, 45 insertions, 3 deletions
diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp
index 9c90a12ca3e..c5cbb0769a5 100644
--- a/src/server/game/Server/Packets/TalentPackets.cpp
+++ b/src/server/game/Server/Packets/TalentPackets.cpp
@@ -89,3 +89,21 @@ WorldPacket const* WorldPackets::Talent::ActiveGlyphs::Write()
return &_worldPacket;
}
+
+void WorldPackets::Talent::LearnPvpTalents::Read()
+{
+ Talents.resize(_worldPacket.ReadBits(6));
+ for (uint32 i = 0; i < Talents.size(); ++i)
+ _worldPacket >> Talents[i];
+}
+
+WorldPacket const* WorldPackets::Talent::LearnPvpTalentsFailed::Write()
+{
+ _worldPacket.WriteBits(Reason, 4);
+ _worldPacket << int32(SpellID);
+ _worldPacket << uint32(Talents.size());
+ if (!Talents.empty())
+ _worldPacket.append(Talents.data(), Talents.size());
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h
index a61a4d78d89..920f724095e 100644
--- a/src/server/game/Server/Packets/TalentPackets.h
+++ b/src/server/game/Server/Packets/TalentPackets.h
@@ -113,6 +113,28 @@ namespace WorldPackets
std::vector<GlyphBinding> Glyphs;
bool IsFullUpdate = false;
};
+
+ class LearnPvpTalents final : public ClientPacket
+ {
+ public:
+ LearnPvpTalents(WorldPacket&& packet) : ClientPacket(CMSG_LEARN_PVP_TALENTS, std::move(packet)) { }
+
+ void Read() override;
+
+ Array<uint16, 6> Talents;
+ };
+
+ class LearnPvpTalentsFailed final : public ServerPacket
+ {
+ public:
+ LearnPvpTalentsFailed() : ServerPacket(SMSG_LEARN_PVP_TALENTS_FAILED, 1 + 4 + 4 + 2 * MAX_PVP_TALENT_TIERS) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 Reason = 0;
+ int32 SpellID = 0;
+ std::vector<uint16> Talents;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 28bd8c80701..19b24370285 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -478,7 +478,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_JOIN_RATED_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess);
DEFINE_HANDLER(CMSG_KEYBOUND_OVERRIDE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_LEARN_PVP_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_LEARN_PVP_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnPvpTalentsOpcode);
DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentsOpcode);
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);
@@ -1316,8 +1316,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_PVP_TALENTS_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_TALENTS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_PVP_TALENTS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_TALENTS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVEL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVEL_UP_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 8d8f00483c7..9de54534f0e 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -665,6 +665,7 @@ namespace WorldPackets
namespace Talent
{
class LearnTalents;
+ class LearnPvpTalents;
class ConfirmRespecWipe;
}
@@ -1426,6 +1427,7 @@ class TC_GAME_API WorldSession
void HandleMissileTrajectoryCollision(WorldPackets::Spells::MissileTrajectoryCollision& packet);
void HandleUpdateMissileTrajectory(WorldPackets::Spells::UpdateMissileTrajectory& packet);
+ void HandleLearnPvpTalentsOpcode(WorldPackets::Talent::LearnPvpTalents& packet);
void HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet);
void HandleConfirmRespecWipeOpcode(WorldPackets::Talent::ConfirmRespecWipe& confirmRespecWipe);
void HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& packet);