aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp46
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp29
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h25
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
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);