TrinityCore
AuctionHousePackets.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 "AuctionHousePackets.h"
19#include "AuctionHouseMgr.h"
20#include "DB2Stores.h"
21#include "ObjectGuid.h"
22#include "Util.h"
23
24namespace WorldPackets
25{
26namespace AuctionHouse
27{
29{
30 ItemID = key.ItemId;
31 ItemLevel = key.ItemLevel;
32
33 if (key.BattlePetSpeciesId)
35
38
39 return *this;
40}
41
43{
44 data.ResetBitPos();
45 itemKey.ItemID = data.ReadBits(20);
46
47 if (data.ReadBit())
48 itemKey.BattlePetSpeciesID.emplace();
49
50 itemKey.ItemLevel = data.ReadBits(11);
51
52 if (data.ReadBit())
53 itemKey.SuffixItemNameDescriptionID.emplace();
54
55 if (itemKey.BattlePetSpeciesID)
56 data >> *itemKey.BattlePetSpeciesID;
57
59 data >> *itemKey.SuffixItemNameDescriptionID;
60
61 return data;
62}
63
65{
66 data.WriteBits(itemKey.ItemID, 20);
67 data.WriteBit(itemKey.BattlePetSpeciesID.has_value());
68 data.WriteBits(itemKey.ItemLevel, 11);
69 data.WriteBit(itemKey.SuffixItemNameDescriptionID.has_value());
70 data.FlushBits();
71
72 if (itemKey.BattlePetSpeciesID)
73 data << uint16(*itemKey.BattlePetSpeciesID);
74
76 data << uint16(*itemKey.SuffixItemNameDescriptionID);
77
78 return data;
79}
80
82{
83 data >> filterSubClass.InvTypeMask;
84 data >> filterSubClass.ItemSubclass;
85
86 return data;
87}
88
90{
91 data >> filterClass.ItemClass;
92 filterClass.SubClassFilters.resize(data.ReadBits(5));
93 for (AuctionListFilterSubClass& filterSubClass : filterClass.SubClassFilters)
94 data >> filterSubClass;
95
96 return data;
97}
98
100{
101 data.ResetBitPos();
102 sortDef.SortOrder = static_cast<AuctionHouseSortOrder>(data.ReadBits(4));
103 sortDef.ReverseSort = data.ReadBit();
104
105 return data;
106}
107
109{
110 data >> auctionItemForSale.Guid;
111 data >> auctionItemForSale.UseCount;
112
113 return data;
114}
115
117{
118 data >> favoriteInfo.Order;
119 data >> favoriteInfo.ItemID;
120 data >> favoriteInfo.ItemLevel;
121 data >> favoriteInfo.BattlePetSpeciesID;
122 data >> favoriteInfo.SuffixItemNameDescriptionID;
123
124 return data;
125}
126
128{
129 data << uint32(favoriteInfo.Order);
130 data << uint32(favoriteInfo.ItemID);
131 data << uint32(favoriteInfo.ItemLevel);
132 data << uint32(favoriteInfo.BattlePetSpeciesID);
133 data << uint32(favoriteInfo.SuffixItemNameDescriptionID);
134
135 return data;
136}
137
139{
140 AuctionID = auction->Id;
141 Item.Initialize(auction->Items[0]);
142 BidAmount = auction->BidAmount;
143}
144
146{
147 data << int32(ownerNotification.AuctionID);
148 data << uint64(ownerNotification.BidAmount);
149 data << ownerNotification.Item;
150
151 return data;
152}
153
154ByteBuffer& operator<<(ByteBuffer& data, BucketInfo const& bucketInfo)
155{
156 data << bucketInfo.Key;
157 data << int32(bucketInfo.TotalQuantity);
158 data << int32(bucketInfo.RequiredLevel);
159 data << uint64(bucketInfo.MinPrice);
160 data << uint32(bucketInfo.ItemModifiedAppearanceIDs.size());
161 if (!bucketInfo.ItemModifiedAppearanceIDs.empty())
162 data.append(bucketInfo.ItemModifiedAppearanceIDs.data(), bucketInfo.ItemModifiedAppearanceIDs.size());
163
164 data.WriteBit(bucketInfo.MaxBattlePetQuality.has_value());
165 data.WriteBit(bucketInfo.MaxBattlePetLevel.has_value());
166 data.WriteBit(bucketInfo.BattlePetBreedID.has_value());
167 data.WriteBit(bucketInfo.Unk901_1.has_value());
168 data.WriteBit(bucketInfo.ContainsOwnerItem);
170 data.FlushBits();
171
172 if (bucketInfo.MaxBattlePetQuality)
173 data << uint8(*bucketInfo.MaxBattlePetQuality);
174
175 if (bucketInfo.MaxBattlePetLevel)
176 data << uint8(*bucketInfo.MaxBattlePetLevel);
177
178 if (bucketInfo.BattlePetBreedID)
179 data << uint8(*bucketInfo.BattlePetBreedID);
180
181 if (bucketInfo.Unk901_1)
182 data << uint32(*bucketInfo.Unk901_1);
183
184 return data;
185}
186
187ByteBuffer& operator<<(ByteBuffer& data, AuctionItem const& auctionItem)
188{
189 data.WriteBit(auctionItem.Item.has_value());
190 data.WriteBits(auctionItem.Enchantments.size(), 4);
191 data.WriteBits(auctionItem.Gems.size(), 2);
192 data.WriteBit(auctionItem.MinBid.has_value());
193 data.WriteBit(auctionItem.MinIncrement.has_value());
194 data.WriteBit(auctionItem.BuyoutPrice.has_value());
195 data.WriteBit(auctionItem.UnitPrice.has_value());
196 data.WriteBit(auctionItem.CensorServerSideInfo);
197 data.WriteBit(auctionItem.CensorBidInfo);
198 data.WriteBit(auctionItem.AuctionBucketKey.has_value());
199 data.WriteBit(auctionItem.Creator.has_value());
200 if (!auctionItem.CensorBidInfo)
201 {
202 data.WriteBit(auctionItem.Bidder.has_value());
203 data.WriteBit(auctionItem.BidAmount.has_value());
204 }
205
206 data.FlushBits();
207
208 if (auctionItem.Item)
209 data << *auctionItem.Item;
210
211 data << int32(auctionItem.Count);
212 data << int32(auctionItem.Charges);
213 data << int32(auctionItem.Flags);
214 data << int32(auctionItem.AuctionID);
215 data << auctionItem.Owner;
216 data << int32(auctionItem.DurationLeft);
217 data << uint8(auctionItem.DeleteReason);
218
219 for (WorldPackets::Item::ItemEnchantData const& enchant : auctionItem.Enchantments)
220 data << enchant;
221
222 if (auctionItem.MinBid)
223 data << uint64(*auctionItem.MinBid);
224
225 if (auctionItem.MinIncrement)
226 data << uint64(*auctionItem.MinIncrement);
227
228 if (auctionItem.BuyoutPrice)
229 data << uint64(*auctionItem.BuyoutPrice);
230
231 if (auctionItem.UnitPrice)
232 data << uint64(*auctionItem.UnitPrice);
233
234 if (!auctionItem.CensorServerSideInfo)
235 {
236 data << auctionItem.ItemGuid;
237 data << auctionItem.OwnerAccountID;
238 data << int32(auctionItem.EndTime);
239 }
240
241 if (auctionItem.Creator)
242 data << *auctionItem.Creator;
243
244 if (!auctionItem.CensorBidInfo)
245 {
246 if (auctionItem.Bidder)
247 data << *auctionItem.Bidder;
248
249 if (auctionItem.BidAmount)
250 data << uint64(*auctionItem.BidAmount);
251 }
252
253 for (WorldPackets::Item::ItemGemData const& gem : auctionItem.Gems)
254 data << gem;
255
256 if (auctionItem.AuctionBucketKey)
257 data << *auctionItem.AuctionBucketKey;
258
259 return data;
260}
261
263{
264 AuctionID = auction->Id;
265 Item.Initialize(item);
266 Bidder = auction->Bidder;
267}
268
270{
271 data << int32(bidderNotification.AuctionID);
272 data << bidderNotification.Bidder;
273 data << bidderNotification.Item;
274 return data;
275}
276
278{
286
287 uint32 knownPetsSize = _worldPacket.read<uint32>();
288 uint32 const sizeLimit = sBattlePetSpeciesStore.GetNumRows() / (sizeof(decltype(KnownPets)::value_type) * 8) + 1;
289 if (knownPetsSize >= sizeLimit)
290 throw PacketArrayMaxCapacityException(knownPetsSize, sizeLimit);
291
292 KnownPets.resize(knownPetsSize);
294 for (uint8& knownPetMask : KnownPets)
295 _worldPacket >> knownPetMask;
296
297 if (_worldPacket.ReadBit())
298 TaintedBy.emplace();
299
300 uint32 nameLength = _worldPacket.ReadBits(8);
302 Sorts.resize(_worldPacket.ReadBits(2));
303
304 for (AuctionSortDef& sortDef : Sorts)
305 _worldPacket >> sortDef;
306
307 if (TaintedBy)
309
310 Name = _worldPacket.ReadString(nameLength);
311 for (AuctionListFilterClass& filterClass : ItemClassFilters)
312 _worldPacket >> filterClass;
313}
314
316{
318 if (_worldPacket.ReadBit())
319 {
320 TaintedBy.emplace();
322 }
323}
324
326{
330 if (_worldPacket.ReadBit())
331 {
332 TaintedBy.emplace();
334 }
335}
336
338{
340}
341
343{
346
347 if (_worldPacket.ReadBit())
348 TaintedBy.emplace();
349
351 Sorts.resize(_worldPacket.ReadBits(2));
352
353 for (AuctionSortDef& sortDef : Sorts)
354 _worldPacket >> sortDef;
355
356 if (TaintedBy)
358
359 for (uint32& auctionID : AuctionIDs)
360 _worldPacket >> auctionID;
361}
362
364{
366
367 if (_worldPacket.ReadBit())
368 TaintedBy.emplace();
369
371 Sorts.resize(_worldPacket.ReadBits(2));
372
373 for (AuctionSortDef& sortDef : Sorts)
374 _worldPacket >> sortDef;
375
376 if (TaintedBy)
378
379 for (AuctionBucketKey& bucketKey : BucketKeys)
380 _worldPacket >> bucketKey;
381}
382
384{
388
389 if (_worldPacket.ReadBit())
390 TaintedBy.emplace();
391
392 Sorts.resize(_worldPacket.ReadBits(2));
393
394 for (AuctionSortDef& sortDef : Sorts)
395 _worldPacket >> sortDef;
396
398
399 if (TaintedBy)
401}
402
404{
409
410 if (_worldPacket.ReadBit())
411 TaintedBy.emplace();
412
413 Sorts.resize(_worldPacket.ReadBits(2));
414
415 for (AuctionSortDef& sortDef : Sorts)
416 _worldPacket >> sortDef;
417
418 if (TaintedBy)
420}
421
423{
426
427 if (_worldPacket.ReadBit())
428 TaintedBy.emplace();
429
430 Sorts.resize(_worldPacket.ReadBits(2));
431
432 for (AuctionSortDef& sortDef : Sorts)
433 _worldPacket >> sortDef;
434
435 if (TaintedBy)
437}
438
440{
444 if (_worldPacket.ReadBit())
445 {
446 TaintedBy.emplace();
448 }
449}
450
452{
456 if (_worldPacket.ReadBit())
457 {
458 TaintedBy.emplace();
460 }
461}
462
464{
470 if (_worldPacket.ReadBit())
471 {
472 TaintedBy.emplace();
474 }
475}
476
478{
482
483 if (_worldPacket.ReadBit())
484 TaintedBy.emplace();
485
486 Items.resize(_worldPacket.ReadBits(6));
487
488 if (TaintedBy)
490
491 for (AuctionItemForSale& item : Items)
492 _worldPacket >> item;
493}
494
496{
501
502 if (_worldPacket.ReadBit())
503 TaintedBy.emplace();
504
505 Items.resize(_worldPacket.ReadBits(6));
506
507 if (TaintedBy)
509
510 for (AuctionItemForSale& item : Items)
511 _worldPacket >> item;
512}
513
515{
518}
519
521{
525 if (_worldPacket.ReadBit())
526 {
527 TaintedBy.emplace();
529 }
530}
531
533{
538
539 return &_worldPacket;
540}
541
543{
552
553 return &_worldPacket;
554}
555
557{
558 _worldPacket.WriteBit(TotalPrice.has_value());
559 _worldPacket.WriteBit(Quantity.has_value());
563
564 if (TotalPrice)
566
567 if (Quantity)
569
570 if (QuoteDuration)
572
573 return &_worldPacket;
574}
575
577{
579 _worldPacket.WriteBits(Items.size(), 7);
581
582 for (AuctionFavoriteInfo const& favoriteInfo : Items)
583 _worldPacket << favoriteInfo;
584
585 return &_worldPacket;
586}
587
589{
595
596 return &_worldPacket;
597}
598
600{
601 _worldPacket << uint32(Items.size());
605
606 for (AuctionItem const& item : Items)
607 _worldPacket << item;
608
609 return &_worldPacket;
610}
611
613{
614 _worldPacket << uint32(Buckets.size());
621
622 for (BucketInfo const& bucketInfo : Buckets)
623 _worldPacket << bucketInfo;
624
625 return &_worldPacket;
626}
627
629{
630 _worldPacket << uint32(Items.size());
637
639
640 for (AuctionItem const& item : Items)
641 _worldPacket << item;
642
643 return &_worldPacket;
644}
645
647{
648 _worldPacket << int32(Items.size());
649 _worldPacket << int32(SoldItems.size());
653
654 for (AuctionItem const& item : Items)
655 _worldPacket << item;
656
657 for (AuctionItem const& item : SoldItems)
658 _worldPacket << item;
659
660 return &_worldPacket;
661}
662
664{
668
669 return &_worldPacket;
670}
671
673{
677
678 return &_worldPacket;
679}
680
682{
688 _worldPacket << uint32(Items.size());
689
690 for (AuctionItem const& item : Items)
691 _worldPacket << item;
692
693 return &_worldPacket;
694}
695
697{
699
700 return &_worldPacket;
701}
702}
703}
AuctionHouseSortOrder
AuctionHouseFilterMask
DB2Storage< BattlePetSpeciesEntry > sBattlePetSpeciesStore("BattlePetSpecies.db2", &BattlePetSpeciesLoadInfo::Instance)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:491
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
std::string ReadString(uint32 length, bool requireValidUtf8=true)
Definition: ByteBuffer.cpp:78
bool ReadBit()
Definition: ByteBuffer.h:191
Definition: Item.h:170
void resize(size_type newSize)
Array< AuctionListFilterClass, 7 > ItemClassFilters
uint64 Money
the amount of money that the player bid in copper
uint64 MinIncrement
the sum of outbid is (1% of current bid) * 5, if the bid is too small, then this value is 1 copper.
int32 BagResult
the bid error. Possible values are AuctionError
ObjectGuid Guid
the GUID of the bidder for this auction.
int32 ErrorCode
the error code that was generated when trying to perform the action. Possible values are AuctionError
int32 AuctionID
the id of the auction that triggered this notification
int32 Command
the type of action that triggered this notification. Possible values are AuctionAction
WorldPacket _worldPacket
Definition: Packet.h:43
ByteBuffer & operator>>(ByteBuffer &data, AuctionBucketKey &itemKey)
ByteBuffer & operator<<(ByteBuffer &data, AuctionBucketKey const &itemKey)
ObjectGuid Bidder
std::vector< Item * > Items
uint16 SuffixItemNameDescriptionId
void Initialize(::AuctionPosting const *auction, ::Item const *item)
AuctionBucketKey & operator=(AuctionsBucketKey const &key)
std::vector< Item::ItemGemData > Gems
Optional< WorldPackets::AuctionHouse::AuctionBucketKey > AuctionBucketKey
std::vector< Item::ItemEnchantData > Enchantments
Optional< Item::ItemInstance > Item
Array< AuctionListFilterSubClass, 31 > SubClassFilters