diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 46 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 29 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.h | 25 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
5 files changed, 84 insertions, 20 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3a904a395d9..ff5fe1faf28 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -13605,30 +13605,40 @@ void Player::SendItemDurations() (*itr)->SendTimeUpdate(this); } -void Player::SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast) +void Player::SendNewItem(Item* item, uint32 quantity, bool pushed, bool created, bool broadcast) { - if (!item) // prevent crash + if (!item) // prevent crash return; - // last check 2.0.10 - WorldPacket data(SMSG_ITEM_PUSH_RESULT, (8+4+4+4+1+4+4+4+4+4)); - data << GetGUID(); // player GUID - data << uint32(received); // 0=looted, 1=from npc - data << uint32(created); // 0=received, 1=created - data << uint32(1); // bool print error to chat - data << uint8(item->GetBagSlot()); // bagslot - // item slot, but when added to stack: 0xFFFFFFFF - data << uint32((item->GetCount() == count) ? item->GetSlot() : -1); - data << uint32(item->GetEntry()); // item id - data << uint32(item->GetItemSuffixFactor()); // SuffixFactor - data << int32(item->GetItemRandomPropertyId()); // random item property id - data << uint32(count); // count of items - data << uint32(GetItemCount(item->GetEntry())); // count of items in inventory + /// @todo: fix 6.x implementation + WorldPackets::Item::ItemPushResult packet; + + packet.PlayerGUID = GetGUID(); + + packet.Slot = item->GetBagSlot(); + packet.SlotInBag = item->GetCount() == quantity ? item->GetSlot() : -1; + + packet.Item.Initalize(item); + + //packet.ReadUInt32("WodUnk"); + packet.Quantity = quantity; + packet.QuantityInInventory = GetItemCount(item->GetEntry()); + //packet.ReadUInt32("BattlePetBreedID"); + //packet.ReadUInt32("BattlePetBreedQuality"); + //packet.ReadUInt32("BattlePetSpeciesID"); + //packet.ReadUInt32("BattlePetLevel"); + + packet.ItemGUID = item->GetGUID(); + + packet.Pushed = pushed; + packet.DisplayText = true; + packet.Created = created; + //packet.ReadBit("IsBonusRoll"); if (broadcast && GetGroup()) - GetGroup()->BroadcastPacket(&data, true); + GetGroup()->BroadcastPacket(packet.Write(), true); else - GetSession()->SendPacket(&data); + GetSession()->SendPacket(packet.Write()); } /*********************************************************/ diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 1f7b2743705..f6ad2fecae5 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1571,7 +1571,7 @@ class Player : public Unit, public GridObject<Player> uint32 GetArmorProficiency() const { return m_ArmorProficiency; } bool IsUseEquipedWeapon(bool mainhand) const; bool IsTwoHandUsed() const; - void SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast = false); + void SendNewItem(Item* item, uint32 quantity, bool received, bool created, bool broadcast = false); bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot); bool BuyCurrencyFromVendorSlot(ObjectGuid vendorGuid, uint32 vendorSlot, uint32 currency, uint32 count); bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore); diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 52d4eb2f770..ed1d3e1dda2 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -296,3 +296,32 @@ WorldPacket const* WorldPackets::Item::SellResponse::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Item::ItemPushResult::Write() +{ + _worldPacket << PlayerGUID; + + _worldPacket << Slot; + _worldPacket << SlotInBag; + + _worldPacket << Item; + + _worldPacket << WodUnk; + _worldPacket << Quantity; + _worldPacket << QuantityInInventory; + _worldPacket << BattlePetBreedID; + _worldPacket << BattlePetBreedQuality; + _worldPacket << BattlePetSpeciesID; + _worldPacket << BattlePetLevel; + + _worldPacket << ItemGUID; + + _worldPacket.WriteBit(Pushed); + _worldPacket.WriteBit(Created); + _worldPacket.WriteBit(DisplayText); + _worldPacket.WriteBit(IsBonusRoll); + + _worldPacket.FlushBits(); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index 6c98742c2f5..538ecd28ffe 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -282,6 +282,31 @@ namespace WorldPackets SellResult Reason = SELL_ERR_UNK; }; + class ItemPushResult final : public ServerPacket + { + public: + ItemPushResult() : ServerPacket(SMSG_ITEM_PUSH_RESULT, 16 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 16 + 1 + 1 + 1 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid PlayerGUID; + uint8 Slot = 0; + int32 SlotInBag = 0; + ItemInstance Item; + uint32 WodUnk = 0; + int32 Quantity = 0; + int32 QuantityInInventory = 0; + int32 BattlePetBreedID = 0; + uint32 BattlePetBreedQuality = 0; + int32 BattlePetSpeciesID = 0; + int32 BattlePetLevel = 0; + ObjectGuid ItemGUID; + bool Pushed = false; + bool DisplayText = false; + bool Created = false; + bool IsBonusRoll = false; + }; + ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate); } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index f9190c361bf..da9bb3d8edb 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1258,7 +1258,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_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); |
