aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-05-01 00:20:41 +0200
committerShauren <shauren.trinity@gmail.com>2015-05-01 00:20:41 +0200
commit1b5f6d44f0fa4858c653c3f6ba1c273603ce68ba (patch)
treefab3bccf59f2ddaf465c09647790497a38268dd9
parente0746e49b3194fc26137cf93d140a2d2521668ee (diff)
Core/PacketIO: Updated and enabled CMSG_ITEM_TEXT_QUERY, SMSG_QUERY_ITEM_TEXT_RESPONSE, CMSG_CANCEL_TEMP_ENCHANTMENT
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h2
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp70
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp19
-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/Packets/QueryPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h27
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h7
9 files changed, 96 insertions, 74 deletions
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index 47523872151..9e45c3f5734 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -168,7 +168,7 @@ enum ItemProtoFlags
enum ItemFieldFlags
{
ITEM_FLAG_SOULBOUND = 0x00000001, // Item is soulbound and cannot be traded <<--
- ITEM_FLAG_UNK1 = 0x00000002, // ?
+ ITEM_FLAG_TRANSLATED = 0x00000002, // Item text will not read as garbage when player does not know the language
ITEM_FLAG_UNLOCKED = 0x00000004, // Item had lock but can be opened now
ITEM_FLAG_WRAPPED = 0x00000008, // Item is wrapped and contains another item
ITEM_FLAG_UNK2 = 0x00000010, // ?
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 9e282582b7d..67d8c27acd8 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -494,38 +494,6 @@ void WorldSession::HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet)
_player->SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, 0, 0);
}
-void WorldSession::HandleBuyItemInSlotOpcode(WorldPacket& recvData)
-{
- ObjectGuid vendorguid, bagguid;
- uint32 item, slot, count;
- uint8 bagslot;
-
- recvData >> vendorguid >> item >> slot >> bagguid >> bagslot >> count;
-
- // client expects count starting at 1, and we send vendorslot+1 to client already
- if (slot > 0)
- --slot;
- else
- return; // cheating
-
- uint8 bag = NULL_BAG; // init for case invalid bagGUID
- Item* bagItem = NULL;
- // find bag slot by bag guid
- if (bagguid == _player->GetGUID())
- bag = INVENTORY_SLOT_BAG_0;
- else
- bagItem = _player->GetItemByGuid(bagguid);
-
- if (bagItem && bagItem->IsBag())
- bag = bagItem->GetSlot();
-
- // bag not found, cheating?
- if (bag == NULL_BAG)
- return;
-
- GetPlayer()->BuyItemFromVendorSlot(vendorguid, slot, item, count, bag, bagslot);
-}
-
void WorldSession::HandleBuyItemOpcode(WorldPackets::Item::BuyItem& packet)
{
// client expects count starting at 1, and we send vendorslot+1 to client already
@@ -1094,17 +1062,13 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData)
itemTarget->SendUpdateSockets();
}
-void WorldSession::HandleCancelTempEnchantmentOpcode(WorldPacket& recvData)
+void WorldSession::HandleCancelTempEnchantmentOpcode(WorldPackets::Item::CancelTempEnchantment& cancelTempEnchantment)
{
- uint32 slot;
-
- recvData >> slot;
-
// apply only to equipped item
- if (!Player::IsEquipmentPos(INVENTORY_SLOT_BAG_0, slot))
+ if (!Player::IsEquipmentPos(INVENTORY_SLOT_BAG_0, cancelTempEnchantment.Slot))
return;
- Item* item = GetPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
+ Item* item = GetPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, cancelTempEnchantment.Slot);
if (!item)
return;
@@ -1149,34 +1113,6 @@ void WorldSession::HandleItemRefund(WorldPacket &recvData)
GetPlayer()->RefundItem(item);
}
-/**
- * Handles the packet sent by the client when requesting information about item text.
- *
- * This function is called when player clicks on item which has some flag set
- */
-void WorldSession::HandleItemTextQuery(WorldPacket& recvData )
-{
- ObjectGuid itemGuid;
- recvData >> itemGuid;
-
- TC_LOG_DEBUG("network", "CMSG_ITEM_TEXT_QUERY %s", itemGuid.ToString().c_str());
-
- WorldPacket data(SMSG_QUERY_ITEM_TEXT_RESPONSE, 14); // guess size
-
- if (Item* item = _player->GetItemByGuid(itemGuid))
- {
- data << uint8(0); // has text
- data << itemGuid; // item guid
- data << item->GetText();
- }
- else
- {
- data << uint8(1); // no text
- }
-
- SendPacket(&data);
-}
-
void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData)
{
Player* player = GetPlayer();
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index e92fdab9409..eec80888559 100644
--- a/src/server/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
@@ -414,3 +414,22 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet)
SendPacket(response.Write());
}
}
+
+/**
+* Handles the packet sent by the client when requesting information about item text.
+*
+* This function is called when player clicks on item which has some flag set
+*/
+void WorldSession::HandleItemTextQuery(WorldPackets::Query::ItemTextQuery& itemTextQuery)
+{
+ WorldPackets::Query::QueryItemTextResponse queryItemTextResponse;
+ queryItemTextResponse.Id = itemTextQuery.Id;
+
+ if (Item* item = _player->GetItemByGuid(itemTextQuery.Id))
+ {
+ queryItemTextResponse.Valid = true;
+ queryItemTextResponse.Item.Text = item->GetText();
+ }
+
+ SendPacket(queryItemTextResponse.Write());
+}
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index 3feea2cdc98..a4da605ca08 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -369,3 +369,8 @@ void WorldPackets::Item::WrapItem::Read()
{
_worldPacket >> Inv;
}
+
+void WorldPackets::Item::CancelTempEnchantment::Read()
+{
+ _worldPacket >> Slot;
+}
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index d37df357513..7b0b9e41e4b 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -353,6 +353,16 @@ namespace WorldPackets
InvUpdate Inv;
};
+ class CancelTempEnchantment final : public ClientPacket
+ {
+ public:
+ CancelTempEnchantment(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_TEMP_ENCHANTMENT, std::move(packet)) { }
+
+ void Read() override;
+
+ int32 Slot = 0;
+ };
+
ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate);
}
}
diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp
index 4322ef3458b..f7806a9e588 100644
--- a/src/server/game/Server/Packets/QueryPackets.cpp
+++ b/src/server/game/Server/Packets/QueryPackets.cpp
@@ -465,3 +465,27 @@ WorldPacket const* WorldPackets::Query::QueryPetNameResponse::Write()
return &_worldPacket;
}
+
+void WorldPackets::Query::ItemTextQuery::Read()
+{
+ _worldPacket >> Id;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::ItemTextCache const& itemTextCache)
+{
+ data.WriteBits(itemTextCache.Text.length(), 13);
+ data.FlushBits();
+
+ data.WriteString(itemTextCache.Text);
+
+ return data;
+}
+
+WorldPacket const* WorldPackets::Query::QueryItemTextResponse::Write()
+{
+ _worldPacket.WriteBit(Valid);
+ _worldPacket << Id;
+ _worldPacket << Item;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h
index a5d7e5de8c4..88bf5a887f6 100644
--- a/src/server/game/Server/Packets/QueryPackets.h
+++ b/src/server/game/Server/Packets/QueryPackets.h
@@ -418,6 +418,33 @@ namespace WorldPackets
uint32 Timestamp = 0;
std::string Name;
};
+
+ class ItemTextQuery final : public ClientPacket
+ {
+ public:
+ ItemTextQuery(WorldPacket&& packet) : ClientPacket(CMSG_ITEM_TEXT_QUERY, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Id;
+ };
+
+ struct ItemTextCache
+ {
+ std::string Text;
+ };
+
+ class QueryItemTextResponse final : public ServerPacket
+ {
+ public:
+ QueryItemTextResponse() : ServerPacket(SMSG_QUERY_ITEM_TEXT_RESPONSE) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Id;
+ bool Valid = false;
+ ItemTextCache Item;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 2886b079c93..7ee3ea46fea 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -249,7 +249,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CANCEL_MOUNT_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelMountAura, &WorldSession::HandleCancelMountAuraOpcode);
DEFINE_HANDLER(CMSG_CANCEL_QUEUED_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTempEnchantmentOpcode);
+ DEFINE_HANDLER(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::CancelTempEnchantment, &WorldSession::HandleCancelTempEnchantmentOpcode);
DEFINE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, WorldPackets::Trade::CancelTrade, &WorldSession::HandleCancelTradeOpcode);
DEFINE_HANDLER(CMSG_CAN_DUEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Duel::CanDuel, &WorldSession::HandleCanDuel);
DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Spells::CastSpell, &WorldSession::HandleCastSpellOpcode);
@@ -462,7 +462,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_INSPECT_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::InspectPVPRequest, &WorldSession::HandleInspectPVP);
DEFINE_OPCODE_HANDLER_OLD(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse);
DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_PURCHASE_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemTextQuery );
+ DEFINE_HANDLER(CMSG_ITEM_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::ItemTextQuery, &WorldSession::HandleItemTextQuery);
DEFINE_HANDLER(CMSG_JOIN_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_JOIN_RATED_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess);
@@ -1504,7 +1504,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GAME_OBJECT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PAGE_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PETITION_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 631f87aeb11..e9a59d91fd6 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -282,6 +282,7 @@ namespace WorldPackets
class SwapInvItem;
class SwapItem;
class WrapItem;
+ class CancelTempEnchantment;
}
namespace Loot
@@ -375,6 +376,7 @@ namespace WorldPackets
class QueryPetName;
class QuestPOIQuery;
class QueryQuestCompletionNPCs;
+ class ItemTextQuery;
}
namespace Quest
@@ -1179,7 +1181,7 @@ class WorldSession
void HandleMailMarkAsRead(WorldPackets::Mail::MailMarkAsRead& packet);
void HandleMailReturnToSender(WorldPackets::Mail::MailReturnToSender& packet);
void HandleMailDelete(WorldPackets::Mail::MailDelete& packet);
- void HandleItemTextQuery(WorldPacket& recvData);
+ void HandleItemTextQuery(WorldPackets::Query::ItemTextQuery& itemTextQuery);
void HandleMailCreateTextItem(WorldPackets::Mail::MailCreateTextItem& packet);
void HandleQueryNextMailTime(WorldPackets::Mail::MailQueryNextMailTime& packet);
void HandleCancelChanneling(WorldPacket& recvData);
@@ -1190,7 +1192,6 @@ class WorldSession
void HandleDestroyItemOpcode(WorldPackets::Item::DestroyItem& destroyItem);
void HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& autoEquipItem);
void HandleSellItemOpcode(WorldPackets::Item::SellItem& packet);
- void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket);
void HandleBuyItemOpcode(WorldPackets::Item::BuyItem& packet);
void HandleListInventoryOpcode(WorldPackets::NPC::Hello& packet);
void HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBagItem& packet);
@@ -1374,7 +1375,7 @@ class WorldSession
// Socket gem
void HandleSocketOpcode(WorldPacket& recvData);
- void HandleCancelTempEnchantmentOpcode(WorldPacket& recvData);
+ void HandleCancelTempEnchantmentOpcode(WorldPackets::Item::CancelTempEnchantment& cancelTempEnchantment);
void HandleGetItemPurchaseData(WorldPackets::Item::GetItemPurchaseData& packet);
void HandleItemRefund(WorldPacket& recvData);