using System; using System.Collections.Generic; using System.Linq; using System.Text; using PSO2SERVER.Models; using System.Runtime.InteropServices; using System.IO; namespace PSO2SERVER.Protocol.Packets { public class QuestAvailablePacket : Packet { public ushort Unk1 { get; set; } public ushort ExtremeCount { get; set; } public ushort Unk2 { get; set; } public ushort ArksCount { get; set; } public ushort LimitedTimeCount { get; set; } public ushort ExtremeDebugCount { get; set; } public ushort Blank1Count { get; set; } public ushort Unk3 { get; set; } public ushort NetCafeCount { get; set; } public ushort WarmingDebugCount { get; set; } public ushort Blank2Count { get; set; } public ushort AdvanceCount { get; set; } public ushort ExpeditionCount { get; set; } public ushort ExpeditionDebugCount { get; set; } public ushort ArksDebugCount { get; set; } public ushort Unk4Count { get; set; } public ushort ChallengeCount { get; set; } public ushort UrgentCount { get; set; } public ushort UrgentDebugCount { get; set; } public ushort TimeAttackCount { get; set; } public ushort TimeAttackDebugCount { get; set; } // Array of 9 ushort values (arks_debug2_count) public ushort[] ArksDebug2Count { get; set; } = new ushort[9]; public ushort Blank3Count { get; set; } public ushort Unk5 { get; set; } public ushort RecommendedCount { get; set; } public ushort Unk6 { get; set; } public ushort UltimateDebugCount { get; set; } public ushort AgpCount { get; set; } public ushort BonusCount { get; set; } public ushort Unk7 { get; set; } // Array of 10 ushort values (training_count) public ushort[] TrainingCount { get; set; } = new ushort[10]; public ushort TriggerCount { get; set; } public ushort RidroidCount { get; set; } public ushort NetCafeAgpCount { get; set; } public ushort BattleBrokenCount { get; set; } public ushort BusterDebugCount { get; set; } public ushort Poka12Count { get; set; } public ushort Unk8 { get; set; } public ushort Unk9 { get; set; } public ushort BusterCount { get; set; } public ushort HeroTrainingCount { get; set; } public ushort AmplifiedCount { get; set; } public ushort Unk10 { get; set; } public ushort Unk11 { get; set; } public ushort DarkBlastTrainingCount { get; set; } public ushort EndlessCount { get; set; } public ushort Unk12 { get; set; } public ushort Unk13 { get; set; } public ushort PhantomTrainingCount { get; set; } public ushort AisTrainingCount { get; set; } public ushort Unk14 { get; set; } public ushort DamageCalcCount { get; set; } public ushort EtoileTrainingCount { get; set; } public ushort DivideCount { get; set; } // Unsure fields (stars1_count, stars2_count, stars3_count) public ushort Stars1Count { get; set; } public ushort Stars2Count { get; set; } public ushort Stars3Count { get; set; } // Array of 2 ushort values (unk15) public ushort[] Unk15 { get; set; } = new ushort[2]; // NotOn attribute is specific to certain frameworks (e.g., Vita platform) // You can use attributes like [Obsolete] in C# if needed public ushort[] Unk16 { get; set; } = new ushort[2]; // AvailableQuestType values public AvailableQuestType AvailableTypes { get; set; } public AvailableQuestType Unk19 { get; set; } // Round boost active flag public uint RoundBoost { get; set; } public uint Unk21 { get; set; } // Constructor public QuestAvailablePacket() { } //public short[] amount = new short[Enum.GetValues(typeof(QuestType)).Length]; //AvailableQuestType available = AvailableQuestType.ARKS; public override byte[] Build() { PacketWriter writer = new PacketWriter(); writer.Write(Unk1); writer.Write(ExtremeCount); writer.Write(Unk2); writer.Write(ArksCount); writer.Write(LimitedTimeCount); writer.Write(ExtremeDebugCount); writer.Write(Blank1Count); writer.Write(Unk3); writer.Write(NetCafeCount); writer.Write(WarmingDebugCount); writer.Write(Blank2Count); writer.Write(AdvanceCount); writer.Write(ExpeditionCount); writer.Write(ExpeditionDebugCount); writer.Write(ArksDebugCount); writer.Write(Unk4Count); writer.Write(ChallengeCount); writer.Write(UrgentCount); writer.Write(UrgentDebugCount); writer.Write(TimeAttackCount); writer.Write(TimeAttackDebugCount); // 写入 ArksDebug2Count 数组 foreach (var count in ArksDebug2Count) { writer.Write(count); } writer.Write(Blank3Count); writer.Write(Unk5); writer.Write(RecommendedCount); writer.Write(Unk6); writer.Write(UltimateDebugCount); writer.Write(AgpCount); writer.Write(BonusCount); writer.Write(Unk7); // 写入 TrainingCount 数组 foreach (var count in TrainingCount) { writer.Write(count); } writer.Write(TriggerCount); writer.Write(RidroidCount); writer.Write(NetCafeAgpCount); writer.Write(BattleBrokenCount); writer.Write(BusterDebugCount); writer.Write(Poka12Count); writer.Write(Unk8); writer.Write(Unk9); writer.Write(BusterCount); writer.Write(HeroTrainingCount); writer.Write(AmplifiedCount); writer.Write(Unk10); writer.Write(Unk11); writer.Write(DarkBlastTrainingCount); writer.Write(EndlessCount); writer.Write(Unk12); writer.Write(Unk13); writer.Write(PhantomTrainingCount); writer.Write(AisTrainingCount); writer.Write(Unk14); writer.Write(DamageCalcCount); writer.Write(EtoileTrainingCount); writer.Write(DivideCount); writer.Write(Stars1Count); writer.Write(Stars2Count); writer.Write(Stars3Count); // 写入 Unk15 数组 foreach (var count in Unk15) { writer.Write(count); } // 写入 Unk16 数组 foreach (var count in Unk16) { writer.Write(count); } // 写入 AvailableTypes 和 Unk19 (作为枚举类型,转换为整数) writer.Write((ulong)AvailableTypes); writer.Write((ulong)Unk19); writer.Write(RoundBoost); writer.Write(Unk21); //// Filler/Padding? //writer.Write((UInt16)0); //// Amounts //for (int i = 0; i < amount.Length; i++) //{ // amount[i] = 1; // Just for testing // writer.Write(amount[i]); //} //// Padding/Blank entries? //for (int i = 0; i < 2; i++) // writer.Write((int)0); //// Available Bitfield //writer.Write((UInt64)available); //// Filler/Padding? //for (int i = 0; i < 2; i++) // writer.Write((int)0); return writer.ToArray(); } public override PacketHeader GetHeader() { return new PacketHeader(0x0B, 0x16, PacketFlags.None); } } }