diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 42 | ||||
-rw-r--r-- | src/server/game/Server/Packets/EquipmentSetPackets.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Server/Packets/EquipmentSetPackets.h | 29 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
5 files changed, 70 insertions, 27 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 42bdd6ec736..cd1497145ef 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1638,33 +1638,28 @@ void WorldSession::HandleDeleteEquipmentSet(WorldPackets::EquipmentSet::DeleteEq _player->DeleteEquipmentSet(packet.ID); } -void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData) +void WorldSession::HandleUseEquipmentSet(WorldPackets::EquipmentSet::UseEquipmentSet& packet) { - TC_LOG_DEBUG("network", "CMSG_EQUIPMENT_SET_USE"); + TC_LOG_DEBUG("network", "CMSG_USE_EQUIPMENT_SET"); ObjectGuid ignoredItemGuid; ignoredItemGuid.SetRawValue(0, 1); - for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) - { - ObjectGuid itemGuid; - recvData >> itemGuid.ReadAsPacked(); - - uint8 srcbag, srcslot; - recvData >> srcbag >> srcslot; - TC_LOG_DEBUG("entities.player.items", "%s: srcbag %u, srcslot %u", itemGuid.ToString().c_str(), srcbag, srcslot); + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + { + TC_LOG_DEBUG("entities.player.items", "%s: ContainerSlot: %u, Slot: %u", packet.Items[i].Item.ToString().c_str(), packet.Items[i].ContainerSlot, packet.Items[i].Slot); // check if item slot is set to "ignored" (raw value == 1), must not be unequipped then - if (itemGuid == ignoredItemGuid) + if (packet.Items[i].Item == ignoredItemGuid) continue; // Only equip weapons in combat if (_player->IsInCombat() && i != EQUIPMENT_SLOT_MAINHAND && i != EQUIPMENT_SLOT_OFFHAND && i != EQUIPMENT_SLOT_RANGED) continue; - Item* item = _player->GetItemByGuid(itemGuid); + Item* item = _player->GetItemByGuid(packet.Items[i].Item); - uint16 dstpos = i | (INVENTORY_SLOT_BAG_0 << 8); + uint16 dstPos = i | (INVENTORY_SLOT_BAG_0 << 8); if (!item) { @@ -1672,28 +1667,27 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData) if (!uItem) continue; - ItemPosCountVec sDest; - InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sDest, uItem, false); - if (msg == EQUIP_ERR_OK) + ItemPosCountVec itemPosCountVec; + InventoryResult inventoryResult = _player->CanStoreItem(NULL_BAG, NULL_SLOT, itemPosCountVec, uItem, false); + if (inventoryResult == EQUIP_ERR_OK) { _player->RemoveItem(INVENTORY_SLOT_BAG_0, i, true); - _player->StoreItem(sDest, uItem, true); + _player->StoreItem(itemPosCountVec, uItem, true); } else - _player->SendEquipError(msg, uItem, NULL); - + _player->SendEquipError(inventoryResult, uItem, NULL); continue; } - if (item->GetPos() == dstpos) + if (item->GetPos() == dstPos) continue; - _player->SwapItem(item->GetPos(), dstpos); + _player->SwapItem(item->GetPos(), dstPos); } - WorldPacket data(SMSG_USE_EQUIPMENT_SET_RESULT, 1); - data << uint8(0); // 4 - equipment swap failed - inventory is full - SendPacket(&data); + WorldPackets::EquipmentSet::UseEquipmentSetResult result; + result.Reason = 0; // 4 - equipment swap failed - inventory is full + SendPacket(result.Write()); } void WorldSession::HandleCharRaceOrFactionChangeOpcode(WorldPackets::Character::CharRaceOrFactionChange& packet) diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.cpp b/src/server/game/Server/Packets/EquipmentSetPackets.cpp index 1e13ca65fb1..0dc948f5170 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.cpp +++ b/src/server/game/Server/Packets/EquipmentSetPackets.cpp @@ -68,3 +68,22 @@ void WorldPackets::EquipmentSet::DeleteEquipmentSet::Read() { _worldPacket >> ID; } + +void WorldPackets::EquipmentSet::UseEquipmentSet::Read() +{ + _worldPacket >> Inv; + + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + { + _worldPacket >> Items[i].Item; + _worldPacket >> Items[i].ContainerSlot; + _worldPacket >> Items[i].Slot; + } +} + +WorldPacket const* WorldPackets::EquipmentSet::UseEquipmentSetResult::Write() +{ + _worldPacket << uint8(Reason); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.h b/src/server/game/Server/Packets/EquipmentSetPackets.h index 97cfa836cf9..a26eee383ae 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.h +++ b/src/server/game/Server/Packets/EquipmentSetPackets.h @@ -19,6 +19,7 @@ #include "Packet.h" #include "Player.h" +#include "ItemPackets.h" namespace WorldPackets { @@ -64,5 +65,33 @@ namespace WorldPackets uint64 ID; }; + + class UseEquipmentSet final : public ClientPacket + { + public: + UseEquipmentSet(WorldPacket&& packet) : ClientPacket(CMSG_USE_EQUIPMENT_SET, std::move(packet)) { } + + void Read() override; + + struct EquipmentSetItem + { + ObjectGuid Item; + uint8 ContainerSlot = 0; + uint8 Slot = 0; + }; + + WorldPackets::Item::InvUpdate Inv; + EquipmentSetItem Items[EQUIPMENT_SLOT_END]; + }; + + class UseEquipmentSetResult final : public ServerPacket + { + public: + UseEquipmentSetResult() : ServerPacket(SMSG_USE_EQUIPMENT_SET_RESULT, 1) { } + + WorldPacket const* Write() override; + + uint8 Reason = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 393e8afd711..cfe33b986f5 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -813,7 +813,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_UPGRADE_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_CRITTER_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_EQUIPMENT_SET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetUse ); + DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::UseEquipmentSet, &WorldSession::HandleUseEquipmentSet); DEFINE_HANDLER(CMSG_USE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UseItem, &WorldSession::HandleUseItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel); @@ -1718,7 +1718,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_USE_EQUIPMENT_SET_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_USE_EQUIPMENT_SET_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VENDOR_INVENTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VIGNETTE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_CHAT_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 513f5f47f9e..c31b913b68d 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -193,6 +193,7 @@ namespace WorldPackets { class SaveEquipmentSet; class DeleteEquipmentSet; + class UseEquipmentSet; } namespace GameObject @@ -1407,7 +1408,7 @@ class WorldSession void HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement); void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet); void HandleDeleteEquipmentSet(WorldPackets::EquipmentSet::DeleteEquipmentSet& packet); - void HandleEquipmentSetUse(WorldPacket& recvData); + void HandleUseEquipmentSet(WorldPackets::EquipmentSet::UseEquipmentSet& packet); void HandleUITimeRequest(WorldPackets::Misc::UITimeRequest& /*request*/); void HandleQueryQuestCompletionNPCs(WorldPackets::Query::QueryQuestCompletionNPCs& queryQuestCompletionNPCs); void HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& packet); |