/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "AuctionHousePackets.h"
#include "AuctionHouseMgr.h"
#include "DB2Stores.h"
#include "ObjectGuid.h"
#include "PacketOperators.h"
namespace WorldPackets::AuctionHouse
{
AuctionBucketKey& AuctionBucketKey::operator=(AuctionsBucketKey const& key)
{
ItemID = key.ItemId;
ItemLevel = key.ItemLevel;
if (key.BattlePetSpeciesId)
BattlePetSpeciesID = key.BattlePetSpeciesId;
if (key.SuffixItemNameDescriptionId)
ItemSuffix = key.SuffixItemNameDescriptionId;
return *this;
}
ByteBuffer& operator>>(ByteBuffer& data, AuctionBucketKey& itemKey)
{
data.ResetBitPos();
data >> Bits<20>(itemKey.ItemID);
data >> OptionalInit(itemKey.BattlePetSpeciesID);
data >> Bits<11>(itemKey.ItemLevel);
data >> OptionalInit(itemKey.ItemSuffix);
if (itemKey.BattlePetSpeciesID)
data >> *itemKey.BattlePetSpeciesID;
if (itemKey.ItemSuffix)
data >> *itemKey.ItemSuffix;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, AuctionBucketKey const& itemKey)
{
data << Bits<20>(itemKey.ItemID);
data << OptionalInit(itemKey.BattlePetSpeciesID);
data << Bits<11>(itemKey.ItemLevel);
data << OptionalInit(itemKey.ItemSuffix);
data.FlushBits();
if (itemKey.BattlePetSpeciesID)
data << uint16(*itemKey.BattlePetSpeciesID);
if (itemKey.ItemSuffix)
data << uint16(*itemKey.ItemSuffix);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, AuctionListFilterSubClass& filterSubClass)
{
data >> filterSubClass.InvTypeMask;
data >> filterSubClass.ItemSubclass;
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, AuctionListFilterClass& filterClass)
{
data >> filterClass.ItemClass;
data >> BitsSize<5>(filterClass.SubClassFilters);
for (AuctionListFilterSubClass& filterSubClass : filterClass.SubClassFilters)
data >> filterSubClass;
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, AuctionSortDef& sortDef)
{
data.ResetBitPos();
data >> As(sortDef.SortOrder);
data >> Bits<1>(sortDef.ReverseSort);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, AuctionItemForSale& auctionItemForSale)
{
data >> auctionItemForSale.Guid;
data >> auctionItemForSale.UseCount;
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, AuctionFavoriteInfo& favoriteInfo)
{
data >> favoriteInfo.Order;
data >> favoriteInfo.ItemID;
data >> favoriteInfo.ItemLevel;
data >> favoriteInfo.BattlePetSpeciesID;
data >> favoriteInfo.SuffixItemNameDescriptionID;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, AuctionFavoriteInfo const& favoriteInfo)
{
data << uint32(favoriteInfo.Order);
data << uint32(favoriteInfo.ItemID);
data << uint32(favoriteInfo.ItemLevel);
data << uint32(favoriteInfo.BattlePetSpeciesID);
data << uint32(favoriteInfo.SuffixItemNameDescriptionID);
return data;
}
void AuctionOwnerNotification::Initialize(::AuctionPosting const* auction)
{
AuctionID = auction->Id;
Item.Initialize(auction->Items[0]);
BidAmount = auction->BidAmount;
}
ByteBuffer& operator<<(ByteBuffer& data, AuctionOwnerNotification const& ownerNotification)
{
data << int32(ownerNotification.AuctionID);
data << uint64(ownerNotification.BidAmount);
data << ownerNotification.Item;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, BucketInfo const& bucketInfo)
{
data << bucketInfo.Key;
data << int32(bucketInfo.TotalQuantity);
data << int32(bucketInfo.RequiredLevel);
data << uint64(bucketInfo.MinPrice);
data << Size(bucketInfo.ItemModifiedAppearanceIDs);
if (!bucketInfo.ItemModifiedAppearanceIDs.empty())
data.append(bucketInfo.ItemModifiedAppearanceIDs.data(), bucketInfo.ItemModifiedAppearanceIDs.size());
data << OptionalInit(bucketInfo.MaxBattlePetQuality);
data << OptionalInit(bucketInfo.MaxBattlePetLevel);
data << OptionalInit(bucketInfo.BattlePetBreedID);
data << OptionalInit(bucketInfo.BattlePetLevelMask);
data << Bits<1>(bucketInfo.ContainsOwnerItem);
data << Bits<1>(bucketInfo.ContainsOnlyCollectedAppearances);
data.FlushBits();
if (bucketInfo.MaxBattlePetQuality)
data << uint8(*bucketInfo.MaxBattlePetQuality);
if (bucketInfo.MaxBattlePetLevel)
data << uint8(*bucketInfo.MaxBattlePetLevel);
if (bucketInfo.BattlePetBreedID)
data << uint8(*bucketInfo.BattlePetBreedID);
if (bucketInfo.BattlePetLevelMask)
data << uint32(*bucketInfo.BattlePetLevelMask);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, AuctionItem const& auctionItem)
{
data << OptionalInit(auctionItem.Item);
data << BitsSize<4>(auctionItem.Enchantments);
data << BitsSize<2>(auctionItem.Gems);
data << OptionalInit(auctionItem.MinBid);
data << OptionalInit(auctionItem.MinIncrement);
data << OptionalInit(auctionItem.BuyoutPrice);
data << OptionalInit(auctionItem.UnitPrice);
data << Bits<1>(auctionItem.CensorServerSideInfo);
data << Bits<1>(auctionItem.CensorBidInfo);
data << OptionalInit(auctionItem.AuctionBucketKey);
data << OptionalInit(auctionItem.Creator);
if (!auctionItem.CensorBidInfo)
{
data << OptionalInit(auctionItem.Bidder);
data << OptionalInit(auctionItem.BidAmount);
}
data.FlushBits();
if (auctionItem.Item)
data << *auctionItem.Item;
data << int32(auctionItem.Count);
data << int32(auctionItem.Charges);
data << int32(auctionItem.Flags);
data << int32(auctionItem.AuctionID);
data << auctionItem.Owner;
data << int32(auctionItem.DurationLeft);
data << uint8(auctionItem.DeleteReason);
data << uint32(auctionItem.Unused1110);
for (WorldPackets::Item::ItemEnchantData const& enchant : auctionItem.Enchantments)
data << enchant;
if (auctionItem.MinBid)
data << uint64(*auctionItem.MinBid);
if (auctionItem.MinIncrement)
data << uint64(*auctionItem.MinIncrement);
if (auctionItem.BuyoutPrice)
data << uint64(*auctionItem.BuyoutPrice);
if (auctionItem.UnitPrice)
data << uint64(*auctionItem.UnitPrice);
if (!auctionItem.CensorServerSideInfo)
{
data << auctionItem.ItemGuid;
data << auctionItem.OwnerAccountID;
data << int32(auctionItem.EndTime);
}
if (auctionItem.Creator)
data << *auctionItem.Creator;
if (!auctionItem.CensorBidInfo)
{
if (auctionItem.Bidder)
data << *auctionItem.Bidder;
if (auctionItem.BidAmount)
data << uint64(*auctionItem.BidAmount);
}
for (WorldPackets::Item::ItemGemData const& gem : auctionItem.Gems)
data << gem;
if (auctionItem.AuctionBucketKey)
data << *auctionItem.AuctionBucketKey;
return data;
}
void AuctionBidderNotification::Initialize(int32 auctionHouseId, ::AuctionPosting const* auction, ::Item const* item)
{
AuctionHouseID = auctionHouseId;
AuctionID = auction->Id;
Item.Initialize(item);
Bidder = auction->Bidder;
}
ByteBuffer& operator<<(ByteBuffer& data, AuctionBidderNotification const& bidderNotification)
{
data << int32(bidderNotification.AuctionHouseID);
data << int32(bidderNotification.AuctionID);
data << bidderNotification.Bidder;
data << bidderNotification.Item;
return data;
}
void AuctionBrowseQuery::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> Offset;
_worldPacket >> MinLevel;
_worldPacket >> MaxLevel;
_worldPacket >> Unused1007_1;
_worldPacket >> Unused1007_2;
_worldPacket >> As(Filters);
uint32 knownPetsSize = _worldPacket.read();
uint32 const sizeLimit = sBattlePetSpeciesStore.GetNumRows() / (sizeof(decltype(KnownPets)::value_type) * 8) + 1;
if (knownPetsSize >= sizeLimit)
OnInvalidArraySize(knownPetsSize, sizeLimit);
KnownPets.resize(knownPetsSize);
_worldPacket >> MaxPetLevel;
_worldPacket >> Unused1026;
for (uint8& knownPetMask : KnownPets)
_worldPacket >> knownPetMask;
_worldPacket >> OptionalInit(TaintedBy);
_worldPacket >> SizedString::BitsSize<8>(Name);
_worldPacket >> BitsSize<3>(ItemClassFilters);
_worldPacket >> BitsSize<2>(Sorts);
if (TaintedBy)
_worldPacket >> *TaintedBy;
_worldPacket >> SizedString::Data(Name);
for (AuctionListFilterClass& filterClass : ItemClassFilters)
_worldPacket >> filterClass;
for (AuctionSortDef& sortDef : Sorts)
_worldPacket >> sortDef;
}
void AuctionCancelCommoditiesPurchase::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> OptionalInit(TaintedBy);
if (TaintedBy)
_worldPacket >> *TaintedBy;
}
void AuctionConfirmCommoditiesPurchase::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> ItemID;
_worldPacket >> Quantity;
_worldPacket >> OptionalInit(TaintedBy);
if (TaintedBy)
_worldPacket >> *TaintedBy;
}
void AuctionHelloRequest::Read()
{
_worldPacket >> Guid;
}
void AuctionListBiddedItems::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> Offset;
_worldPacket >> OptionalInit(TaintedBy);
_worldPacket >> BitsSize<7>(AuctionIDs);
_worldPacket >> BitsSize<2>(Sorts);
if (TaintedBy)
_worldPacket >> *TaintedBy;
for (uint32& auctionID : AuctionIDs)
_worldPacket >> auctionID;
for (AuctionSortDef& sortDef : Sorts)
_worldPacket >> sortDef;
}
void AuctionListBucketsByBucketKeys::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> OptionalInit(TaintedBy);
_worldPacket >> BitsSize<7>(BucketKeys);
_worldPacket >> BitsSize<2>(Sorts);
if (TaintedBy)
_worldPacket >> *TaintedBy;
for (AuctionBucketKey& bucketKey : BucketKeys)
_worldPacket >> bucketKey;
for (AuctionSortDef& sortDef : Sorts)
_worldPacket >> sortDef;
}
void AuctionListItemsByBucketKey::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> Offset;
_worldPacket >> Unknown830;
_worldPacket >> OptionalInit(TaintedBy);
_worldPacket >> BitsSize<2>(Sorts);
_worldPacket >> BucketKey;
if (TaintedBy)
_worldPacket >> *TaintedBy;
for (AuctionSortDef& sortDef : Sorts)
_worldPacket >> sortDef;
}
void AuctionListItemsByItemID::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> ItemID;
_worldPacket >> SuffixItemNameDescriptionID;
_worldPacket >> Offset;
_worldPacket >> OptionalInit(TaintedBy);
_worldPacket >> BitsSize<2>(Sorts);
if (TaintedBy)
_worldPacket >> *TaintedBy;
for (AuctionSortDef& sortDef : Sorts)
_worldPacket >> sortDef;
}
void AuctionListOwnedItems::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> Offset;
_worldPacket >> OptionalInit(TaintedBy);
_worldPacket >> BitsSize<2>(Sorts);
if (TaintedBy)
_worldPacket >> *TaintedBy;
for (AuctionSortDef& sortDef : Sorts)
_worldPacket >> sortDef;
}
void AuctionPlaceBid::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> AuctionID;
_worldPacket >> BidAmount;
_worldPacket >> OptionalInit(TaintedBy);
if (TaintedBy)
_worldPacket >> *TaintedBy;
}
void AuctionRemoveItem::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> AuctionID;
_worldPacket >> ItemID;
_worldPacket >> OptionalInit(TaintedBy);
if (TaintedBy)
_worldPacket >> *TaintedBy;
}
void AuctionReplicateItems::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> ChangeNumberGlobal;
_worldPacket >> ChangeNumberCursor;
_worldPacket >> ChangeNumberTombstone;
_worldPacket >> Count;
_worldPacket >> OptionalInit(TaintedBy);
if (TaintedBy)
_worldPacket >> *TaintedBy;
}
void AuctionSellCommodity::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> UnitPrice;
_worldPacket >> RunTime;
_worldPacket >> OptionalInit(TaintedBy);
_worldPacket >> BitsSize<6>(Items);
if (TaintedBy)
_worldPacket >> *TaintedBy;
for (AuctionItemForSale& item : Items)
_worldPacket >> item;
}
void AuctionSellItem::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> MinBid;
_worldPacket >> BuyoutPrice;
_worldPacket >> RunTime;
_worldPacket >> OptionalInit(TaintedBy);
_worldPacket >> BitsSize<6>(Items);
if (TaintedBy)
_worldPacket >> *TaintedBy;
for (AuctionItemForSale& item : Items)
_worldPacket >> item;
}
void AuctionSetFavoriteItem::Read()
{
_worldPacket >> Bits<1>(IsNotFavorite);
_worldPacket >> Item;
}
void AuctionGetCommodityQuote::Read()
{
_worldPacket >> Auctioneer;
_worldPacket >> ItemID;
_worldPacket >> Quantity;
_worldPacket >> OptionalInit(TaintedBy);
if (TaintedBy)
_worldPacket >> *TaintedBy;
}
WorldPacket const* AuctionClosedNotification::Write()
{
_worldPacket << Info;
_worldPacket << float(ProceedsMailDelay);
_worldPacket << Bits<1>(Sold);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* AuctionCommandResult::Write()
{
_worldPacket << int32(AuctionID);
_worldPacket << int32(Command);
_worldPacket << int32(ErrorCode);
_worldPacket << int32(BagResult);
_worldPacket << Guid;
_worldPacket << uint64(MinIncrement);
_worldPacket << uint64(Money);
_worldPacket << uint32(DesiredDelay);
return &_worldPacket;
}
WorldPacket const* AuctionGetCommodityQuoteResult::Write()
{
_worldPacket << OptionalInit(TotalPrice);
_worldPacket << OptionalInit(Quantity);
_worldPacket << OptionalInit(QuoteDuration);
_worldPacket << int32(ItemID);
_worldPacket << uint32(DesiredDelay);
if (TotalPrice)
_worldPacket << uint64(*TotalPrice);
if (Quantity)
_worldPacket << uint32(*Quantity);
if (QuoteDuration)
_worldPacket << *QuoteDuration;
return &_worldPacket;
}
WorldPacket const* AuctionFavoriteList::Write()
{
_worldPacket << uint32(DesiredDelay);
_worldPacket << BitsSize<7>(Items);
_worldPacket.FlushBits();
for (AuctionFavoriteInfo const& favoriteInfo : Items)
_worldPacket << favoriteInfo;
return &_worldPacket;
}
WorldPacket const* AuctionHelloResponse::Write()
{
_worldPacket << Auctioneer;
_worldPacket << uint32(PurchaseDeliveryDelay);
_worldPacket << uint32(CancelDeliveryDelay);
_worldPacket << int32(AuctionHouseID);
_worldPacket << Bits<1>(OpenForBusiness);
_worldPacket.FlushBits();
return &_worldPacket;
}
WorldPacket const* AuctionListBiddedItemsResult::Write()
{
_worldPacket << Size(Items);
_worldPacket << uint32(DesiredDelay);
_worldPacket << Bits<1>(HasMoreResults);
_worldPacket.FlushBits();
for (AuctionItem const& item : Items)
_worldPacket << item;
return &_worldPacket;
}
WorldPacket const* AuctionListBucketsResult::Write()
{
_worldPacket << Size(Buckets);
_worldPacket << uint32(DesiredDelay);
_worldPacket << int32(Unknown830_0);
_worldPacket << int32(Unknown830_1);
_worldPacket << Bits<1>(BrowseMode);
_worldPacket << Bits<1>(HasMoreResults);
_worldPacket.FlushBits();
for (BucketInfo const& bucketInfo : Buckets)
_worldPacket << bucketInfo;
return &_worldPacket;
}
WorldPacket const* AuctionListItemsResult::Write()
{
{
_worldPacket << Size(Items);
_worldPacket << uint32(Unknown830);
_worldPacket << uint32(DesiredDelay);
for (AuctionItem const& item : Items)
_worldPacket << item;
}
{
_worldPacket << Bits<2>(ListType);
_worldPacket << Bits<1>(HasMoreResults);
_worldPacket.FlushBits();
_worldPacket << BucketKey;
_worldPacket << uint32(TotalCount);
}
return &_worldPacket;
}
WorldPacket const* AuctionListOwnedItemsResult::Write()
{
_worldPacket << Size(Items);
_worldPacket << Size(SoldItems);
_worldPacket << uint32(DesiredDelay);
_worldPacket << Bits<1>(HasMoreResults);
_worldPacket.FlushBits();
for (AuctionItem const& item : Items)
_worldPacket << item;
for (AuctionItem const& item : SoldItems)
_worldPacket << item;
return &_worldPacket;
}
WorldPacket const* AuctionOutbidNotification::Write()
{
_worldPacket << Info;
_worldPacket << uint64(BidAmount);
_worldPacket << uint64(MinIncrement);
return &_worldPacket;
}
WorldPacket const* AuctionOwnerBidNotification::Write()
{
_worldPacket << Info;
_worldPacket << uint64(MinIncrement);
_worldPacket << Bidder;
return &_worldPacket;
}
WorldPacket const* AuctionReplicateResponse::Write()
{
_worldPacket << uint32(Result);
_worldPacket << uint32(DesiredDelay);
_worldPacket << uint32(ChangeNumberGlobal);
_worldPacket << uint32(ChangeNumberCursor);
_worldPacket << uint32(ChangeNumberTombstone);
_worldPacket << Size(Items);
for (AuctionItem const& item : Items)
_worldPacket << item;
return &_worldPacket;
}
WorldPacket const* AuctionWonNotification::Write()
{
_worldPacket << Info;
return &_worldPacket;
}
}