aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp57
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp5
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h10
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h3
5 files changed, 57 insertions, 20 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 335bb9ce48c..620138ac4e9 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -760,18 +760,27 @@ void WorldSession::SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid I
SendPacket(&data);
}
-void WorldSession::HandleWrapItemOpcode(WorldPacket& recvData)
+void WorldSession::HandleWrapItem(WorldPackets::Item::WrapItem& packet)
{
TC_LOG_DEBUG("network", "Received opcode CMSG_WRAP_ITEM");
- uint8 gift_bag, gift_slot, item_bag, item_slot;
+ if (packet.Inv.Items.size() != 2)
+ {
+ TC_LOG_ERROR("network", "HandleWrapItem - Invalid itemCount (" SZFMTD ")", packet.Inv.Items.size());
+ return;
+ }
- recvData >> gift_bag >> gift_slot; // paper
- recvData >> item_bag >> item_slot; // item
+ /// @todo: 6.x find better way for read
+ // Gift
+ uint8 giftContainerSlot = packet.Inv.Items[0].ContainerSlot;
+ uint8 giftSlot = packet.Inv.Items[0].Slot;
+ // Item
+ uint8 itemContainerSlot = packet.Inv.Items[1].ContainerSlot;
+ uint8 itemSlot = packet.Inv.Items[1].Slot;
- TC_LOG_DEBUG("network", "WRAP: receive gift_bag = %u, gift_slot = %u, item_bag = %u, item_slot = %u", gift_bag, gift_slot, item_bag, item_slot);
+ TC_LOG_DEBUG("network", "HandleWrapItem - Receive giftContainerSlot = %u, giftSlot = %u, itemContainerSlot = %u, itemSlot = %u", giftContainerSlot, giftSlot, itemContainerSlot, itemSlot);
- Item* gift = _player->GetItemByPos(gift_bag, gift_slot);
+ Item* gift = _player->GetItemByPos(giftContainerSlot, giftSlot);
if (!gift)
{
_player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, gift, NULL);
@@ -784,15 +793,14 @@ void WorldSession::HandleWrapItemOpcode(WorldPacket& recvData)
return;
}
- Item* item = _player->GetItemByPos(item_bag, item_slot);
-
+ Item* item = _player->GetItemByPos(itemContainerSlot, itemSlot);
if (!item)
{
_player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, item, NULL);
return;
}
- if (item == gift) // not possable with pacjket from real client
+ if (item == gift) // not possable with pacjket from real client
{
_player->SendEquipError(EQUIP_ERR_CANT_WRAP_WRAPPED, item, NULL);
return;
@@ -804,7 +812,7 @@ void WorldSession::HandleWrapItemOpcode(WorldPacket& recvData)
return;
}
- if (!item->GetGuidValue(ITEM_FIELD_GIFTCREATOR).IsEmpty()) // HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED);
+ if (!item->GetGuidValue(ITEM_FIELD_GIFTCREATOR).IsEmpty()) // HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED);
{
_player->SendEquipError(EQUIP_ERR_CANT_WRAP_WRAPPED, item, NULL);
return;
@@ -848,22 +856,35 @@ void WorldSession::HandleWrapItemOpcode(WorldPacket& recvData)
switch (item->GetEntry())
{
- case 5042: item->SetEntry(5043); break;
- case 5048: item->SetEntry(5044); break;
- case 17303: item->SetEntry(17302); break;
- case 17304: item->SetEntry(17305); break;
- case 17307: item->SetEntry(17308); break;
- case 21830: item->SetEntry(21831); break;
+ case 5042:
+ item->SetEntry(5043);
+ break;
+ case 5048:
+ item->SetEntry(5044);
+ break;
+ case 17303:
+ item->SetEntry(17302);
+ break;
+ case 17304:
+ item->SetEntry(17305);
+ break;
+ case 17307:
+ item->SetEntry(17308);
+ break;
+ case 21830:
+ item->SetEntry(21831);
+ break;
}
+
item->SetGuidValue(ITEM_FIELD_GIFTCREATOR, _player->GetGUID());
item->SetUInt32Value(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED);
item->SetState(ITEM_CHANGED, _player);
- if (item->GetState() == ITEM_NEW) // save new item, to have alway for `character_gifts` record in `item_instance`
+ if (item->GetState() == ITEM_NEW) // save new item, to have alway for `character_gifts` record in `item_instance`
{
// after save it will be impossible to remove the item from the queue
item->RemoveFromUpdateQueueOf(_player);
- item->SaveToDB(trans); // item gave inventory record unchanged and can be save standalone
+ item->SaveToDB(trans); // item gave inventory record unchanged and can be save standalone
}
CharacterDatabase.CommitTransaction(trans);
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index 958a6c9c33a..c7ff92f6cad 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -357,3 +357,8 @@ WorldPacket const* WorldPackets::Item::ReadItemResultOK::Write()
return &_worldPacket;
}
+
+void WorldPackets::Item::WrapItem::Read()
+{
+ _worldPacket >> Inv;
+}
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index f9c700b0cb4..d37df357513 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -343,6 +343,16 @@ namespace WorldPackets
ObjectGuid Item;
};
+ class WrapItem final : public ClientPacket
+ {
+ public:
+ WrapItem(WorldPacket&& packet) : ClientPacket(CMSG_WRAP_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ InvUpdate Inv;
+ };
+
ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate);
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 2c3425a57f3..2b5f8c6503d 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -827,7 +827,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_WHO_IS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoIsRequest, &WorldSession::HandleWhoIsOpcode);
DEFINE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortResponse, &WorldSession::HandleMoveWorldportAckOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_WRAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItemOpcode );
+ DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::WrapItem, &WorldSession::HandleWrapItem);
#undef DEFINE_OPCODE_HANDLER_OLD
#undef DEFINE_HANDLER
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 8fbdf41e55a..873a926aa82 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -276,6 +276,7 @@ namespace WorldPackets
class SplitItem;
class SwapInvItem;
class SwapItem;
+ class WrapItem;
}
namespace Loot
@@ -1185,7 +1186,7 @@ class WorldSession
void HandleAutoEquipItemSlotOpcode(WorldPackets::Item::AutoEquipItemSlot& autoEquipItemSlot);
void HandleSwapItem(WorldPackets::Item::SwapItem& swapItem);
void HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet);
- void HandleWrapItemOpcode(WorldPacket& recvPacket);
+ void HandleWrapItem(WorldPackets::Item::WrapItem& packet);
void HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet);
void HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& packet);