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 | |
parent | b3a5f466d5910b1d1c563308bd99e368d28d4044 (diff) |
Core/Items: fixed inventory item moving/splitting
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 54 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 8 |
4 files changed, 57 insertions, 30 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fba325dca6a..ccc926adb09 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -13091,7 +13091,7 @@ void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint WorldPacket data(SMSG_INVENTORY_CHANGE_FAILURE, (msg == EQUIP_ERR_CANT_EQUIP_LEVEL_I ? 22 : 18)); data << uint8(msg); - if (msg != EQUIP_ERR_OK) + //if (msg != EQUIP_ERR_OK) { data << (pItem ? pItem->GetGUID() : ObjectGuid::Empty); data << (pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty); @@ -13106,21 +13106,6 @@ void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint data << uint32(proto ? proto->RequiredLevel : 0); break; } - case EQUIP_ERR_NO_OUTPUT: // no idea about this one... - { - data << uint64(0); // item guid - data << uint32(0); // slot - data << uint64(0); // container - break; - } - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS: - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS: - case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS: - { - ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid); - data << uint32(proto ? proto->ItemLimitCategory : 0); - break; - } default: break; } 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) diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 9499083e59e..54e8291ec9d 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -167,7 +167,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOBANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_ITEM_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemSlotOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BAG_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBagItemOpcode ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBagItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutostoreLootItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTO_DECLINE_GUILD_INVITES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoDeclineGuildInvites ); @@ -621,7 +621,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SOCKET_GEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SPELLCLICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpellClick ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpiritHealerActivateOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SPLIT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSplitItemOpcode ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSplitItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_STANDSTATECHANGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleStandStateChangeOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_STOP_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SUBMIT_BUG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -630,7 +630,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_SUMMON_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSummonResponseOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SUSPEND_COMMS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SWAP_INV_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapInvItemOpcode ); + DEFINE_OPCODE_HANDLER_OLD(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapInvItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapItem ); DEFINE_OPCODE_HANDLER_OLD(CMSG_SYNC_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXINODE_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode ); @@ -1029,7 +1029,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALID_PROMOTION_CODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ADD_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 247d43a2c73..7e11d8f3427 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -579,7 +579,7 @@ enum OpcodeClient : uint32 CMSG_SOCKET_GEMS = 0xBADD, CMSG_SPELLCLICK = 0x0BC2, CMSG_SPIRIT_HEALER_ACTIVATE = 0xBADD, - CMSG_SPLIT_ITEM = 0xBADD, + CMSG_SPLIT_ITEM = 0x0795, CMSG_STANDSTATECHANGE = 0xBADD, CMSG_START_QUEST = 0xBADD, CMSG_STOP_DANCE = 0xBADD, @@ -590,8 +590,8 @@ enum OpcodeClient : uint32 CMSG_SUMMON_RESPONSE = 0xBADD, CMSG_SUSPEND_COMMS_ACK = 0x0C56, CMSG_SUSPEND_TOKEN_RESPONSE = 0xBADD, - CMSG_SWAP_INV_ITEM = 0xBADD, - CMSG_SWAP_ITEM = 0x0F17, + CMSG_SWAP_INV_ITEM = 0x0F17, + CMSG_SWAP_ITEM = 0x0736, CMSG_SYNC_DANCE = 0xBADD, CMSG_TAXICLEARALLNODES = 0xBADD, CMSG_TAXIENABLEALLNODES = 0xBADD, @@ -1028,7 +1028,7 @@ enum OpcodeServer : uint32 SMSG_INVALIDATE_DANCE = 0xBADD, SMSG_INVALIDATE_PLAYER = 0x0B37, SMSG_INVALID_PROMOTION_CODE = 0xBADD, - SMSG_INVENTORY_CHANGE_FAILURE = 0xBADD, + SMSG_INVENTORY_CHANGE_FAILURE = 0x0112, SMSG_ITEM_ADD_PASSIVE = 0xBADD, SMSG_ITEM_COOLDOWN = 0xBADD, SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x010D, |