TrinityCore
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 "Player.h"
22
23namespace WorldPackets::Item
24{
26{
27 if (Context != r.Context)
28 return false;
29
30 if (BonusListIDs.size() != r.BonusListIDs.size())
31 return false;
32
33 return std::is_permutation(BonusListIDs.begin(), BonusListIDs.end(), r.BonusListIDs.begin());
34}
35
36bool ItemMod::operator==(ItemMod const& r) const
37{
38 return Value == r.Value && Type == r.Type;
39}
40
42{
43 if (Values.size() != r.Values.size())
44 return false;
45
46 return std::is_permutation(Values.begin(), Values.end(), r.Values.begin());
47}
48
50{
51 ItemID = item->GetEntry();
52 std::vector<int32> const& bonusListIds = item->GetBonusListIDs();
53 if (!bonusListIds.empty())
54 {
55 ItemBonus.emplace();
56 ItemBonus->BonusListIDs.insert(ItemBonus->BonusListIDs.end(), bonusListIds.begin(), bonusListIds.end());
57 ItemBonus->Context = item->GetContext();
58 }
59
60 for (UF::ItemMod mod : item->m_itemData->Modifiers->Values)
61 Modifications.Values.emplace_back(mod.Value, ItemModifier(mod.Type));
62}
63
65{
66 ItemID = gem->ItemID;
67
68 ItemBonuses bonus;
69 bonus.Context = ItemContext(*gem->Context);
70 for (uint16 bonusListId : gem->BonusListIDs)
71 if (bonusListId)
72 bonus.BonusListIDs.push_back(bonusListId);
73
74 if (bonus.Context != ItemContext::NONE || !bonus.BonusListIDs.empty())
75 ItemBonus = bonus;
76}
77
79{
80 ItemID = lootItem.itemid;
81
82 if (!lootItem.BonusListIDs.empty() || lootItem.randomBonusListId)
83 {
84 ItemBonus.emplace();
85 ItemBonus->BonusListIDs = lootItem.BonusListIDs;
86 ItemBonus->Context = lootItem.context;
87 if (lootItem.randomBonusListId)
88 ItemBonus->BonusListIDs.push_back(lootItem.randomBonusListId);
89 }
90}
91
93{
94 ItemID = voidItem->ItemEntry;
95
96 if (voidItem->FixedScalingLevel)
98
99 if (voidItem->ArtifactKnowledgeLevel)
101
102 if (!voidItem->BonusListIDs.empty())
103 {
104 ItemBonus.emplace();
105 ItemBonus->Context = voidItem->Context;
106 ItemBonus->BonusListIDs = voidItem->BonusListIDs;
107 }
108}
109
111{
112 if (ItemID != r.ItemID)
113 return false;
114
115 if (ItemBonus != r.ItemBonus)
116 return false;
117
119 return false;
120
121 return true;
122}
123
125{
126 if (ItemID != right.ItemID)
127 return false;
128
129 if (BonusListIDs != right.BonusListIDs)
130 return false;
131
132 if (Modifications != right.Modifications)
133 return false;
134
135 return true;
136}
137
138ByteBuffer& operator<<(ByteBuffer& data, ItemBonuses const& itemBonusInstanceData)
139{
140 data << uint8(itemBonusInstanceData.Context);
141 data << uint32(itemBonusInstanceData.BonusListIDs.size());
142 for (uint32 bonusID : itemBonusInstanceData.BonusListIDs)
143 data << uint32(bonusID);
144
145 return data;
146}
147
148ByteBuffer& operator>>(ByteBuffer& data, ItemBonuses& itemBonusInstanceData)
149{
150 uint32 bonusListIdSize;
151
152 itemBonusInstanceData.Context = data.read<ItemContext>();
153 data >> bonusListIdSize;
154
155 for (uint32 i = 0u; i < bonusListIdSize; ++i)
156 {
157 uint32 bonusId;
158 data >> bonusId;
159 itemBonusInstanceData.BonusListIDs.push_back(bonusId);
160 }
161
162 return data;
163}
164
166{
167 data << int32(itemMod.Value);
168 data << uint8(itemMod.Type);
169
170 return data;
171}
172
174{
175 data >> itemMod.Value;
176 itemMod.Type = data.read<ItemModifier, uint8>();
177
178 return data;
179}
180
181ByteBuffer& operator<<(ByteBuffer& data, ItemModList const& itemModList)
182{
183 data.WriteBits(itemModList.Values.size(), 6);
184 data.FlushBits();
185
186 for (ItemMod const& itemMod : itemModList.Values)
187 data << itemMod;
188
189 return data;
190}
191
193{
194 itemModList.Values.resize(data.ReadBits(6));
195 data.ResetBitPos();
196
197 for (ItemMod& itemMod : itemModList.Values)
198 data >> itemMod;
199
200 return data;
201}
202
203ByteBuffer& operator<<(ByteBuffer& data, ItemInstance const& itemInstance)
204{
205 data << int32(itemInstance.ItemID);
206
207 data.WriteBit(itemInstance.ItemBonus.has_value());
208 data.FlushBits();
209
210 data << itemInstance.Modifications;
211
212 if (itemInstance.ItemBonus)
213 data << *itemInstance.ItemBonus;
214
215 return data;
216}
217
219{
220 data >> itemInstance.ItemID;
221
222 bool hasItemBonus = data.ReadBit();
223 data.ResetBitPos();
224
225 data >> itemInstance.Modifications;
226
227 if (hasItemBonus)
228 {
229 itemInstance.ItemBonus.emplace();
230 data >> *itemInstance.ItemBonus;
231 }
232
233 return data;
234}
235
236ByteBuffer& operator<<(ByteBuffer& data, ItemBonusKey const& itemBonusKey)
237{
238 data << int32(itemBonusKey.ItemID);
239 data << uint32(itemBonusKey.BonusListIDs.size());
240 data << uint32(itemBonusKey.Modifications.size());
241
242 if (!itemBonusKey.BonusListIDs.empty())
243 data.append(itemBonusKey.BonusListIDs.data(), itemBonusKey.BonusListIDs.size());
244
245 for (ItemMod const& modification : itemBonusKey.Modifications)
246 data << modification;
247
248 return data;
249}
250
251ByteBuffer& operator<<(ByteBuffer& data, ItemEnchantData const& itemEnchantData)
252{
253 data << int32(itemEnchantData.ID);
254 data << uint32(itemEnchantData.Expiration);
255 data << int32(itemEnchantData.Charges);
256 data << uint8(itemEnchantData.Slot);
257 return data;
258}
259
260ByteBuffer& operator<<(ByteBuffer& data, ItemGemData const& itemGemData)
261{
262 data << uint8(itemGemData.Slot);
263 data << itemGemData.Item;
264 return data;
265}
266
268{
269 data >> itemGemData.Slot;
270 data >> itemGemData.Item;
271 return data;
272}
273
275{
276 invUpdate.Items.resize(data.ReadBits(2));
277 data.ResetBitPos();
278 for (InvUpdate::InvItem& item : invUpdate.Items)
279 {
280 data >> item.ContainerSlot;
281 data >> item.Slot;
282 }
283
284 return data;
285}
286
287ByteBuffer& operator<<(ByteBuffer& data, UiEventToast const& uiEventToast)
288{
289 data << int32(uiEventToast.UiEventToastID);
290 data << int32(uiEventToast.Asset);
291
292 return data;
293}
294}
ItemContext
Definition: DBCEnums.h:1063
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
ItemModifier
Definition: ItemDefines.h:210
@ ITEM_MODIFIER_TIMEWALKER_LEVEL
Definition: ItemDefines.h:220
@ ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL
Definition: ItemDefines.h:234
uint32 ReadBits(int32 bits)
Definition: ByteBuffer.h:209
void append(T value)
Definition: ByteBuffer.h:143
void ResetBitPos()
Definition: ByteBuffer.h:166
bool WriteBit(bool bit)
Definition: ByteBuffer.h:175
void WriteBits(std::size_t value, int32 bits)
Definition: ByteBuffer.h:203
void FlushBits()
Definition: ByteBuffer.h:155
bool ReadBit()
Definition: ByteBuffer.h:191
Definition: Item.h:170
std::vector< int32 > const & GetBonusListIDs() const
Definition: Item.h:229
ItemContext GetContext() const
Definition: Item.h:441
UF::UpdateField< UF::ItemData, 0, TYPEID_ITEM > m_itemData
Definition: Item.h:449
uint32 GetEntry() const
Definition: Object.h:161
ByteBuffer & operator<<(ByteBuffer &data, ItemBonuses const &itemBonusInstanceData)
ByteBuffer & operator>>(ByteBuffer &data, ItemBonuses &itemBonusInstanceData)
Definition: Loot.h:176
std::vector< int32 > BonusListIDs
Definition: Loot.h:180
uint32 itemid
Definition: Loot.h:177
ItemRandomBonusListId randomBonusListId
Definition: Loot.h:179
ItemContext context
Definition: Loot.h:181
UpdateFieldArray< uint16, 16, 3, 4 > BonusListIDs
Definition: UpdateFields.h:111
UpdateField< uint8, 0, 2 > Context
Definition: UpdateFields.h:110
UpdateField< int32, 0, 1 > ItemID
Definition: UpdateFields.h:109
ItemContext Context
Definition: Player.h:1040
uint32 ArtifactKnowledgeLevel
Definition: Player.h:1039
std::vector< int32 > BonusListIDs
Definition: Player.h:1041
uint32 ItemEntry
Definition: Player.h:1035
uint32 FixedScalingLevel
Definition: Player.h:1038
std::vector< InvItem > Items
bool operator==(ItemBonusKey const &right) const
std::vector< ItemMod > Modifications
bool operator==(ItemBonuses const &r) const
std::vector< int32 > BonusListIDs
Optional< ItemBonuses > ItemBonus
bool operator==(ItemInstance const &r) const
void Initialize(::Item const *item)
bool operator==(ItemModList const &r) const
Array< ItemMod, MAX_ITEM_MODIFIERS > Values
bool operator==(ItemMod const &r) const