diff options
| author | Shauren <shauren.trinity@gmail.com> | 2019-11-22 11:02:04 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-11-22 11:02:04 +0100 |
| commit | ec9d624aec9e0a39b1bcee7d4077f46be358faad (patch) | |
| tree | e5aceec6e06d537fb1966f0ccab913f8558b3b8e /src/server/game/Server | |
| parent | 2a46798362c7e39544886e406a619360096298a1 (diff) | |
Core/Items: Implement azerite essences
* Implement inspecting heart of azeroth data
* Fixed heart of azeroth item level - bonuses now apply
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/AzeritePackets.cpp | 31 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/AzeritePackets.h | 54 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/InspectPackets.cpp | 23 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 10 |
5 files changed, 123 insertions, 5 deletions
diff --git a/src/server/game/Server/Packets/AzeritePackets.cpp b/src/server/game/Server/Packets/AzeritePackets.cpp index 97e8bcc81ff..9f300d2d72d 100644 --- a/src/server/game/Server/Packets/AzeritePackets.cpp +++ b/src/server/game/Server/Packets/AzeritePackets.cpp @@ -16,6 +16,7 @@ */ #include "AzeritePackets.h" +#include "Util.h" WorldPacket const* WorldPackets::Azerite::AzeriteXpGain::Write() { @@ -24,3 +25,33 @@ WorldPacket const* WorldPackets::Azerite::AzeriteXpGain::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Azerite::AzeriteEssenceForgeOpened::Write() +{ + _worldPacket << ForgeGUID; + + return &_worldPacket; +} + +void WorldPackets::Azerite::AzeriteEssenceUnlockMilestone::Read() +{ + _worldPacket >> AzeriteItemMilestonePowerID; +} + +void WorldPackets::Azerite::AzeriteEssenceActivateEssence::Read() +{ + _worldPacket >> AzeriteEssenceID; + _worldPacket >> Slot; +} + +WorldPacket const* WorldPackets::Azerite::AzeriteEssenceSelectionResult::Write() +{ + _worldPacket.WriteBits(AsUnderlyingType(Reason), 4); + _worldPacket.WriteBit(Slot.is_initialized()); + _worldPacket << int32(Arg); + _worldPacket << int32(AzeriteEssenceID); + if (Slot) + _worldPacket << uint8(*Slot); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/AzeritePackets.h b/src/server/game/Server/Packets/AzeritePackets.h index 31ca4cdb13a..fea3a799db6 100644 --- a/src/server/game/Server/Packets/AzeritePackets.h +++ b/src/server/game/Server/Packets/AzeritePackets.h @@ -19,7 +19,9 @@ #define AzeriteItemPackets_h__ #include "Packet.h" +#include "ItemDefines.h" #include "ObjectGuid.h" +#include "Optional.h" namespace WorldPackets { @@ -35,6 +37,58 @@ namespace WorldPackets ObjectGuid ItemGUID; uint64 XP = 0; }; + + class AzeriteEssenceForgeOpened final : public ServerPacket + { + public: + AzeriteEssenceForgeOpened() : ServerPacket(SMSG_AZERITE_ESSENCE_FORGE_OPENED, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid ForgeGUID; + }; + + class AzeriteEssenceForgeClose final : public ServerPacket + { + public: + AzeriteEssenceForgeClose() : ServerPacket(SMSG_AZERITE_ESSENCE_FORGE_CLOSE, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + + class AzeriteEssenceUnlockMilestone final : public ClientPacket + { + public: + AzeriteEssenceUnlockMilestone(WorldPacket&& packet) : ClientPacket(CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE, std::move(packet)) { } + + void Read() override; + + int32 AzeriteItemMilestonePowerID = 0; + }; + + class AzeriteEssenceActivateEssence final : public ClientPacket + { + public: + AzeriteEssenceActivateEssence(WorldPacket&& packet) : ClientPacket(CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE, std::move(packet)) { } + + void Read() override; + + int32 AzeriteEssenceID = 0; + uint8 Slot = 0; + }; + + class AzeriteEssenceSelectionResult final : public ServerPacket + { + public: + AzeriteEssenceSelectionResult() : ServerPacket(SMSG_AZERITE_ESSENCE_SELECTION_RESULT, 0) { } + + WorldPacket const* Write() override; + + AzeriteEssenceActivateResult Reason = AzeriteEssenceActivateResult::None; + int32 Arg = 0; + int32 AzeriteEssenceID = 0; + Optional<uint8> Slot; + }; } } diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index 9442a6e0b73..cd5cc89db01 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -16,6 +16,7 @@ */ #include "InspectPackets.h" +#include "AzeriteItem.h" #include "Item.h" #include "Player.h" @@ -166,6 +167,28 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint } ++i; } + + if (AzeriteItem const* azeriteItem = item->ToAzeriteItem()) + { + if (UF::SelectedAzeriteEssences const* essences = azeriteItem->GetSelectedAzeriteEssences()) + { + for (uint8 slot = 0; slot < essences->AzeriteEssenceID.size(); ++slot) + { + AzeriteEssences.emplace_back(); + + WorldPackets::Inspect::AzeriteEssenceData& essence = AzeriteEssences.back(); + essence.Index = slot; + essence.AzeriteEssenceID = essences->AzeriteEssenceID[slot]; + if (essence.AzeriteEssenceID) + { + essence.Rank = azeriteItem->GetEssenceRank(essence.AzeriteEssenceID); + essence.SlotUnlocked = true; + } + else + essence.SlotUnlocked = azeriteItem->HasUnlockedEssenceSlot(slot); + } + } + } } WorldPacket const* WorldPackets::Inspect::InspectResult::Write() diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b26656010ca..d7a6c6f7f94 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -184,8 +184,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_AUTO_STORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBagItemOpcode); DEFINE_HANDLER(CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_AZERITE_EMPOWERED_ITEM_VIEWED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAzeriteEssenceActivateEssence); + DEFINE_HANDLER(CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAzeriteEssenceUnlockMilestone); DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBankerActivateOpcode); DEFINE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldLeaveOpcode); DEFINE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldListOpcode); @@ -949,9 +949,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_HOTFIXES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_EMPOWERED_ITEM_EQUIPPED_STATUS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_EMPOWERED_ITEM_RESPEC_OPEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_FORGE_CLOSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_FORGE_OPENED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_SELECTION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_FORGE_CLOSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_FORGE_OPENED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_ESSENCE_SELECTION_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_XP_GAIN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BAN_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 51160bddb3f..808359495b6 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -109,6 +109,12 @@ namespace WorldPackets enum class ConnectToSerial : uint32; } + namespace Azerite + { + class AzeriteEssenceUnlockMilestone; + class AzeriteEssenceActivateEssence; + } + namespace Bank { class AutoBankItem; @@ -1718,6 +1724,10 @@ class TC_GAME_API WorldSession // Scenario void HandleQueryScenarioPOI(WorldPackets::Scenario::QueryScenarioPOI& queryScenarioPOI); + // Azerite + void HandleAzeriteEssenceUnlockMilestone(WorldPackets::Azerite::AzeriteEssenceUnlockMilestone& azeriteEssenceUnlockMilestone); + void HandleAzeriteEssenceActivateEssence(WorldPackets::Azerite::AzeriteEssenceActivateEssence& azeriteEssenceActivateEssence); + union ConnectToKey { struct |
