diff --git a/Source/Game/AuctionHouse/AuctionManager.cs b/Source/Game/AuctionHouse/AuctionManager.cs index 1f5d2c0c2..7f5d75c9c 100644 --- a/Source/Game/AuctionHouse/AuctionManager.cs +++ b/Source/Game/AuctionHouse/AuctionManager.cs @@ -363,7 +363,7 @@ namespace Game public AuctionHouseRecord GetAuctionHouseEntry(uint factionTemplateId, ref uint houseId) { - uint houseid = 7; // goblin auction house + uint houseid = 1; // Auction House if (!WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionAuction)) { @@ -372,27 +372,26 @@ namespace Game // but no easy way convert creature faction to player race faction for specific city switch (factionTemplateId) { - case 12: houseid = 1; break; // human - case 29: houseid = 6; break; // orc, and generic for horde - case 55: houseid = 2; break; // dwarf, and generic for alliance - case 68: houseid = 4; break; // undead - case 80: houseid = 3; break; // n-elf - case 104: houseid = 5; break; // trolls - case 120: houseid = 7; break; // booty bay, neutral - case 474: houseid = 7; break; // gadgetzan, neutral - case 855: houseid = 7; break; // everlook, neutral - case 1604: houseid = 6; break; // b-elfs, - default: // for unknown case + case 120: + houseid = 7; + break; // booty bay, Blackwater Auction House + case 474: + houseid = 7; + break; // gadgetzan, Blackwater Auction House + case 855: + houseid = 7; + break; // everlook, Blackwater Auction House + default: // default { FactionTemplateRecord u_entry = CliDB.FactionTemplateStorage.LookupByKey(factionTemplateId); if (u_entry == null) - houseid = 7; // goblin auction house + houseid = 1; // Auction House else if ((u_entry.FactionGroup & (int)FactionMasks.Alliance) != 0) - houseid = 1; // human auction house + houseid = 2; // Alliance Auction House else if ((u_entry.FactionGroup & (int)FactionMasks.Horde) != 0) - houseid = 6; // orc auction house + houseid = 6; // Horde Auction House else - houseid = 7; // goblin auction house + houseid = 1; // Auction House break; } } @@ -476,31 +475,25 @@ namespace Game DB.Characters.CommitTransaction(trans); } - public void BuildListBidderItems(AuctionListBidderItemsResult packet, Player player, ref uint totalcount) + public void BuildListBidderItems(AuctionListBidderItemsResult packet, Player player) { foreach (var Aentry in AuctionsMap.Values) { if (Aentry != null && Aentry.bidder == player.GetGUID().GetCounter()) - { Aentry.BuildAuctionInfo(packet.Items, false); - ++totalcount; - } } } - public void BuildListOwnerItems(AuctionListOwnerItemsResult packet, Player player, ref uint totalcount) + public void BuildListOwnerItems(AuctionListOwnerItemsResult packet, Player player) { foreach (var Aentry in AuctionsMap.Values) { if (Aentry != null && Aentry.owner == player.GetGUID().GetCounter()) - { Aentry.BuildAuctionInfo(packet.Items, false); - ++totalcount; - } } } - public void BuildListAuctionItems(AuctionListItemsResult packet, Player player, string searchedname, uint listfrom, byte levelmin, byte levelmax, bool usable, Optional filters, uint quality) + public void BuildListAuctionItems(AuctionListItemsResult packet, Player player, string searchedname, uint listfrom, byte levelmin, byte levelmax, AuctionHouseFilterMask filters, Optional classFilters) { long curTime = GameTime.GetGameTime(); @@ -515,32 +508,32 @@ namespace Game continue; ItemTemplate proto = item.GetTemplate(); - if (filters.HasValue) + if (classFilters.HasValue) { // if we dont want any class filters, Optional is not initialized // if we dont want this class included, SubclassMask is set to FILTER_SKIP_CLASS // if we want this class and did not specify and subclasses, its set to FILTER_SKIP_SUBCLASS // otherwise full restrictions apply - if (filters.Value.Classes[(int)proto.GetClass()].SubclassMask == AuctionSearchFilters.FilterType.SkipClass) + if (classFilters.Value.Classes[(int)proto.GetClass()].SubclassMask == AuctionSearchClassFilters.FilterType.SkipClass) continue; - if (filters.Value.Classes[(int)proto.GetClass()].SubclassMask != AuctionSearchFilters.FilterType.SkipSubclass) + if (classFilters.Value.Classes[(int)proto.GetClass()].SubclassMask != AuctionSearchClassFilters.FilterType.SkipSubclass) { - if (!Convert.ToBoolean((int)filters.Value.Classes[(int)proto.GetClass()].SubclassMask & (1u << (int)proto.GetSubClass()))) + if (!Convert.ToBoolean((int)classFilters.Value.Classes[(int)proto.GetClass()].SubclassMask & (1u << (int)proto.GetSubClass()))) continue; - if (!Convert.ToBoolean(filters.Value.Classes[(int)proto.GetClass()].InvTypes[(int)proto.GetSubClass()] & (1u << (int)proto.GetInventoryType()))) + if (!Convert.ToBoolean(classFilters.Value.Classes[(int)proto.GetClass()].InvTypes[(int)proto.GetSubClass()] & (1u << (int)proto.GetInventoryType()))) continue; } } - if (quality != 0xffffffff && (uint)proto.GetQuality() != quality) + if (!filters.HasFlag((AuctionHouseFilterMask)(1 << ((int)proto.GetQuality() + 4)))) continue; if (levelmin != 0 && (item.GetRequiredLevel() < levelmin || (levelmax != 0 && item.GetRequiredLevel() > levelmax))) continue; - if (usable && player.CanUseItem(item) != InventoryResult.Ok) + if (filters.HasFlag(AuctionHouseFilterMask.UsableOnly) && player.CanUseItem(item) != InventoryResult.Ok) continue; // Allow search by suffix (ie: of the Monkey) or partial name (ie: Monkey) @@ -580,7 +573,7 @@ namespace Game } AuctionItem auctionItem = new AuctionItem(); - auctionItem.AuctionItemID = (int)Id; + auctionItem.AuctionID = (int)Id; auctionItem.Item = new ItemInstance(item); auctionItem.BuyoutPrice = buyout; auctionItem.CensorBidInfo = false; @@ -786,7 +779,7 @@ namespace Game public uint factionTemplateId; } - public class AuctionSearchFilters + public class AuctionSearchClassFilters { public enum FilterType : uint { diff --git a/Source/Game/Handlers/AuctionHandler.cs b/Source/Game/Handlers/AuctionHandler.cs index d8525ba84..641410419 100644 --- a/Source/Game/Handlers/AuctionHandler.cs +++ b/Source/Game/Handlers/AuctionHandler.cs @@ -69,14 +69,14 @@ namespace Game { AuctionCommandResult auctionCommandResult = new AuctionCommandResult(); auctionCommandResult.InitializeAuction(auction); - auctionCommandResult.Command = action; - auctionCommandResult.ErrorCode = errorCode; + auctionCommandResult.Command = (int)action; + auctionCommandResult.ErrorCode = (int)errorCode; SendPacket(auctionCommandResult); } public void SendAuctionOutBidNotification(AuctionEntry auction, Item item) { - AuctionOutBidNotification packet = new AuctionOutBidNotification(); + AuctionOutbidNotification packet = new AuctionOutbidNotification(); packet.BidAmount = auction.bid; packet.MinIncrement = auction.GetAuctionOutBid(); packet.Info.Initialize(auction, item); @@ -223,7 +223,7 @@ namespace Game ulong deposit = Global.AuctionMgr.GetAuctionDeposit(auctionHouseEntry, packet.RunTime, item, finalCount); if (!GetPlayer().HasEnoughMoney(deposit)) { - SendAuctionCommandResult(null, AuctionAction.SellItem, AuctionError.NotEnoughtMoney); + SendAuctionCommandResult(null, AuctionAction.SellItem, AuctionError.NotEnoughMoney); return; } @@ -355,7 +355,7 @@ namespace Game [WorldPacketHandler(ClientOpcodes.AuctionPlaceBid)] void HandleAuctionPlaceBid(AuctionPlaceBid packet) { - if (packet.AuctionItemID == 0 || packet.BidAmount == 0) + if (packet.AuctionID == 0 || packet.BidAmount == 0) return; // check for cheaters Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); @@ -371,7 +371,7 @@ namespace Game AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); - AuctionEntry auction = auctionHouse.GetAuction(packet.AuctionItemID); + AuctionEntry auction = auctionHouse.GetAuction(packet.AuctionID); Player player = GetPlayer(); if (auction == null || auction.owner == player.GetGUID().GetCounter()) @@ -406,7 +406,7 @@ namespace Game if (!player.HasEnoughMoney(packet.BidAmount)) { // client already test it but just in case ... - SendAuctionCommandResult(auction, AuctionAction.PlaceBid, AuctionError.NotEnoughtMoney); + SendAuctionCommandResult(auction, AuctionAction.PlaceBid, AuctionError.NotEnoughMoney); return; } @@ -493,7 +493,7 @@ namespace Game AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); - AuctionEntry auction = auctionHouse.GetAuction((uint)packet.AuctionItemID); + AuctionEntry auction = auctionHouse.GetAuction((uint)packet.AuctionID); Player player = GetPlayer(); SQLTransaction trans = new SQLTransaction(); @@ -527,7 +527,7 @@ namespace Game { SendAuctionCommandResult(null, AuctionAction.Cancel, AuctionError.DatabaseError); //this code isn't possible ... maybe there should be assert - Log.outError(LogFilter.Network, "CHEATER: {0} tried to cancel auction (id: {1}) of another player or auction is null", player.GetGUID().ToString(), packet.AuctionItemID); + Log.outError(LogFilter.Network, "CHEATER: {0} tried to cancel auction (id: {1}) of another player or auction is null", player.GetGUID().ToString(), packet.AuctionID); return; } @@ -562,7 +562,7 @@ namespace Game AuctionListBidderItemsResult result = new AuctionListBidderItemsResult(); Player player = GetPlayer(); - auctionHouse.BuildListBidderItems(result, player, ref result.TotalCount); + auctionHouse.BuildListBidderItems(result, player); result.DesiredDelay = 300; SendPacket(result); } @@ -585,18 +585,18 @@ namespace Game AuctionListOwnerItemsResult result = new AuctionListOwnerItemsResult(); - auctionHouse.BuildListOwnerItems(result, GetPlayer(), ref result.TotalCount); + auctionHouse.BuildListOwnerItems(result, GetPlayer()); result.DesiredDelay = 300; SendPacket(result); } - //[WorldPacketHandler(ClientOpcodes.AuctionListItems)] - void HandleAuctionListItems(AuctionListItems packet) + [WorldPacketHandler(ClientOpcodes.AuctionBrowseQuery)] + void HandleAuctionListItems(AuctionBrowseQuery browseQuery) { - Creature creature = GetPlayer().GetNPCIfCanInteractWith(packet.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); + Creature creature = GetPlayer().GetNPCIfCanInteractWith(browseQuery.Auctioneer, NPCFlags.Auctioneer, NPCFlags2.None); if (!creature) { - Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionListItems - {0} not found or you can't interact with him.", packet.Auctioneer.ToString()); + Log.outDebug(LogFilter.Network, "WORLD: HandleAuctionListItems - {0} not found or you can't interact with him.", browseQuery.Auctioneer.ToString()); return; } @@ -606,41 +606,32 @@ namespace Game AuctionHouseObject auctionHouse = Global.AuctionMgr.GetAuctionsMap(creature.GetFaction()); - - Optional filters = new Optional(); + Optional classFilters = new Optional(); AuctionListItemsResult result = new AuctionListItemsResult(); - if (!packet.ClassFilters.Empty()) + if (!browseQuery.ItemClassFilters.Empty()) { - filters.HasValue = true; + classFilters.HasValue = true; - foreach (var classFilter in packet.ClassFilters) + foreach (var classFilter in browseQuery.ItemClassFilters) { if (!classFilter.SubClassFilters.Empty()) { foreach (var subClassFilter in classFilter.SubClassFilters) { - filters.Value.Classes[classFilter.ItemClass].SubclassMask |= (AuctionSearchFilters.FilterType)(1 << subClassFilter.ItemSubclass); - filters.Value.Classes[classFilter.ItemClass].InvTypes[subClassFilter.ItemSubclass] = subClassFilter.InvTypeMask; + classFilters.Value.Classes[classFilter.ItemClass].SubclassMask |= (AuctionSearchClassFilters.FilterType)(1 << subClassFilter.ItemSubclass); + if (subClassFilter.ItemSubclass < ItemConst.MaxItemSubclassTotal) + classFilters.Value.Classes[classFilter.ItemClass].InvTypes[subClassFilter.ItemSubclass] = subClassFilter.InvTypeMask; } } else - filters.Value.Classes[classFilter.ItemClass].SubclassMask = AuctionSearchFilters.FilterType.SkipSubclass; + classFilters.Value.Classes[classFilter.ItemClass].SubclassMask = AuctionSearchClassFilters.FilterType.SkipSubclass; } } - auctionHouse.BuildListAuctionItems(result, GetPlayer(), packet.Name.ToLower(), packet.Offset, packet.MinLevel, packet.MaxLevel, packet.OnlyUsable, filters, packet.Quality); + auctionHouse.BuildListAuctionItems(result, GetPlayer(), browseQuery.Name.ToLower(), browseQuery.Offset, browseQuery.MinLevel, browseQuery.MaxLevel, browseQuery.Filters, classFilters); result.DesiredDelay = WorldConfig.GetUIntValue(WorldCfg.AuctionSearchDelay); - result.OnlyUsable = packet.OnlyUsable; - SendPacket(result); - } - - //[WorldPacketHandler(ClientOpcodes.AuctionListPendingSales)] - void HandleAuctionListPendingSales(AuctionListPendingSales packet) - { - AuctionListPendingSalesResult result = new AuctionListPendingSalesResult(); - result.TotalNumRecords = 0; SendPacket(result); } diff --git a/Source/Game/Network/Packets/AddonPackets.cs b/Source/Game/Network/Packets/AddonPackets.cs new file mode 100644 index 000000000..661f0371f --- /dev/null +++ b/Source/Game/Network/Packets/AddonPackets.cs @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2012-2020 CypherCore + * + * 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 3 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 . + */ + +using Framework.Constants; +using Game.Entities; +using System; +using System.Collections.Generic; +using Framework.Dynamic; + +namespace Game.Network.Packets +{ + public struct AddOnInfo + { + public string Name; + public string Version; + public bool Loaded; + public bool Enabled; + + public void Read(WorldPacket data) + { + uint nameLength = data.ReadBits(10); + uint versionLength = data.ReadBits(10); + Loaded = data.HasBit(); + Enabled = data.HasBit(); + if (nameLength > 1) + { + Name = data.ReadString(nameLength - 1); + data.ReadUInt8(); // null terminator + } + if (versionLength > 1) + { + Version = data.ReadString(versionLength - 1); + data.ReadUInt8(); // null terminator + } + } + } +} diff --git a/Source/Game/Network/Packets/AuctionHousePackets.cs b/Source/Game/Network/Packets/AuctionHousePackets.cs index 679770d39..484e3d584 100644 --- a/Source/Game/Network/Packets/AuctionHousePackets.cs +++ b/Source/Game/Network/Packets/AuctionHousePackets.cs @@ -18,73 +18,354 @@ using Framework.Constants; using Game.Entities; using System.Collections.Generic; +using Framework.Dynamic; namespace Game.Network.Packets { + class AuctionBrowseQuery : ClientPacket + { + public ObjectGuid Auctioneer; + public uint Offset; + public byte MinLevel = 1; + public byte MaxLevel = SharedConst.MaxLevel; + public AuctionHouseFilterMask Filters; + public Array KnownPets = new Array(SharedConst.MaxBattlePetSpeciesId / 8 + 1); + public sbyte MaxPetLevel; + public Optional TaintedBy; + public string Name; + public Array ItemClassFilters = new Array(7); + public Array Sorts = new Array(2); + + public AuctionBrowseQuery(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + Offset = _worldPacket.ReadUInt8(); + MinLevel = _worldPacket.ReadUInt8(); + MaxLevel = _worldPacket.ReadUInt8(); + Filters = (AuctionHouseFilterMask)_worldPacket.ReadUInt32(); + uint knownPetSize = _worldPacket.ReadUInt32(); + MaxPetLevel = _worldPacket.ReadInt8(); + for (var i = 0; i < knownPetSize; ++i) + KnownPets[i] = _worldPacket.ReadUInt8(); + + if (_worldPacket.HasBit()) + TaintedBy.HasValue = true; + + uint nameLength = _worldPacket.ReadBits(8); + uint itemClassFilterCount = _worldPacket.ReadBits(3); + uint sortSize = _worldPacket.ReadBits(2); + + for (var i = 0; i < sortSize; ++i) + Sorts[i] = new AuctionSortDef(_worldPacket); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + + Name = _worldPacket.ReadString(nameLength); + for (var i = 0; i < itemClassFilterCount; ++i)// AuctionListFilterClass filterClass in ItemClassFilters) + ItemClassFilters[i] = new AuctionListFilterClass(_worldPacket); + } + } + + class AuctionCancelCommoditiesPurchase : ClientPacket + { + public ObjectGuid Auctioneer; + public Optional TaintedBy; + + public AuctionCancelCommoditiesPurchase(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + } + } + + class AuctionConfirmCommoditiesPurchase : ClientPacket + { + ObjectGuid Auctioneer; + int ItemID; + uint Quantity; + Optional TaintedBy; + + public AuctionConfirmCommoditiesPurchase(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + ItemID = _worldPacket.ReadInt32(); + Quantity = _worldPacket.ReadUInt32(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + } + } + class AuctionHelloRequest : ClientPacket { + public ObjectGuid Guid; + public AuctionHelloRequest(WorldPacket packet) : base(packet) { } public override void Read() { Guid = _worldPacket.ReadPackedGuid(); } - - public ObjectGuid Guid; } - class AuctionHelloResponse : ServerPacket + class AuctionListBidderItems : ClientPacket { - public AuctionHelloResponse() : base(ServerOpcodes.AuctionHelloResponse) { } + public ObjectGuid Auctioneer; + public uint Offset; + public List AuctionItemIDs = new List(); + public Array Sorts = new Array(2); + public Optional TaintedBy; - public override void Write() + public AuctionListBidderItems(WorldPacket packet) : base(packet) { } + + public override void Read() { - _worldPacket.WritePackedGuid(Guid); - _worldPacket.WriteBit(OpenForBusiness); - _worldPacket.FlushBits(); + Auctioneer = _worldPacket.ReadPackedGuid(); + Offset = _worldPacket.ReadUInt32(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + uint auctionIDCount = _worldPacket.ReadBits(7); + uint sortCount = _worldPacket.ReadBits(2); + + for (var i = 0; i < sortCount; ++i) + Sorts[i] = new AuctionSortDef(_worldPacket); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + + for (var i = 0; i < auctionIDCount; ++i) + AuctionItemIDs[i] = _worldPacket.ReadUInt32(); } - - public ObjectGuid Guid; - public bool OpenForBusiness = true; } - class AuctionCommandResult : ServerPacket + class AuctionListItemsByBucketKey : ClientPacket { - public AuctionCommandResult() : base(ServerOpcodes.AuctionCommandResult) { } + public ObjectGuid Auctioneer; + public uint Offset; + public sbyte Unknown830; + public Optional TaintedBy; + public Array Sorts = new Array(2); + public AuctionBucketKey BucketKey; - public void InitializeAuction(AuctionEntry auction) + public AuctionListItemsByBucketKey(WorldPacket packet) : base(packet) { } + + public override void Read() { - if (auction != null) + Auctioneer = _worldPacket.ReadPackedGuid(); + Offset = _worldPacket.ReadUInt32(); + Unknown830 = _worldPacket.ReadInt8(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + uint sortCount = _worldPacket.ReadBits(2); + + for (var i = 0; i < sortCount; ++i) + Sorts[i] = new AuctionSortDef(_worldPacket); + + BucketKey = new AuctionBucketKey(); + BucketKey.Read(_worldPacket); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + } + } + + class AuctionListItemsByItemID : ClientPacket + { + public ObjectGuid Auctioneer; + public int ItemID; + public int SuffixItemNameDescriptionID; + public uint Offset; + public Optional TaintedBy; + public Array Sorts = new Array(2); + + public AuctionListItemsByItemID(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + ItemID = _worldPacket.ReadInt32(); + SuffixItemNameDescriptionID = _worldPacket.ReadInt32(); + Offset = _worldPacket.ReadUInt32(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + uint sortCount = _worldPacket.ReadBits(2); + for (var i = 0; i < sortCount; ++i) + Sorts[i] = new AuctionSortDef(_worldPacket); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + } + } + + class AuctionListItemsByItemKeys : ClientPacket + { + public ObjectGuid Auctioneer; + public Optional TaintedBy; + public Array BucketKeys = new Array(100); + public Array Sorts = new Array(2); + + public AuctionListItemsByItemKeys(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + + if (_worldPacket.HasBit()) + TaintedBy.HasValue = true; + + uint bucketKeyCount = _worldPacket.ReadBits(7); + uint sortCount = _worldPacket.ReadBits(2); + + for (var i = 0; i < sortCount; ++i) + Sorts[i] = new AuctionSortDef(_worldPacket); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + + for (var i = 0; i < bucketKeyCount; ++i) { - AuctionItemID = auction.Id; - Money = auction.bid == auction.buyout ? 0 : auction.bid; - MinIncrement = auction.bid == auction.buyout ? 0 : auction.GetAuctionOutBid(); - Guid = ObjectGuid.Create(HighGuid.Player, auction.bidder); + BucketKeys[i] = new AuctionBucketKey(); + BucketKeys[i].Read(_worldPacket); } } + } - public override void Write() + class AuctionListOwnerItems : ClientPacket + { + public ObjectGuid Auctioneer; + public uint Offset; + public Optional TaintedBy; + public Array Sorts = new Array(2); + + public AuctionListOwnerItems(WorldPacket packet) : base(packet) { } + + public override void Read() { - _worldPacket.WriteUInt32(AuctionItemID); - _worldPacket.WriteInt32((int)Command); - _worldPacket.WriteInt32((int)ErrorCode); - _worldPacket.WriteInt32((int)BagResult); - _worldPacket.WritePackedGuid(Guid); - _worldPacket.WriteUInt64(MinIncrement); - _worldPacket.WriteUInt64(Money); - } + Auctioneer = _worldPacket.ReadPackedGuid(); + Offset = _worldPacket.ReadUInt32(); + TaintedBy.HasValue = _worldPacket.HasBit(); - public uint AuctionItemID; // the id of the auction that triggered this notification - public AuctionAction Command; - public AuctionError ErrorCode; - public ulong Money; // the amount of money that the player bid in copper - public AuctionError BagResult; - public ObjectGuid Guid; // the GUID of the bidder for this auction. - public ulong MinIncrement; // the sum of outbid is (1% of current bid) * 5, if the bid is too small, then this value is 1 copper. + uint sortCount = _worldPacket.ReadBits(2); + + for (var i = 0; i < sortCount; ++i) + Sorts[i] = new AuctionSortDef(_worldPacket); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + } + } + + class AuctionPlaceBid : ClientPacket + { + public ObjectGuid Auctioneer; + public ulong BidAmount; + public uint AuctionID; + public Optional TaintedBy; + + public AuctionPlaceBid(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + AuctionID = _worldPacket.ReadUInt32(); + BidAmount = _worldPacket.ReadUInt64(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + } + } + + class AuctionRemoveItem : ClientPacket + { + public ObjectGuid Auctioneer; + public int AuctionID = 0; + public Optional TaintedBy; + + public AuctionRemoveItem(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + AuctionID = _worldPacket.ReadInt32(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + } + } + + class AuctionReplicateItems : ClientPacket + { + public ObjectGuid Auctioneer; + public uint ChangeNumberGlobal; + public uint ChangeNumberCursor; + public uint ChangeNumberTombstone; + public uint Count; + public Optional TaintedBy; + + public AuctionReplicateItems(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + ChangeNumberGlobal = _worldPacket.ReadUInt32(); + ChangeNumberCursor = _worldPacket.ReadUInt32(); + ChangeNumberTombstone = _worldPacket.ReadUInt32(); + Count = _worldPacket.ReadUInt32(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + } + } + + class AuctionSellCommodity : ClientPacket + { + public ObjectGuid Auctioneer; + public ulong UnitPrice; + public uint RunTime; + public Optional TaintedBy; + public Array Items = new Array(64); + + public AuctionSellCommodity(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Auctioneer = _worldPacket.ReadPackedGuid(); + UnitPrice = _worldPacket.ReadUInt64(); + RunTime = _worldPacket.ReadUInt32(); + TaintedBy.HasValue = _worldPacket.HasBit(); + uint itemCount = _worldPacket.ReadBits(6); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); + + for (var i = 0; i < itemCount; ++i) + Items[i] = new AuctionItemForSale(_worldPacket); + } } class AuctionSellItem : ClientPacket { + public ulong BuyoutPrice; + public ObjectGuid Auctioneer; + public ulong MinBid; + public uint RunTime; + public Optional TaintedBy; + public Array Items = new Array(64); + public AuctionSellItem(WorldPacket packet) : base(packet) { } public override void Read() @@ -94,283 +375,58 @@ namespace Game.Network.Packets BuyoutPrice = _worldPacket.ReadUInt64(); RunTime = _worldPacket.ReadUInt32(); - byte ItemsCount = _worldPacket.ReadBits(5); - _worldPacket.ResetBitPos(); + TaintedBy.HasValue = _worldPacket.HasBit(); + uint itemCount = _worldPacket.ReadBits(6); - for (byte i = 0; i < ItemsCount; i++) - { - AuctionItemForSale item; - item.Guid = _worldPacket.ReadPackedGuid(); - item.UseCount = _worldPacket.ReadUInt32(); - Items[i] = item; - } - } + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); - public ulong BuyoutPrice; - public ObjectGuid Auctioneer; - public ulong MinBid; - public uint RunTime; - public Array Items = new Array(32); - - public struct AuctionItemForSale - { - public ObjectGuid Guid; - public uint UseCount; + for (var i = 0; i < itemCount; ++i) + Items[i] = new AuctionItemForSale(_worldPacket); } } - class AuctionPlaceBid : ClientPacket + class AuctionSetFavoriteItem : ClientPacket + { + public AuctionFavoriteInfo Item; + public bool IsNotFavorite = true; + + public AuctionSetFavoriteItem(WorldPacket packet) : base(packet) { } + + public override void Read() + { + IsNotFavorite = _worldPacket.HasBit(); + Item = new AuctionFavoriteInfo(_worldPacket); + } + } + + class AuctionStartCommoditiesPurchase : ClientPacket { - public AuctionPlaceBid(WorldPacket packet) : base(packet) { } + public ObjectGuid Auctioneer; + public int ItemID; + public uint Quantity; + public Optional TaintedBy; + + public AuctionStartCommoditiesPurchase(WorldPacket packet) : base(packet) { } public override void Read() { Auctioneer = _worldPacket.ReadPackedGuid(); - AuctionItemID = _worldPacket.ReadUInt32(); - BidAmount = _worldPacket.ReadUInt64(); + ItemID = _worldPacket.ReadInt32(); + Quantity = _worldPacket.ReadUInt32(); + TaintedBy.HasValue = _worldPacket.HasBit(); + + if (TaintedBy.HasValue) + TaintedBy.Value.Read(_worldPacket); } - - public ObjectGuid Auctioneer; - public ulong BidAmount; - public uint AuctionItemID; - } - - class AuctionListBidderItems : ClientPacket - { - public AuctionListBidderItems(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Auctioneer = _worldPacket.ReadPackedGuid(); - Offset = _worldPacket.ReadUInt32(); - byte auctionItemIDsCount = _worldPacket.ReadBits(7); - _worldPacket.ResetBitPos(); - - for (byte i = 0; i < auctionItemIDsCount; i++) - { - uint AuctionItemID = _worldPacket.ReadUInt32(); - AuctionItemIDs.Add(AuctionItemID); - } - } - - public uint Offset; - public List AuctionItemIDs = new List(); - public ObjectGuid Auctioneer; - } - - class AuctionRemoveItem : ClientPacket - { - public AuctionRemoveItem(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Auctioneer = _worldPacket.ReadPackedGuid(); - AuctionItemID = _worldPacket.ReadInt32(); - } - - public ObjectGuid Auctioneer; - public int AuctionItemID; - } - - class AuctionReplicateItems : ClientPacket - { - public AuctionReplicateItems(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Auctioneer = _worldPacket.ReadPackedGuid(); - Count = _worldPacket.ReadUInt32(); - ChangeNumberGlobal = _worldPacket.ReadUInt32(); - ChangeNumberCursor = _worldPacket.ReadUInt32(); - ChangeNumberTombstone = _worldPacket.ReadUInt32(); - } - - public ObjectGuid Auctioneer; - public uint Count; - public uint ChangeNumberGlobal; - public uint ChangeNumberCursor; - public uint ChangeNumberTombstone; - } - - class AuctionListPendingSales : ClientPacket - { - public AuctionListPendingSales(WorldPacket packet) : base(packet) { } - - public override void Read() { } - } - - public class AuctionListItemsResult : ServerPacket - { - public AuctionListItemsResult() : base(ServerOpcodes.AuctionListItemsResult) { } - - public override void Write() - { - _worldPacket.WriteInt32(Items.Count); - _worldPacket.WriteUInt32(TotalCount); - _worldPacket.WriteUInt32(DesiredDelay); - _worldPacket.WriteBit(OnlyUsable); - _worldPacket.FlushBits(); - - foreach (var item in Items) - item.Write(_worldPacket); - } - - public uint DesiredDelay; - public List Items = new List(); - public bool OnlyUsable = true; - public uint TotalCount; - } - - public class AuctionListOwnerItemsResult : ServerPacket - { - public AuctionListOwnerItemsResult() : base(ServerOpcodes.AuctionListOwnerItemsResult) { } - - public override void Write() - { - _worldPacket.WriteInt32(Items.Count); - _worldPacket.WriteUInt32(TotalCount); - _worldPacket.WriteUInt32(DesiredDelay); - - foreach (var item in Items) - item.Write(_worldPacket); - } - - public uint DesiredDelay; - public uint TotalCount; - public List Items = new List(); - } - - public class AuctionListBidderItemsResult : ServerPacket - { - public AuctionListBidderItemsResult() : base(ServerOpcodes.AuctionListBidderItemsResult) { } - - public override void Write() - { - _worldPacket.WriteInt32(Items.Count); - _worldPacket.WriteUInt32(TotalCount); - _worldPacket.WriteUInt32(DesiredDelay); - - foreach (var item in Items) - item.Write(_worldPacket); - } - - public uint DesiredDelay; - public uint TotalCount; - public List Items = new List(); - } - - class AuctionListOwnerItems : ClientPacket - { - public AuctionListOwnerItems(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Auctioneer = _worldPacket.ReadPackedGuid(); - Offset = _worldPacket.ReadUInt32(); - } - - public ObjectGuid Auctioneer; - public uint Offset; - } - - class AuctionListItems : ClientPacket - { - public AuctionListItems(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Offset = _worldPacket.ReadUInt32(); - Auctioneer = _worldPacket.ReadPackedGuid(); - MinLevel = _worldPacket.ReadUInt8(); - MaxLevel = _worldPacket.ReadUInt8(); - Quality = _worldPacket.ReadUInt32(); - SortCount = _worldPacket.ReadUInt8(); - KnownPets = new Array(_worldPacket.ReadInt32()); - for (int i = 0; i < KnownPets.Capacity; ++i) - KnownPets[i] = _worldPacket.ReadUInt8(); - - Name = _worldPacket.ReadString(_worldPacket.ReadBits(8)); - ClassFilters = new Array(_worldPacket.ReadBits(3)); - OnlyUsable = _worldPacket.HasBit(); - ExactMatch = _worldPacket.HasBit(); - - for (int i = 0; i < ClassFilters.Capacity; ++i) - { - var classFilter = new ClassFilter(); - classFilter.ItemClass = _worldPacket.ReadInt32(); - classFilter.SubClassFilters = new Array(_worldPacket.ReadBits(5)); - for (int x = 0; x < classFilter.SubClassFilters.Capacity; ++x) - { - ClassFilter.SubClassFilter subClassFilter; - subClassFilter.ItemSubclass = _worldPacket.ReadInt32(); - subClassFilter.InvTypeMask = _worldPacket.ReadUInt32(); - classFilter.SubClassFilters[x] = subClassFilter; - } - ClassFilters[i] = classFilter; - } - - _worldPacket.Skip(4); // DataSize = (SortCount * 2) - for (int i = 0; i < SortCount; i++) - { - AuctionListItems.Sort sort; - sort.Type = _worldPacket.ReadUInt8(); - sort.Direction = _worldPacket.ReadUInt8(); - DataSort.Add(sort); - } - } - - public uint Offset; - public ObjectGuid Auctioneer; - public byte MinLevel = 1; - public byte MaxLevel = 100; - public uint Quality; - public byte SortCount; - public Array KnownPets; - public sbyte MaxPetLevel; - public string Name = ""; - public Array ClassFilters = new Array(7); - public bool ExactMatch = true; - public bool OnlyUsable; - public List DataSort = new List(); - - public struct Sort - { - public byte Type; - public byte Direction; - } - - public class ClassFilter - { - public struct SubClassFilter - { - public int ItemSubclass; - public uint InvTypeMask; - } - - public int ItemClass; - public Array SubClassFilters = new Array(31); - } - } - - class AuctionListPendingSalesResult : ServerPacket - { - public AuctionListPendingSalesResult() : base(ServerOpcodes.Unknown) { } - - public override void Write() - { - _worldPacket.WriteInt32(Mails.Count); - _worldPacket.WriteInt32(TotalNumRecords); - - foreach (var mail in Mails) - mail.Write(_worldPacket); - } - - public List Mails = new List(); - public int TotalNumRecords; } class AuctionClosedNotification : ServerPacket - { + { + public AuctionOwnerNotification Info; + public float ProceedsMailDelay; + public bool Sold = true; + public AuctionClosedNotification() : base(ServerOpcodes.AuctionClosedNotification) { } public override void Write() @@ -380,14 +436,233 @@ namespace Game.Network.Packets _worldPacket.WriteBit(Sold); _worldPacket.FlushBits(); } + } - public AuctionOwnerNotification Info; - public float ProceedsMailDelay; - public bool Sold = true; + class AuctionCommandResult : ServerPacket + { + public uint AuctionID; ///< the id of the auction that triggered this notification + public int Command; ///< the type of action that triggered this notification. Possible values are @ref AuctionAction + public int ErrorCode; ///< the error code that was generated when trying to perform the action. Possible values are @ref AuctionError + public int BagResult; ///< the bid error. Possible values are @ref AuctionError + public ObjectGuid Guid; ///< the GUID of the bidder for this auction. + public ulong MinIncrement; ///< the sum of outbid is (1% of current bid) * 5, if the bid is too small, then this value is 1 copper. + public ulong Money; ///< the amount of money that the player bid in copper + public uint DesiredDelay; + + public AuctionCommandResult() : base(ServerOpcodes.AuctionCommandResult) { } + + /** + * @fn void WorldPackets::AuctionHousePackets::AuctionCommandResult::InitializeAuction(AuctionEntry* auction); + * + * @brief Initialize the following fields: AuctionId, Bid, AuctionOutBid, Bidder + * + * @param auction The relevant auction object + */ + public void InitializeAuction(AuctionEntry auction) + { + if (auction != null) + { + AuctionID = auction.Id; + Money = auction.bid == auction.buyout ? 0 : auction.bid; + MinIncrement = auction.bid == auction.buyout ? 0 : auction.GetAuctionOutBid(); + Guid = ObjectGuid.Create(HighGuid.Player, auction.bidder); + } + } + + public override void Write() + { + _worldPacket.WriteUInt32(AuctionID); + _worldPacket.WriteInt32(Command); + _worldPacket.WriteInt32(ErrorCode); + _worldPacket.WriteInt32(BagResult); + _worldPacket.WritePackedGuid(Guid); + _worldPacket.WriteUInt64(MinIncrement); + _worldPacket.WriteUInt64(Money); + _worldPacket.WriteUInt32(DesiredDelay); + } + } + + class AuctionCommodityPriceUpdate : ServerPacket + { + public Optional TotalPrice; + public Optional Quantity; + public Optional QuoteDuration; + public int Unknown830; + public uint DesiredDelay; + + public AuctionCommodityPriceUpdate() : base(ServerOpcodes.AuctionCommodityPriceUpdate) { } + + public override void Write() + { + _worldPacket.WriteBit(TotalPrice.HasValue); + _worldPacket.WriteBit(Quantity.HasValue); + _worldPacket.WriteBit(QuoteDuration.HasValue); + _worldPacket.WriteInt32(Unknown830); + _worldPacket.WriteUInt32(DesiredDelay); + + if (TotalPrice.HasValue) + _worldPacket.WriteUInt64(TotalPrice.Value); + + if (Quantity.HasValue) + _worldPacket.WriteUInt32(Quantity.Value); + + if (QuoteDuration.HasValue) + _worldPacket.WriteInt32(QuoteDuration.Value); + } + } + + class AuctionHelloResponse : ServerPacket + { + public ObjectGuid Guid; + public bool OpenForBusiness = true; + + public AuctionHelloResponse() : base(ServerOpcodes.AuctionHelloResponse) { } + + public override void Write() + { + _worldPacket.WritePackedGuid(Guid); + _worldPacket.WriteBit(OpenForBusiness); + _worldPacket.FlushBits(); + } + } + + public class AuctionListBidderItemsResult : ServerPacket + { + public List Items = new List(); + public uint DesiredDelay; + public bool HasMoreResults; + + public AuctionListBidderItemsResult() : base(ServerOpcodes.AuctionListBidderItemsResult) { } + + public override void Write() + { + _worldPacket.WriteInt32(Items.Count); + _worldPacket.WriteUInt32(DesiredDelay); + _worldPacket.WriteBit(HasMoreResults); + _worldPacket.FlushBits(); + + foreach (AuctionItem item in Items) + item.Write(_worldPacket); + } + } + + class AuctionListBucketItemsResult : ServerPacket + { + public List Buckets = new List(); + public uint DesiredDelay; + public int Unknown830_0; + public int Unknown830_1; + public int BrowseMode; + public bool HasMoreResults; + + public AuctionListBucketItemsResult() : base(ServerOpcodes.AuctionListBucketItemsResult) { } + + public override void Write() + { + _worldPacket.WriteInt32(Buckets.Count); + _worldPacket.WriteUInt32(DesiredDelay); + _worldPacket.WriteInt32(Unknown830_0); + _worldPacket.WriteInt32(Unknown830_1); + _worldPacket.WriteBits(BrowseMode, 1); + _worldPacket.WriteBit(HasMoreResults); + _worldPacket.FlushBits(); + + foreach (BucketInfo bucketInfo in Buckets) + bucketInfo.Write(_worldPacket); + } + } + + class AuctionListFavoriteItemsResult : ServerPacket + { + public uint DesiredDelay; + public List Items = new List(); + + public AuctionListFavoriteItemsResult() : base(ServerOpcodes.AuctionListFavoriteItemsResult) { } + + public override void Write() + { + _worldPacket.WriteUInt32(DesiredDelay); + _worldPacket.WriteBits(Items.Count, 7); + _worldPacket.FlushBits(); + + foreach (AuctionFavoriteInfo favoriteInfo in Items) + favoriteInfo.Write(_worldPacket); + } + } + + public class AuctionListItemsResult : ServerPacket + { + public List Items = new List(); + public uint Unknown830; + public uint TotalCount; + public uint DesiredDelay; + public uint ListType; + public bool HasMoreResults; + public AuctionBucketKey BucketKey; + + public AuctionListItemsResult() : base(ServerOpcodes.AuctionListItemsResult) { } + + public override void Write() + { + _worldPacket.WriteInt32(Items.Count); + _worldPacket.WriteUInt32(Unknown830); + _worldPacket.WriteUInt32(TotalCount); + _worldPacket.WriteUInt32(DesiredDelay); + _worldPacket.WriteBits(ListType, 2); + _worldPacket.WriteBit(HasMoreResults); + _worldPacket.FlushBits(); + + BucketKey.Write(_worldPacket); + + foreach (AuctionItem item in Items) + item.Write(_worldPacket); + } + } + + public class AuctionListOwnerItemsResult : ServerPacket + { + public List Items = new List(); + public List SoldItems = new List(); + public uint DesiredDelay; + public bool HasMoreResults; + + public AuctionListOwnerItemsResult() : base(ServerOpcodes.AuctionListOwnerItemsResult) { } + + public override void Write() + { + _worldPacket.WriteInt32(Items.Count); + _worldPacket.WriteInt32(SoldItems.Count); + _worldPacket.WriteUInt32(DesiredDelay); + _worldPacket.WriteBit(HasMoreResults); + _worldPacket.FlushBits(); + + foreach (AuctionItem item in Items) + item.Write(_worldPacket); + } + } + + class AuctionOutbidNotification : ServerPacket + { + public AuctionBidderNotification Info; + public ulong BidAmount; + public ulong MinIncrement; + + public AuctionOutbidNotification() : base(ServerOpcodes.AuctionOutbidNotification) { } + + public override void Write() + { + Info.Write(_worldPacket); + _worldPacket.WriteUInt64(BidAmount); + _worldPacket.WriteUInt64(MinIncrement); + } } class AuctionOwnerBidNotification : ServerPacket - { + { + public AuctionOwnerNotification Info; + public ObjectGuid Bidder; + public ulong MinIncrement; + public AuctionOwnerBidNotification() : base(ServerOpcodes.AuctionOwnerBidNotification) { } public override void Write() @@ -396,42 +671,17 @@ namespace Game.Network.Packets _worldPacket.WriteUInt64(MinIncrement); _worldPacket.WritePackedGuid(Bidder); } - - public AuctionOwnerNotification Info; - public ObjectGuid Bidder; - public ulong MinIncrement; - } - - class AuctionWonNotification : ServerPacket - { - public AuctionWonNotification() : base(ServerOpcodes.AuctionWonNotification) { } - - public override void Write() - { - Info.Write(_worldPacket); - } - - public AuctionBidderNotification Info; - } - - class AuctionOutBidNotification : ServerPacket - { - public AuctionOutBidNotification() : base(ServerOpcodes.AuctionOutbidNotification) { } - - public override void Write() - { - Info.Write(_worldPacket); - _worldPacket.WriteUInt64(BidAmount); - _worldPacket.WriteUInt64(MinIncrement); - } - - public AuctionBidderNotification Info; - public ulong BidAmount; - public ulong MinIncrement; } class AuctionReplicateResponse : ServerPacket - { + { + public uint ChangeNumberCursor; + public uint ChangeNumberGlobal; + public uint DesiredDelay; + public uint ChangeNumberTombstone; + public uint Result; + public List Items = new List(); + public AuctionReplicateResponse() : base(ServerOpcodes.AuctionReplicateResponse) { } public override void Write() @@ -443,45 +693,280 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(ChangeNumberTombstone); _worldPacket.WriteInt32(Items.Count); - foreach (var item in Items) + foreach (AuctionItem item in Items) item.Write(_worldPacket); } + } - public uint ChangeNumberCursor; - public uint ChangeNumberGlobal; - public uint DesiredDelay; - public uint ChangeNumberTombstone; - public uint Result; - public List Items = new List(); + class AuctionWonNotification : ServerPacket + { + public AuctionBidderNotification Info; + + public AuctionWonNotification() : base(ServerOpcodes.AuctionWonNotification) { } + + public override void Write() + { + Info.Write(_worldPacket); + } + } + + //Structs + public class AuctionBucketKey + { + public uint ItemID; + public ushort ItemLevel; + public Optional BattlePetSpeciesID = new Optional(); + public Optional SuffixItemNameDescriptionID = new Optional(); + + public void Read(WorldPacket data) + { + data.ResetBitPos(); + ItemID = data.ReadBits(20); + + if (data.HasBit()) + BattlePetSpeciesID.HasValue = true; + + ItemLevel = data.ReadBits(11); + + if (data.HasBit()) + SuffixItemNameDescriptionID.HasValue = true; + + if (BattlePetSpeciesID.HasValue) + BattlePetSpeciesID.Set(data.ReadUInt16()); + + if (SuffixItemNameDescriptionID.HasValue) + SuffixItemNameDescriptionID = data.ReadUInt16(); + } + + public void Write(WorldPacket data) + { + data.WriteBits(ItemID, 20); + data.WriteBit(BattlePetSpeciesID.HasValue); + data.WriteBits(ItemLevel, 11); + data.WriteBit(SuffixItemNameDescriptionID.HasValue); + data.FlushBits(); + + if (BattlePetSpeciesID.HasValue) + data.WriteUInt16(BattlePetSpeciesID.Value); + + if (SuffixItemNameDescriptionID.HasValue) + data.WriteUInt16(SuffixItemNameDescriptionID.Value); + } + } + + public struct AuctionListFilterSubClass + { + public int ItemSubclass; + public uint InvTypeMask; + + public AuctionListFilterSubClass(WorldPacket data) + { + ItemSubclass = data.ReadInt32(); + InvTypeMask = data.ReadUInt32(); + } + } + + public class AuctionListFilterClass + { + public int ItemClass; + public Array SubClassFilters = new Array(31); + + public AuctionListFilterClass(WorldPacket data) + { + ItemClass = data.ReadInt32(); + uint subClassFilterCount = data.ReadBits(5); + + for (var i = 0; i < subClassFilterCount; ++i) + SubClassFilters[i] = new AuctionListFilterSubClass(data); + } + } + + public struct AuctionSortDef + { + public AuctionHouseSortOrder SortOrder; + public bool ReverseSort; + + public AuctionSortDef(WorldPacket data) + { + data.ResetBitPos(); + SortOrder = (AuctionHouseSortOrder)data.ReadBits(4); + ReverseSort = data.HasBit(); + } + } + + public struct AuctionItemForSale + { + public ObjectGuid Guid; + public uint UseCount; + + public AuctionItemForSale(WorldPacket data) + { + Guid = data.ReadPackedGuid(); + UseCount = data.ReadUInt32(); + } + } + + public struct AuctionFavoriteInfo + { + public uint Order; + public uint ItemID; + public uint ItemLevel; + public uint BattlePetSpeciesID; + public uint ItemSuffix; + + public AuctionFavoriteInfo(WorldPacket data) + { + Order = data.ReadUInt32(); + ItemID = data.ReadUInt32(); + ItemLevel = data.ReadUInt32(); + BattlePetSpeciesID = data.ReadUInt32(); + ItemSuffix = data.ReadUInt32(); + } + + public void Write(WorldPacket data) + { + data.WriteUInt32(Order); + data.WriteUInt32(ItemID); + data.WriteUInt32(ItemLevel); + data.WriteUInt32(BattlePetSpeciesID); + data.WriteUInt32(ItemSuffix); + } + } + + public struct AuctionOwnerNotification + { + public uint AuctionID; + public ulong BidAmount; + public ItemInstance Item; + + public void Initialize(AuctionEntry auction, Item item) + { + AuctionID = auction.Id; + Item = new ItemInstance(item); + BidAmount = auction.bid; + } + + public void Write(WorldPacket data) + { + data.WriteUInt32(AuctionID); + data.WriteUInt64(BidAmount); + Item.Write(data); + } + } + + public class BucketInfo + { + public AuctionBucketKey Key; + public int TotalQuantity; + public ulong MinPrice; + public List ItemModifiedAppearanceIDs = new List(); + public Optional MaxBattlePetQuality; + public Optional MaxBattlePetLevel; + public Optional BattlePetBreedID; + public bool ContainsOwnerItem; + public bool ContainsOnlyCollectedAppearances; + + public void Write(WorldPacket data) + { + Key.Write(data); + data.WriteInt32(TotalQuantity); + data.WriteUInt64(MinPrice); + data.WriteInt32(ItemModifiedAppearanceIDs.Count); + if (!ItemModifiedAppearanceIDs.Empty()) + { + foreach (int id in ItemModifiedAppearanceIDs) + data.WriteInt32(id); + } + + data.WriteBit(MaxBattlePetQuality.HasValue); + data.WriteBit(MaxBattlePetLevel.HasValue); + data.WriteBit(BattlePetBreedID.HasValue); + data.WriteBit(ContainsOwnerItem); + data.WriteBit(ContainsOnlyCollectedAppearances); + data.FlushBits(); + + if (MaxBattlePetQuality.HasValue) + data.WriteUInt8(MaxBattlePetQuality.Value); + + if (MaxBattlePetLevel.HasValue) + data.WriteUInt8(MaxBattlePetLevel.Value); + + if (BattlePetBreedID.HasValue) + data.WriteUInt8(BattlePetBreedID.Value); + } } public class AuctionItem { + public Optional Item; + public int Count; + public int Charges; + public List Enchantments = new List(); + public int Flags; + public int AuctionID; + public ObjectGuid Owner; + public Optional MinBid; + public Optional MinIncrement; + public Optional BuyoutPrice; + public Optional UnitPrice; + public int DurationLeft; + public byte DeleteReason; + public bool CensorServerSideInfo; + public bool CensorBidInfo; + public ObjectGuid ItemGuid; + public ObjectGuid OwnerAccountID; + public uint EndTime; + public Optional Bidder; + public Optional BidAmount; + public List Gems = new List(); + public Optional AuctionBucketKey; + public void Write(WorldPacket data) { - Item.Write(data); + data.WriteBit(Item.HasValue); + data.WriteBits(Enchantments.Count, 4); + data.WriteBits(Gems.Count, 2); + data.WriteBit(MinBid.HasValue); + data.WriteBit(MinIncrement.HasValue); + data.WriteBit(BuyoutPrice.HasValue); + data.WriteBit(UnitPrice.HasValue); + data.WriteBit(CensorServerSideInfo); + data.WriteBit(CensorBidInfo); + data.WriteBit(AuctionBucketKey.HasValue); + if (!CensorBidInfo) + { + data.WriteBit(Bidder.HasValue); + data.WriteBit(BidAmount.HasValue); + } + + data.FlushBits(); + + if (Item.HasValue) + Item.Value.Write(data); + data.WriteInt32(Count); data.WriteInt32(Charges); data.WriteInt32(Flags); - data.WriteInt32(AuctionItemID); + data.WriteInt32(AuctionID); data.WritePackedGuid(Owner); - data.WriteUInt64(MinBid); - data.WriteUInt64(MinIncrement); - data.WriteUInt64(BuyoutPrice); data.WriteInt32(DurationLeft); data.WriteUInt8(DeleteReason); - data.WriteBits(Enchantments.Count, 4); - data.WriteBits(Gems.Count, 2); - data.WriteBit(CensorServerSideInfo); - data.WriteBit(CensorBidInfo); - data.FlushBits(); - - foreach (ItemGemData gem in Gems) - gem.Write(data); foreach (ItemEnchantData enchant in Enchantments) enchant.Write(data); + if (MinBid.HasValue) + data.WriteUInt64(MinBid.Value); + + if (MinIncrement.HasValue) + data.WriteUInt64(MinIncrement.Value); + + if (BuyoutPrice.HasValue) + data.WriteUInt64(BuyoutPrice.Value); + + if (UnitPrice.HasValue) + data.WriteUInt64(UnitPrice.Value); + if (!CensorServerSideInfo) { data.WritePackedGuid(ItemGuid); @@ -491,72 +976,39 @@ namespace Game.Network.Packets if (!CensorBidInfo) { - data.WritePackedGuid(Bidder); - data.WriteUInt64(BidAmount); + if (Bidder.HasValue) + data.WritePackedGuid(Bidder.Value); + + if (BidAmount.HasValue) + data.WriteUInt64(BidAmount.Value); } + + foreach (ItemGemData gem in Gems) + gem.Write(data); + + if (AuctionBucketKey.HasValue) + AuctionBucketKey.Value.Write(data); } - - public ItemInstance Item; - public int Count; - public int Charges; - public List Enchantments = new List(); - public int Flags; - public int AuctionItemID; - public ObjectGuid Owner; - public ulong MinBid; - public ulong MinIncrement; - public ulong BuyoutPrice; - public int DurationLeft; - public byte DeleteReason; - public bool CensorServerSideInfo; - public bool CensorBidInfo; - public ObjectGuid ItemGuid; - public ObjectGuid OwnerAccountID; - public uint EndTime; - public ObjectGuid Bidder; - public ulong BidAmount; - public List Gems = new List(); - } - - struct AuctionOwnerNotification - { - public void Initialize(AuctionEntry auction, Item item) - { - AuctionItemID = (int)auction.Id; - Item = new ItemInstance(item); - BidAmount = auction.bid; - } - - public void Write(WorldPacket data) - { - data.WriteInt32(AuctionItemID); - data.WriteUInt64(BidAmount); - Item.Write(data); - } - - public int AuctionItemID; - public ulong BidAmount; - public ItemInstance Item; } struct AuctionBidderNotification { + public int AuctionID; + public ObjectGuid Bidder; + public ItemInstance Item; + public void Initialize(AuctionEntry auction, Item item) { - AuctionItemID = (int)auction.Id; + AuctionID = (int)auction.Id; Item = new ItemInstance(item); Bidder = ObjectGuid.Create(HighGuid.Player, auction.bidder); } public void Write(WorldPacket data) { - data.WriteInt32(AuctionItemID); + data.WriteInt32(AuctionID); data.WritePackedGuid(Bidder); Item.Write(data); } - - public int AuctionItemID; - public ObjectGuid Bidder; - public ItemInstance Item; } } diff --git a/Source/Game/Network/WorldSocket.cs b/Source/Game/Network/WorldSocket.cs index 54ce87171..8da3e07a1 100644 --- a/Source/Game/Network/WorldSocket.cs +++ b/Source/Game/Network/WorldSocket.cs @@ -431,7 +431,6 @@ namespace Game.Network return; } - Sha256 keyData = new Sha256(); keyData.Finish(account.game.SessionKey);