TrinityCore
Loading...
Searching...
No Matches
ItemPacketsCommon.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "ItemPacketsCommon.h"
19#include "Item.h"
20#include "Loot.h"
21#include "PacketOperators.h"
22
23namespace WorldPackets::Item
24{
26{
27 if (Context != r.Context)
28 return false;
29
30 return std::ranges::is_permutation(BonusListIDs, r.BonusListIDs);
31}
32
34{
35 return std::ranges::is_permutation(Values, r.Values);
36}
37
39{
40 ItemID = item->GetEntry();
41 std::vector<int32> const& bonusListIds = item->GetBonusListIDs();
42 if (!bonusListIds.empty())
43 {
44 ItemBonus.emplace();
45 ItemBonus->BonusListIDs.insert(ItemBonus->BonusListIDs.end(), bonusListIds.begin(), bonusListIds.end());
46 ItemBonus->Context = item->GetContext();
47 }
48
49 for (UF::ItemMod mod : item->m_itemData->Modifiers->Values)
50 Modifications.Values.push_back({ .Value = mod.Value, .Type = ItemModifier(mod.Type) });
51}
52
53void ItemInstance::Initialize(UF::SocketedGem const* gem)
54{
55 ItemID = gem->ItemID;
56
57 ItemBonuses bonus;
58 bonus.Context = ItemContext(*gem->Context);
59 for (uint16 bonusListId : gem->BonusListIDs)
60 if (bonusListId)
61 bonus.BonusListIDs.push_back(bonusListId);
62
63 if (bonus.Context != ItemContext::NONE || !bonus.BonusListIDs.empty())
64 ItemBonus = bonus;
65}
66
67void ItemInstance::Initialize(::LootItem const& lootItem)
68{
69 ItemID = lootItem.itemid;
70
71 if (!lootItem.BonusListIDs.empty() || lootItem.randomBonusListId)
72 {
73 ItemBonus.emplace();
74 ItemBonus->BonusListIDs = lootItem.BonusListIDs;
75 ItemBonus->Context = lootItem.context;
76 if (lootItem.randomBonusListId)
77 ItemBonus->BonusListIDs.push_back(lootItem.randomBonusListId);
78 }
79}
80
81bool ItemInstance::operator==(ItemInstance const& r) const
82{
83 if (ItemID != r.ItemID)
84 return false;
85
86 if (ItemBonus != r.ItemBonus)
87 return false;
88
89 if (Modifications != r.Modifications)
90 return false;
91
92 return true;
93}
94
95bool ItemBonusKey::operator==(ItemBonusKey const& right) const
96{
97 if (ItemID != right.ItemID)
98 return false;
99
100 if (BonusListIDs != right.BonusListIDs)
101 return false;
102
103 if (Modifications != right.Modifications)
104 return false;
105
106 return true;
107}
108
109ByteBuffer& operator<<(ByteBuffer& data, ItemBonuses const& itemBonusInstanceData)
110{
111 data << uint8(itemBonusInstanceData.Context);
112 data << Size<uint32>(itemBonusInstanceData.BonusListIDs);
113 for (uint32 bonusID : itemBonusInstanceData.BonusListIDs)
114 data << uint32(bonusID);
115
116 return data;
117}
118
119ByteBuffer& operator>>(ByteBuffer& data, ItemBonuses& itemBonusInstanceData)
120{
121 data >> As<uint8>(itemBonusInstanceData.Context);
122 uint32 bonusListIdSize;
123 data >> bonusListIdSize;
124 if (bonusListIdSize > 32)
125 OnInvalidArraySize(bonusListIdSize, 32);
126
127 itemBonusInstanceData.BonusListIDs.resize(bonusListIdSize);
128
129 for (int32& bonusListID : itemBonusInstanceData.BonusListIDs)
130 data >> bonusListID;
131
132 return data;
133}
134
136{
137 data << uint8(itemMod.Type);
138 data << int32(itemMod.Value);
139
140 return data;
141}
142
144{
145 data >> As<uint8>(itemMod.Type);
146 data >> itemMod.Value;
147
148 return data;
149}
150
151ByteBuffer& operator<<(ByteBuffer& data, ItemModList const& itemModList)
152{
153 data << BitsSize<6>(itemModList.Values);
154 data.FlushBits();
155
156 for (ItemMod const& itemMod : itemModList.Values)
157 data << itemMod;
158
159 return data;
160}
161
163{
164 data >> BitsSize<6>(itemModList.Values);
165 data.ResetBitPos();
166
167 for (ItemMod& itemMod : itemModList.Values)
168 data >> itemMod;
169
170 return data;
171}
172
173ByteBuffer& operator<<(ByteBuffer& data, ItemInstance const& itemInstance)
174{
175 data << int32(itemInstance.ItemID);
176
177 data << OptionalInit(itemInstance.ItemBonus);
178 data.FlushBits();
179
180 data << itemInstance.Modifications;
181
182 if (itemInstance.ItemBonus)
183 data << *itemInstance.ItemBonus;
184
185 return data;
186}
187
189{
190 data >> itemInstance.ItemID;
191 data >> OptionalInit(itemInstance.ItemBonus);
192 data.ResetBitPos();
193
194 data >> itemInstance.Modifications;
195
196 if (itemInstance.ItemBonus)
197 data >> *itemInstance.ItemBonus;
198
199 return data;
200}
201
202ByteBuffer& operator<<(ByteBuffer& data, ItemBonusKey const& itemBonusKey)
203{
204 data << int32(itemBonusKey.ItemID);
205 data << Size<uint32>(itemBonusKey.BonusListIDs);
206 data << Size<uint32>(itemBonusKey.Modifications);
207
208 if (!itemBonusKey.BonusListIDs.empty())
209 data.append(itemBonusKey.BonusListIDs.data(), itemBonusKey.BonusListIDs.size());
210
211 for (ItemMod const& modification : itemBonusKey.Modifications)
212 data << modification;
213
214 return data;
215}
216
217ByteBuffer& operator<<(ByteBuffer& data, ItemEnchantData const& itemEnchantData)
218{
219 data << int32(itemEnchantData.ID);
220 data << uint32(itemEnchantData.Expiration);
221 data << int32(itemEnchantData.Charges);
222 data << uint8(itemEnchantData.Slot);
223 return data;
224}
225
226ByteBuffer& operator<<(ByteBuffer& data, ItemGemData const& itemGemData)
227{
228 data << uint8(itemGemData.Slot);
229 data << itemGemData.Item;
230 return data;
231}
232
234{
235 data >> itemGemData.Slot;
236 data >> itemGemData.Item;
237 return data;
238}
239
241{
242 data >> BitsSize<2>(invUpdate.Items);
243 data.ResetBitPos();
244 for (InvUpdate::InvItem& item : invUpdate.Items)
245 {
246 data >> item.ContainerSlot;
247 data >> item.Slot;
248 }
249
250 return data;
251}
252
253ByteBuffer& operator<<(ByteBuffer& data, UiEventToast const& uiEventToast)
254{
255 data << int32(uiEventToast.UiEventToastID);
256 data << int32(uiEventToast.Asset);
257
258 return data;
259}
260}
ItemContext
Definition DBCEnums.h:1315
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint16_t uint16
Definition Define.h:155
uint32_t uint32
Definition Define.h:154
ItemModifier
ByteBuffer & operator<<(ByteBuffer &buf, ObjectGuid const &guid)
ByteBuffer & operator>>(ByteBuffer &buf, ObjectGuid &guid)
void append(T value)
Definition ByteBuffer.h:130
void ResetBitPos()
Definition ByteBuffer.h:152
void FlushBits()
Definition ByteBuffer.h:141
Definition Item.h:179
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
Definition Item.h:459
std::vector< int32 > const & GetBonusListIDs() const
Definition Item.h:239
ItemContext GetContext() const
Definition Item.h:451
uint32 GetEntry() const
Definition Object.h:89
void OnInvalidArraySize(std::size_t requestedSize, std::size_t sizeLimit)
OptionalInitWriter< T > OptionalInit(Optional< T > const &value)
std::vector< int32 > BonusListIDs
Definition Loot.h:181
uint32 itemid
Definition Loot.h:178
ItemRandomBonusListId randomBonusListId
Definition Loot.h:180
ItemContext context
Definition Loot.h:182
UpdateFieldArray< uint16, 16, 3, 4 > BonusListIDs
UpdateField< uint8, 0, 2 > Context
UpdateField< int32, 0, 1 > ItemID
std::vector< ItemMod > Modifications
bool operator==(ItemBonuses const &r) const
Optional< ItemBonuses > ItemBonus
void Initialize(::Item const *item)
bool operator==(ItemModList const &r) const
Array< ItemMod, MAX_ITEM_MODIFIERS > Values