diff options
author | Rat <gmstreetrat@gmail.com> | 2014-12-20 22:29:06 +0100 |
---|---|---|
committer | Rat <gmstreetrat@gmail.com> | 2014-12-20 22:29:06 +0100 |
commit | 92aafbf111ffad1645bc03afa58746a2d6d5bd9b (patch) | |
tree | d74a54ea4163db43fde2c803da056d2734f67051 /src/server/game/Handlers/ItemHandler.cpp | |
parent | b3a5f466d5910b1d1c563308bd99e368d28d4044 (diff) |
Core/Items: fixed inventory item moving/splitting
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index cb8662fee80..976a3d4bd55 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -34,12 +34,19 @@ void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData) { + uint32 itemCount = recvData.ReadBits(2); + + if (itemCount) + { + TC_LOG_ERROR("network", "WORLD: HandleSplitItemOpcode - Invalid itemCount (%u)", itemCount); + return; + } //TC_LOG_DEBUG("network", "WORLD: CMSG_SPLIT_ITEM"); uint8 srcbag, srcslot, dstbag, dstslot; uint32 count; recvData >> srcbag >> srcslot >> dstbag >> dstslot >> count; - //TC_LOG_DEBUG("STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u, count = %u", srcbag, srcslot, dstbag, dstslot, count); + TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u, count = %u", srcbag, srcslot, dstbag, dstslot, count); uint16 src = ((srcbag << 8) | srcslot); uint16 dst = ((dstbag << 8) | dstslot); @@ -67,11 +74,25 @@ void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData) void WorldSession::HandleSwapInvItemOpcode(WorldPacket& recvData) { + uint32 itemCount = recvData.ReadBits(2); + + if (itemCount != 2) + { + TC_LOG_ERROR("network", "WORLD: HandleSwapInvItemOpcode - Invalid itemCount (%u)", itemCount); + return; + } + + for (uint32 i = 0; i < itemCount; ++i) + { + recvData.read_skip<uint8>(); // bag + recvData.read_skip<uint8>(); // slot + } + //TC_LOG_DEBUG("network", "WORLD: CMSG_SWAP_INV_ITEM"); uint8 srcslot, dstslot; recvData >> dstslot >> srcslot; - //TC_LOG_DEBUG("STORAGE: receive srcslot = %u, dstslot = %u", srcslot, dstslot); + TC_LOG_DEBUG("network", "STORAGE: receive srcslot = %u, dstslot = %u", srcslot, dstslot); // prevent attempt swap same item to current position generated by client at special checting sequence if (srcslot == dstslot) @@ -135,10 +156,17 @@ void WorldSession::HandleSwapItem(WorldPacket& recvData) TC_LOG_ERROR("network", "WORLD: HandleSwapItem - Invalid itemCount (%u)", itemCount); return; } + + for (uint32 i = 0; i < itemCount; ++i) + { + recvData.read_skip<uint8>(); + recvData.read_skip<uint8>(); + } + //TC_LOG_DEBUG("network", "WORLD: CMSG_SWAP_ITEM"); - uint8 dstbag, dstslot, srcbag, srcslot, slotA, slotB; + uint8 dstbag, dstslot, srcbag, srcslot; - recvData >> dstbag >> dstslot >> srcbag >> srcslot >> slotA >> slotB; + recvData >> dstbag >> srcbag >> dstslot >> srcslot; TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u", srcbag, srcslot, dstbag, dstslot); uint16 src = ((srcbag << 8) | srcslot); @@ -701,11 +729,25 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) void WorldSession::HandleAutoStoreBagItemOpcode(WorldPacket& recvData) { + uint32 itemCount = recvData.ReadBits(2); + + if (itemCount) + { + TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBagItemOpcode - Invalid itemCount (%u)", itemCount); + return; + } + + /*for (uint32 i = 0; i < itemCount; ++i) + { + recvData.read_skip<uint8>(); + recvData.read_skip<uint8>(); + }*/ + //TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOSTORE_BAG_ITEM"); uint8 srcbag, srcslot, dstbag; - recvData >> srcbag >> srcslot >> dstbag; - //TC_LOG_DEBUG("STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u", srcbag, srcslot, dstbag); + recvData >> srcbag >> dstbag >> srcslot; + TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u", srcbag, srcslot, dstbag); Item* pItem = _player->GetItemByPos(srcbag, srcslot); if (!pItem) |