From f7f4542ac71a4a9a07c1a884542222b8098c1284 Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Sun, 10 Nov 2024 22:37:36 -0500 Subject: [PATCH] Core/PacketIO: Added empty implementation for treasure picker opcodes Port From (https://github.com/TrinityCore/TrinityCore/commit/4936094379a3558022d63f7520cd0d988d718daf) --- Source/Game/Handlers/QueryHandler.cs | 16 +++ .../Game/Networking/Packets/QueryPackets.cs | 119 ++++++++++++++++++ 2 files changed, 135 insertions(+) diff --git a/Source/Game/Handlers/QueryHandler.cs b/Source/Game/Handlers/QueryHandler.cs index 79a62306e..aacff8b3d 100644 --- a/Source/Game/Handlers/QueryHandler.cs +++ b/Source/Game/Handlers/QueryHandler.cs @@ -344,5 +344,21 @@ namespace Game SendPacket(realmQueryResponse); } + + [WorldPacketHandler(ClientOpcodes.QueryTreasurePicker)] + void HandleQueryTreasurePicker(QueryTreasurePicker queryTreasurePicker) + { + Quest questInfo = Global.ObjectMgr.GetQuestTemplate(queryTreasurePicker.QuestID); + if (questInfo == null) + return; + + TreasurePickerResponse treasurePickerResponse = new(); + treasurePickerResponse.QuestID = queryTreasurePicker.QuestID; + treasurePickerResponse.TreasurePickerID = queryTreasurePicker.TreasurePickerID; + + // TODO: Missing treasure picker implementation + + _player.SendPacket(treasurePickerResponse); + } } } diff --git a/Source/Game/Networking/Packets/QueryPackets.cs b/Source/Game/Networking/Packets/QueryPackets.cs index 597015e40..e6d23007c 100644 --- a/Source/Game/Networking/Packets/QueryPackets.cs +++ b/Source/Game/Networking/Packets/QueryPackets.cs @@ -564,6 +564,36 @@ namespace Game.Networking.Packets public VirtualRealmNameInfo NameInfo; } + class QueryTreasurePicker : ClientPacket + { + public uint QuestID; + public uint TreasurePickerID; + + public QueryTreasurePicker(WorldPacket packet) : base(packet) { } + + public override void Read() + { + QuestID = _worldPacket.ReadUInt32(); + TreasurePickerID = _worldPacket.ReadUInt32(); + } + } + + class TreasurePickerResponse : ServerPacket + { + public uint QuestID; + public uint TreasurePickerID; + public TreasurePickerPick Pick; + + public TreasurePickerResponse() : base(ServerOpcodes.TreasurePickerResponse, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WriteUInt32(QuestID); + _worldPacket.WriteUInt32(TreasurePickerID); + Pick.Write(_worldPacket); + } + } + //Structs public class PlayerGuidLookupData { @@ -765,4 +795,93 @@ namespace Game.Networking.Packets public uint QuestID; public List NPCs = new(); } + + struct TreasurePickItem + { + public ItemInstance Item; + public uint Quantity; + public QuestRewardContextFlags? ContextFlags; + + public void Write(WorldPacket data) + { + Item.Write(data); + data.WriteUInt32(Quantity); + data.WriteBit(ContextFlags.HasValue); + data.FlushBits(); + + if (ContextFlags.HasValue) + data.WriteInt32((int)ContextFlags.Value); + } + } + + struct TreasurePickCurrency + { + public uint CurrencyID; + public uint Quantity; + public QuestRewardContextFlags? ContextFlags; + + public void Write(WorldPacket data) + { + data.WriteUInt32(CurrencyID); + data.WriteUInt32(Quantity); + data.WriteBit(ContextFlags.HasValue); + data.FlushBits(); + + if (ContextFlags.HasValue) + data.WriteInt32((int)ContextFlags.Value); + } + } + + class TreasurePickerBonus + { + public List Items = new(); + public List Currencies = new(); + public ulong Money; + public bool Unknown; + + public void Write(WorldPacket data) + { + data.WriteInt32(Items.Count); + data.WriteInt32(Currencies.Count); + data.WriteUInt64(Money); + data.WriteBit(Unknown); + data.FlushBits(); + + foreach (TreasurePickItem treasurePickerItem in Items) + treasurePickerItem.Write(data); + + foreach (TreasurePickCurrency treasurePickCurrency in Currencies) + treasurePickCurrency.Write(data); + } + } + + class TreasurePickerPick + { + public List Items = new(); + public List Currencies = new(); + public List Bonuses = new(); + public ulong Money; + public int Flags; + public bool IsChoice; + + public void Write(WorldPacket data) + { + data.WriteInt32(Items.Count); + data.WriteInt32(Currencies.Count); + data.WriteUInt64(Money); + data.WriteInt32(Bonuses.Count); + data.WriteInt32(Flags); + data.WriteBit(IsChoice); + data.FlushBits(); + + foreach (TreasurePickCurrency treasurePickCurrency in Currencies) + treasurePickCurrency.Write(data); + + foreach (TreasurePickItem treasurePickItem in Items) + treasurePickItem.Write(data); + + foreach (TreasurePickerBonus treasurePickerBonus in Bonuses) + treasurePickerBonus.Write(data); + } + } }