diff options
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 35 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 11 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
6 files changed, 39 insertions, 28 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 0553d99dd8f..e9eccb6b634 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -129,42 +129,35 @@ void WorldSession::HandleUseItemOpcode(WorldPackets::Spells::UseItem& packet) } } -void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) +void WorldSession::HandleOpenItemOpcode(WorldPackets::Spells::OpenItem& packet) { - TC_LOG_DEBUG("network", "WORLD: CMSG_OPEN_ITEM packet, data length = %i", (uint32)recvPacket.size()); - - Player* pUser = _player; + Player* player = _player; // ignore for remote control state - if (pUser->m_mover != pUser) + if (player->m_mover != player) return; + TC_LOG_INFO("network", "bagIndex: %u, slot: %u", packet.Slot, packet.PackSlot); - uint8 bagIndex, slot; - - recvPacket >> bagIndex >> slot; - - TC_LOG_INFO("network", "bagIndex: %u, slot: %u", bagIndex, slot); - - Item* item = pUser->GetItemByPos(bagIndex, slot); + Item* item = player->GetItemByPos(packet.Slot, packet.PackSlot); if (!item) { - pUser->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); + player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); return; } ItemTemplate const* proto = item->GetTemplate(); if (!proto) { - pUser->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, item, NULL); + player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, item, NULL); return; } // Verify that the bag is an actual bag or wrapped item that can be used "normally" if (!(proto->GetFlags() & ITEM_PROTO_FLAG_OPENABLE) && !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED)) { - pUser->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); + player->SendEquipError(EQUIP_ERR_CLIENT_LOCKED_OUT, item, NULL); TC_LOG_ERROR("network", "Possible hacking attempt: Player %s [%s] tried to open item [%s, entry: %u] which is not openable!", - pUser->GetName().c_str(), pUser->GetGUID().ToString().c_str(), item->GetGUID().ToString().c_str(), proto->GetId()); + player->GetName().c_str(), player->GetGUID().ToString().c_str(), item->GetGUID().ToString().c_str(), proto->GetId()); return; } @@ -176,7 +169,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) if (!lockInfo) { - pUser->SendEquipError(EQUIP_ERR_ITEM_LOCKED, item, NULL); + player->SendEquipError(EQUIP_ERR_ITEM_LOCKED, item, NULL); TC_LOG_ERROR("network", "WORLD::OpenItem: item [%s] has an unknown lockId: %u!", item->GetGUID().ToString().c_str(), lockId); return; } @@ -184,7 +177,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) // was not unlocked yet if (item->IsLocked()) { - pUser->SendEquipError(EQUIP_ERR_ITEM_LOCKED, item, NULL); + player->SendEquipError(EQUIP_ERR_ITEM_LOCKED, item, NULL); return; } } @@ -206,12 +199,12 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) item->SetGuidValue(ITEM_FIELD_GIFTCREATOR, ObjectGuid::Empty); item->SetEntry(entry); item->SetUInt32Value(ITEM_FIELD_FLAGS, flags); - item->SetState(ITEM_CHANGED, pUser); + item->SetState(ITEM_CHANGED, player); } else { TC_LOG_ERROR("network", "Wrapped item %s don't have record in character_gifts table and will deleted", item->GetGUID().ToString().c_str()); - pUser->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); + player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); return; } @@ -222,7 +215,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) CharacterDatabase.Execute(stmt); } else - pUser->SendLoot(item->GetGUID(), LOOT_CORPSE); + player->SendLoot(item->GetGUID(), LOOT_CORPSE); } void WorldSession::HandleGameObjectUseOpcode(WorldPackets::GameObject::GameObjectUse& packet) diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index fabecce0d34..4045a76cb62 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -626,3 +626,9 @@ void WorldPackets::Spells::CancelCast::Read() _worldPacket >> SpellID; _worldPacket >> CastID; } + +void WorldPackets::Spells::OpenItem::Read() +{ + _worldPacket >> Slot + >> PackSlot; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 634f4b40e7f..72a4fd4bdce 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -588,6 +588,17 @@ namespace WorldPackets uint32 SpellID = 0; uint8 CastID = 0; }; + + class OpenItem final : public ClientPacket + { + public: + OpenItem(WorldPacket&& packet) : ClientPacket(CMSG_OPEN_ITEM, std::move(packet)) { } + + void Read() override; + + uint8 Slot = 0; + uint8 PackSlot = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index bfa0c829f3b..467e56fb1f1 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -186,7 +186,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoStoreBankItem, &WorldSession::HandleAutoStoreBankItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::AutoStoreLootItem, &WorldSession::HandleAutostoreLootItemOpcode); + DEFINE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::AutoStoreLootItem, &WorldSession::HandleAutostoreLootItemOpcode); DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBattlefieldLeaveOpcode ); @@ -612,7 +612,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_OFFER_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::OfferPetition, &WorldSession::HandleOfferPetition); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPENING_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_GARRISON_MISSION_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpenItemOpcode ); + DEFINE_HANDLER(CMSG_OPEN_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::OpenItem, &WorldSession::HandleOpenItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_SHIPMENT_GAME_OBJ, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_SHIPMENT_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPT_OUT_OF_LOOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOptOutOfLootOpcode ); @@ -1350,7 +1350,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1409,7 +1409,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLLS_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 9668a30cad7..819fe08ead7 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -520,7 +520,7 @@ enum OpcodeClient : uint32 CMSG_OFFER_PETITION = 0xBADD, CMSG_OPENING_CINEMATIC = 0xBADD, CMSG_OPEN_GARRISON_MISSION_NPC = 0x1911, - CMSG_OPEN_ITEM = 0xBADD, + CMSG_OPEN_ITEM = 0x0E51, CMSG_OPEN_SHIPMENT_GAME_OBJ = 0xBADD, CMSG_OPEN_SHIPMENT_NPC = 0x0E41, CMSG_OPT_OUT_OF_LOOT = 0xBADD, @@ -591,7 +591,7 @@ enum OpcodeClient : uint32 CMSG_RANDOM_ROLL = 0x1BE2, CMSG_READY_CHECK_RESPONSE = 0xBADD, CMSG_READ_ITEM = 0xBADD, - CMSG_REAGENT_BANK_BUY_TAB = 0xBADD, + CMSG_REAGENT_BANK_BUY_TAB = 0x0A3C, CMSG_REALM_NAME_QUERY = 0x17BC, CMSG_RECLAIM_CORPSE = 0x093B, CMSG_RECRUIT_A_FRIEND = 0xBADD, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index a0c7906d0bf..61c27ff57d8 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -362,6 +362,7 @@ namespace WorldPackets class CastSpell; class PetCastSpell; class UseItem; + class OpenItem; class SetActionButton; } @@ -1093,7 +1094,7 @@ class WorldSession void HandleSetSheathedOpcode(WorldPackets::Combat::SetSheathed& packet); void HandleUseItemOpcode(WorldPackets::Spells::UseItem& packet); - void HandleOpenItemOpcode(WorldPacket& recvPacket); + void HandleOpenItemOpcode(WorldPackets::Spells::OpenItem& packet); void HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& castRequest); void HandleCancelCastOpcode(WorldPackets::Spells::CancelCast& packet); void HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& cancelAura); |