aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2015-04-12 03:55:32 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2015-04-12 03:55:32 +0200
commit69b82c5e33e1e82dadabfa26c8dd708d39b28dea (patch)
tree213a0372ca796c5ee2ac6692de0a1bdfa4b15e62
parentfcab9149817e0aef324ae5d07c25c40301a11941 (diff)
Core/PacketIO: Updated and Enabled CMSG_USE_EQUIPMENT_SET / SMSG_USE_EQUIPMENT_SET_RESULT for 6.1.2
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp42
-rw-r--r--src/server/game/Server/Packets/EquipmentSetPackets.cpp19
-rw-r--r--src/server/game/Server/Packets/EquipmentSetPackets.h29
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h3
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);