diff options
| author | Rat <gmstreetrat@gmail.com> | 2014-12-21 19:11:39 +0100 |
|---|---|---|
| committer | Rat <gmstreetrat@gmail.com> | 2014-12-21 19:11:39 +0100 |
| commit | 83f168353af03310651e049504553c4cb9251da2 (patch) | |
| tree | 0d56b822d2f195de31e2e2d1ec23f8cf17f36b2b /src/server/game/Handlers/ItemHandler.cpp | |
| parent | d149e370f796e9729b775876a01822bc1562a7d2 (diff) | |
Core/Items: remade inventory packets to new packet system
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 139 |
1 files changed, 54 insertions, 85 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index b892cb67e29..229d724974e 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -32,98 +32,84 @@ #include "ItemPackets.h" #include <vector> -void WorldSession::HandleSplitItemOpcode(WorldPacket& recvData) +void WorldSession::HandleSplitItemOpcode(WorldPackets::Item::SplitItem& splitItem) { - uint32 itemCount = recvData.ReadBits(2); - - if (itemCount) + if (splitItem.itemCount) { - TC_LOG_ERROR("network", "WORLD: HandleSplitItemOpcode - Invalid itemCount (%u)", itemCount); + TC_LOG_ERROR("network", "WORLD: HandleSplitItemOpcode - Invalid itemCount (%u)", splitItem.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("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u, count = %u", srcbag, srcslot, dstbag, dstslot, count); + //TC_LOG_DEBUG("network", "WORLD: CMSG_SPLIT_ITEM"); + + TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u, count = %u", splitItem.srcbag, splitItem.srcslot, splitItem.dstbag, splitItem.dstslot, splitItem.count); - uint16 src = ((srcbag << 8) | srcslot); - uint16 dst = ((dstbag << 8) | dstslot); + uint16 src = ((splitItem.srcbag << 8) | splitItem.srcslot); + uint16 dst = ((splitItem.dstbag << 8) | splitItem.dstslot); if (src == dst) return; - if (count == 0) + if (splitItem.count == 0) return; //check count - if zero it's fake packet - if (!_player->IsValidPos(srcbag, srcslot, true)) + if (!_player->IsValidPos(splitItem.srcbag, splitItem.srcslot, true)) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); return; } - if (!_player->IsValidPos(dstbag, dstslot, false)) // can be autostore pos + if (!_player->IsValidPos(splitItem.dstbag, splitItem.dstslot, false)) // can be autostore pos { _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); return; } - _player->SplitItem(src, dst, count); + _player->SplitItem(src, dst, splitItem.count); } -void WorldSession::HandleSwapInvItemOpcode(WorldPacket& recvData) +void WorldSession::HandleSwapInvItemOpcode(WorldPackets::Item::SwapInvItem& swapInvItem) { - uint32 itemCount = recvData.ReadBits(2); - - if (itemCount != 2) + if (swapInvItem.itemCount != 2) { - TC_LOG_ERROR("network", "WORLD: HandleSwapInvItemOpcode - Invalid itemCount (%u)", itemCount); + TC_LOG_ERROR("network", "WORLD: HandleSwapInvItemOpcode - Invalid itemCount (%u)", swapInvItem.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("network", "STORAGE: receive srcslot = %u, dstslot = %u", srcslot, dstslot); + + TC_LOG_DEBUG("network", "STORAGE: receive srcslot = %u, dstslot = %u", swapInvItem.srcslot, swapInvItem.dstslot); // prevent attempt swap same item to current position generated by client at special checting sequence - if (srcslot == dstslot) + if (swapInvItem.srcslot == swapInvItem.dstslot) return; - if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, srcslot, true)) + if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.srcslot, true)) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); return; } - if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, dstslot, true)) + if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.dstslot, true)) { _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); return; } - if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, srcslot) && !CanUseBank()) + if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.srcslot) && !CanUseBank()) { TC_LOG_DEBUG("network", "WORLD: HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } - if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, dstslot) && !CanUseBank()) + if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.dstslot) && !CanUseBank()) { TC_LOG_DEBUG("network", "WORLD: HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } - uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcslot); - uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstslot); + uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.srcslot); + uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.dstslot); _player->SwapItem(src, dst); } @@ -147,54 +133,44 @@ void WorldSession::HandleAutoEquipItemSlotOpcode(WorldPacket& recvData) _player->SwapItem(item->GetPos(), dstpos); } -void WorldSession::HandleSwapItem(WorldPacket& recvData) +void WorldSession::HandleSwapItem(WorldPackets::Item::SwapItem& swapItem) { - uint32 itemCount = recvData.ReadBits(2); - - if (itemCount != 2) + if (swapItem.itemCount != 2) { - TC_LOG_ERROR("network", "WORLD: HandleSwapItem - Invalid itemCount (%u)", itemCount); + TC_LOG_ERROR("network", "WORLD: HandleSwapItem - Invalid itemCount (%u)", swapItem.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; - recvData >> dstbag >> srcbag >> dstslot >> srcslot; - TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u", srcbag, srcslot, dstbag, dstslot); + TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u, dstslot = %u", swapItem.srcbag, swapItem.srcslot, swapItem.dstbag, swapItem.dstslot); - uint16 src = ((srcbag << 8) | srcslot); - uint16 dst = ((dstbag << 8) | dstslot); + uint16 src = ((swapItem.srcbag << 8) | swapItem.srcslot); + uint16 dst = ((swapItem.dstbag << 8) | swapItem.dstslot); // prevent attempt swap same item to current position generated by client at special checting sequence if (src == dst) return; - if (!_player->IsValidPos(srcbag, srcslot, true)) + if (!_player->IsValidPos(swapItem.srcbag, swapItem.srcslot, true)) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); return; } - if (!_player->IsValidPos(dstbag, dstslot, true)) + if (!_player->IsValidPos(swapItem.dstbag, swapItem.dstslot, true)) { _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL); return; } - if (_player->IsBankPos(srcbag, srcslot) && !CanUseBank()) + if (_player->IsBankPos(swapItem.srcbag, swapItem.srcslot) && !CanUseBank()) { TC_LOG_DEBUG("network", "WORLD: HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } - if (_player->IsBankPos(dstbag, dstslot) && !CanUseBank()) + if (_player->IsBankPos(swapItem.dstbag, swapItem.dstslot) && !CanUseBank()) { TC_LOG_DEBUG("network", "WORLD: HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; @@ -203,23 +179,19 @@ void WorldSession::HandleSwapItem(WorldPacket& recvData) _player->SwapItem(src, dst); } -void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData) +void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& autoEquipItem) { - uint32 itemCount = recvData.ReadBits(2); - - if (itemCount != 1) + if (autoEquipItem.itemCount != 1) { - TC_LOG_ERROR("network", "WORLD: HandleAutoEquipItemOpcode - Invalid itemCount (%u)", itemCount); + TC_LOG_ERROR("network", "WORLD: HandleAutoEquipItemOpcode - Invalid itemCount (%u)", autoEquipItem.itemCount); return; } //TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOEQUIP_ITEM"); - uint8 srcbag, srcslot, slotA, slotB; - - recvData >> srcbag >> srcslot >> slotA >> slotB; - TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", srcbag, srcslot); + + TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", autoEquipItem.srcbag, autoEquipItem.srcslot); - Item* pSrcItem = _player->GetItemByPos(srcbag, srcslot); + Item* pSrcItem = _player->GetItemByPos(autoEquipItem.srcbag, autoEquipItem.srcslot); if (!pSrcItem) return; // only at cheat @@ -238,7 +210,7 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData) Item* pDstItem = _player->GetItemByPos(dest); if (!pDstItem) // empty slot, simple case { - _player->RemoveItem(srcbag, srcslot, true); + _player->RemoveItem(autoEquipItem.srcbag, autoEquipItem.srcslot, true); _player->EquipItem(dest, pSrcItem, true); _player->AutoUnequipOffhandIfNeed(); } @@ -259,23 +231,23 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData) uint16 eSrc = 0; if (_player->IsInventoryPos(src)) { - msg = _player->CanStoreItem(srcbag, srcslot, sSrc, pDstItem, true); + msg = _player->CanStoreItem(autoEquipItem.srcbag, autoEquipItem.srcslot, sSrc, pDstItem, true); if (msg != EQUIP_ERR_OK) - msg = _player->CanStoreItem(srcbag, NULL_SLOT, sSrc, pDstItem, true); + msg = _player->CanStoreItem(autoEquipItem.srcbag, NULL_SLOT, sSrc, pDstItem, true); if (msg != EQUIP_ERR_OK) msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, pDstItem, true); } else if (_player->IsBankPos(src)) { - msg = _player->CanBankItem(srcbag, srcslot, sSrc, pDstItem, true); + msg = _player->CanBankItem(autoEquipItem.srcbag, autoEquipItem.srcslot, sSrc, pDstItem, true); if (msg != EQUIP_ERR_OK) - msg = _player->CanBankItem(srcbag, NULL_SLOT, sSrc, pDstItem, true); + msg = _player->CanBankItem(autoEquipItem.srcbag, NULL_SLOT, sSrc, pDstItem, true); if (msg != EQUIP_ERR_OK) msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, sSrc, pDstItem, true); } else if (_player->IsEquipmentPos(src)) { - msg = _player->CanEquipItem(srcslot, eSrc, pDstItem, true); + msg = _player->CanEquipItem(autoEquipItem.srcslot, eSrc, pDstItem, true); if (msg == EQUIP_ERR_OK) msg = _player->CanUnequipItem(eSrc, true); } @@ -288,7 +260,7 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData) // now do moves, remove... _player->RemoveItem(dstbag, dstslot, false); - _player->RemoveItem(srcbag, srcslot, false); + _player->RemoveItem(autoEquipItem.srcbag, autoEquipItem.srcslot, false); // add to dest _player->EquipItem(dest, pSrcItem, true); @@ -305,16 +277,13 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPacket& recvData) } } -void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData) +void WorldSession::HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem& destroyItem) { //TC_LOG_DEBUG("network", "WORLD: CMSG_DESTROY_ITEM"); - uint8 bag, slot; - uint32 count; - recvData >> count >> bag >> slot; - TC_LOG_DEBUG("network", "STORAGE: receive bag = %u, slot = %u, count = %u", bag, slot, count); + TC_LOG_DEBUG("network", "STORAGE: receive bag = %u, slot = %u, count = %u", destroyItem.bag, destroyItem.slot, destroyItem.count); - uint16 pos = (bag << 8) | slot; + uint16 pos = (destroyItem.bag << 8) | destroyItem.slot; // prevent drop unequipable items (in combat, for example) and non-empty bags if (_player->IsEquipmentPos(pos) || _player->IsBagPos(pos)) @@ -327,7 +296,7 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData) } } - Item* pItem = _player->GetItemByPos(bag, slot); + Item* pItem = _player->GetItemByPos(destroyItem.bag, destroyItem.slot); if (!pItem) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); @@ -340,13 +309,13 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket& recvData) return; } - if (count) + if (destroyItem.count) { - uint32 i_count = count; + uint32 i_count = destroyItem.count; _player->DestroyItemCount(pItem, i_count, true); } else - _player->DestroyItem(bag, slot, true); + _player->DestroyItem(destroyItem.bag, destroyItem.slot, true); } void WorldSession::HandleReadItem(WorldPacket& recvData) |
