diff --git a/Dalamud/Game/Gui/PartyFinder/Internal/PartyFinderPacket.cs b/Dalamud/Game/Gui/PartyFinder/Internal/PartyFinderPacket.cs
new file mode 100644
index 000000000..9f8834ecd
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Internal/PartyFinderPacket.cs
@@ -0,0 +1,28 @@
+using System.Diagnostics.CodeAnalysis;
+using System.Runtime.InteropServices;
+
+namespace Dalamud.Game.Gui.PartyFinder.Internal
+{
+ ///
+ /// The structure of the PartyFinder packet.
+ ///
+ [SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1201:Elements should appear in the correct order", Justification = "Sequential struct marshaling.")]
+ [SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:Elements should be ordered by access", Justification = "Sequential struct marshaling.")]
+ [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "Document the field usage.")]
+ [StructLayout(LayoutKind.Sequential)]
+ internal readonly struct PartyFinderPacket
+ {
+ ///
+ /// Gets the size of this packet.
+ ///
+ internal static int PacketSize { get; } = Marshal.SizeOf();
+
+ internal readonly int BatchNumber;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
+ private readonly byte[] padding1;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+ internal readonly PartyFinderPacketListing[] Listings;
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Internal/PartyFinderPacketListing.cs b/Dalamud/Game/Gui/PartyFinder/Internal/PartyFinderPacketListing.cs
new file mode 100644
index 000000000..75f24c88c
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Internal/PartyFinderPacketListing.cs
@@ -0,0 +1,99 @@
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using System.Runtime.InteropServices;
+
+namespace Dalamud.Game.Gui.PartyFinder.Internal
+{
+ ///
+ /// The structure of an individual listing within a packet.
+ ///
+ [SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:Elements should be ordered by access", Justification = "Sequential struct marshaling.")]
+ [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "Document the field usage.")]
+ [StructLayout(LayoutKind.Sequential)]
+ internal readonly struct PartyFinderPacketListing
+ {
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+ private readonly byte[] header1;
+ internal readonly uint Id;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+ private readonly byte[] header2;
+
+ internal readonly uint ContentIdLower;
+ private readonly ushort unknownShort1;
+ private readonly ushort unknownShort2;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
+ private readonly byte[] header3;
+
+ internal readonly byte Category;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
+ private readonly byte[] header4;
+
+ internal readonly ushort Duty;
+ internal readonly byte DutyType;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
+ private readonly byte[] header5;
+
+ internal readonly ushort World;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
+ private readonly byte[] header6;
+
+ internal readonly byte Objective;
+ internal readonly byte BeginnersWelcome;
+ internal readonly byte Conditions;
+ internal readonly byte DutyFinderSettings;
+ internal readonly byte LootRules;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
+ private readonly byte[] header7; // all zero in every pf I've examined
+
+ private readonly uint lastPatchHotfixTimestamp; // last time the servers were restarted?
+ internal readonly ushort SecondsRemaining;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
+ private readonly byte[] header8; // 00 00 01 00 00 00 in every pf I've examined
+
+ internal readonly ushort MinimumItemLevel;
+ internal readonly ushort HomeWorld;
+ internal readonly ushort CurrentWorld;
+
+ private readonly byte header9;
+
+ internal readonly byte NumSlots;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
+ private readonly byte[] header10;
+
+ internal readonly byte SearchArea;
+
+ private readonly byte header11;
+
+ internal readonly byte NumParties;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
+ private readonly byte[] header12; // 00 00 00 always. maybe numParties is a u32?
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
+ internal readonly uint[] Slots;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
+ internal readonly byte[] JobsPresent;
+
+ // Note that ByValTStr will not work here because the strings are UTF-8 and there's only a CharSet for UTF-16 in C#.
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
+ internal readonly byte[] Name;
+
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 192)]
+ internal readonly byte[] Description;
+
+ internal bool IsNull()
+ {
+ // a valid party finder must have at least one slot set
+ return this.Slots.All(slot => slot == 0);
+ }
+ }
+}
diff --git a/Dalamud/Game/Internal/Gui/PartyFinderAddressResolver.cs b/Dalamud/Game/Gui/PartyFinder/PartyFinderAddressResolver.cs
old mode 100755
new mode 100644
similarity index 82%
rename from Dalamud/Game/Internal/Gui/PartyFinderAddressResolver.cs
rename to Dalamud/Game/Gui/PartyFinder/PartyFinderAddressResolver.cs
index 3c0f80e34..75da83180
--- a/Dalamud/Game/Internal/Gui/PartyFinderAddressResolver.cs
+++ b/Dalamud/Game/Gui/PartyFinder/PartyFinderAddressResolver.cs
@@ -1,11 +1,11 @@
using System;
-namespace Dalamud.Game.Internal.Gui
+namespace Dalamud.Game.Gui.PartyFinder
{
///
/// The address resolver for the class.
///
- internal class PartyFinderAddressResolver : BaseAddressResolver
+ public class PartyFinderAddressResolver : BaseAddressResolver
{
///
/// Gets the address of the native ReceiveListing method.
diff --git a/Dalamud/Game/Internal/Gui/PartyFinderGui.cs b/Dalamud/Game/Gui/PartyFinder/PartyFinderGui.cs
old mode 100755
new mode 100644
similarity index 79%
rename from Dalamud/Game/Internal/Gui/PartyFinderGui.cs
rename to Dalamud/Game/Gui/PartyFinder/PartyFinderGui.cs
index 24079cf4e..dcfd03c46
--- a/Dalamud/Game/Internal/Gui/PartyFinderGui.cs
+++ b/Dalamud/Game/Gui/PartyFinder/PartyFinderGui.cs
@@ -1,11 +1,12 @@
using System;
using System.Runtime.InteropServices;
-using Dalamud.Game.Internal.Gui.Structs;
+using Dalamud.Game.Gui.PartyFinder.Internal;
+using Dalamud.Game.Gui.PartyFinder.Types;
using Dalamud.Hooking;
using Serilog;
-namespace Dalamud.Game.Internal.Gui
+namespace Dalamud.Game.Gui.PartyFinder
{
///
/// This class handles interacting with the native PartyFinder window.
@@ -30,7 +31,7 @@ namespace Dalamud.Game.Internal.Gui
this.address = new PartyFinderAddressResolver();
this.address.Setup(scanner);
- this.memory = Marshal.AllocHGlobal(PartyFinder.PacketInfo.PacketSize);
+ this.memory = Marshal.AllocHGlobal(PartyFinderPacket.PacketSize);
this.receiveListingHook = new Hook(this.address.ReceiveListing, new ReceiveListingDelegate(this.HandleReceiveListingDetour));
}
@@ -87,7 +88,7 @@ namespace Dalamud.Game.Internal.Gui
{
var dataPtr = data + 0x10;
- var packet = Marshal.PtrToStructure(dataPtr);
+ var packet = Marshal.PtrToStructure(dataPtr);
// rewriting is an expensive operation, so only do it if necessary
var needToRewrite = false;
@@ -125,33 +126,8 @@ namespace Dalamud.Game.Internal.Gui
// copy our new memory over the game's
unsafe
{
- Buffer.MemoryCopy((void*)this.memory, (void*)dataPtr, PartyFinder.PacketInfo.PacketSize, PartyFinder.PacketInfo.PacketSize);
+ Buffer.MemoryCopy((void*)this.memory, (void*)dataPtr, PartyFinderPacket.PacketSize, PartyFinderPacket.PacketSize);
}
}
}
-
- ///
- /// This class represents additional arguments passed by the game.
- ///
- public class PartyFinderListingEventArgs
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The batch number.
- internal PartyFinderListingEventArgs(int batchNumber)
- {
- this.BatchNumber = batchNumber;
- }
-
- ///
- /// Gets the batch number.
- ///
- public int BatchNumber { get; }
-
- ///
- /// Gets or sets a value indicating whether the listing is visible.
- ///
- public bool Visible { get; set; } = true;
- }
}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderCategory.cs b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderCategory.cs
new file mode 100644
index 000000000..d7ffe568b
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderCategory.cs
@@ -0,0 +1,48 @@
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Category flags for the class.
+ ///
+ public enum DutyFinderCategory
+ {
+ ///
+ /// The duty category.
+ ///
+ Duty = 0,
+
+ ///
+ /// The quest battle category.
+ ///
+ QuestBattles = 1 << 0,
+
+ ///
+ /// The fate category.
+ ///
+ Fates = 1 << 1,
+
+ ///
+ /// The treasure hunt category.
+ ///
+ TreasureHunt = 1 << 2,
+
+ ///
+ /// The hunt category.
+ ///
+ TheHunt = 1 << 3,
+
+ ///
+ /// The gathering forays category.
+ ///
+ GatheringForays = 1 << 4,
+
+ ///
+ /// The deep dungeons category.
+ ///
+ DeepDungeons = 1 << 5,
+
+ ///
+ /// The adventuring forays category.
+ ///
+ AdventuringForays = 1 << 6,
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderConditionFlags.cs b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderConditionFlags.cs
new file mode 100644
index 000000000..2abd371ab
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderConditionFlags.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Condition flags for the class.
+ ///
+ [Flags]
+ public enum DutyFinderConditionFlags : uint
+ {
+ ///
+ /// No duty condition.
+ ///
+ None = 1,
+
+ ///
+ /// The duty complete condition.
+ ///
+ DutyComplete = 2,
+
+ ///
+ /// The duty incomplete condition.
+ ///
+ DutyIncomplete = 4,
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderLootRuleFlags.cs b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderLootRuleFlags.cs
new file mode 100644
index 000000000..aa75807fd
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderLootRuleFlags.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Loot rule flags for the class.
+ ///
+ [Flags]
+ public enum DutyFinderLootRuleFlags : uint
+ {
+ ///
+ /// No loot rules.
+ ///
+ None = 0,
+
+ ///
+ /// The greed only rule.
+ ///
+ GreedOnly = 1,
+
+ ///
+ /// The lootmaster rule.
+ ///
+ Lootmaster = 2,
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderObjectiveFlags.cs b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderObjectiveFlags.cs
new file mode 100644
index 000000000..40e34c1fc
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderObjectiveFlags.cs
@@ -0,0 +1,31 @@
+using System;
+
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Objective flags for the class.
+ ///
+ [Flags]
+ public enum DutyFinderObjectiveFlags : uint
+ {
+ ///
+ /// No objective.
+ ///
+ None = 0,
+
+ ///
+ /// The duty completion objective.
+ ///
+ DutyCompletion = 1,
+
+ ///
+ /// The practice objective.
+ ///
+ Practice = 2,
+
+ ///
+ /// The loot objective.
+ ///
+ Loot = 4,
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderSearchAreaFlags.cs b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderSearchAreaFlags.cs
new file mode 100644
index 000000000..c9c238e48
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderSearchAreaFlags.cs
@@ -0,0 +1,36 @@
+using System;
+
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Search area flags for the class.
+ ///
+ [Flags]
+ public enum DutyFinderSearchAreaFlags : uint
+ {
+ ///
+ /// Datacenter.
+ ///
+ DataCentre = 1 << 0,
+
+ ///
+ /// Private.
+ ///
+ Private = 1 << 1,
+
+ ///
+ /// Alliance raid.
+ ///
+ AllianceRaid = 1 << 2,
+
+ ///
+ /// World.
+ ///
+ World = 1 << 3,
+
+ ///
+ /// One player per job.
+ ///
+ OnePlayerPerJob = 1 << 5,
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderSettingsFlags.cs b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderSettingsFlags.cs
new file mode 100644
index 000000000..6dfe10c69
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/DutyFinderSettingsFlags.cs
@@ -0,0 +1,31 @@
+using System;
+
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Duty finder settings flags for the class.
+ ///
+ [Flags]
+ public enum DutyFinderSettingsFlags : uint
+ {
+ ///
+ /// No duty finder settings.
+ ///
+ None = 0,
+
+ ///
+ /// The undersized party setting.
+ ///
+ UndersizedParty = 1 << 0,
+
+ ///
+ /// The minimum item level setting.
+ ///
+ MinimumItemLevel = 1 << 1,
+
+ ///
+ /// The silence echo setting.
+ ///
+ SilenceEcho = 1 << 2,
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/DutyType.cs b/Dalamud/Game/Gui/PartyFinder/Types/DutyType.cs
new file mode 100644
index 000000000..3e3342938
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/DutyType.cs
@@ -0,0 +1,23 @@
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Duty type flags for the class.
+ ///
+ public enum DutyType
+ {
+ ///
+ /// No duty type.
+ ///
+ Other = 0,
+
+ ///
+ /// The roulette duty type.
+ ///
+ Roulette = 1 << 0,
+
+ ///
+ /// The normal duty type.
+ ///
+ Normal = 1 << 1,
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/JobFlags.cs b/Dalamud/Game/Gui/PartyFinder/Types/JobFlags.cs
new file mode 100644
index 000000000..98fa1b1fe
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/JobFlags.cs
@@ -0,0 +1,146 @@
+using System;
+
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Job flags for the class.
+ ///
+ [Flags]
+ public enum JobFlags
+ {
+ ///
+ /// Gladiator (GLD).
+ ///
+ Gladiator = 1 << 1,
+
+ ///
+ /// Pugilist (PGL).
+ ///
+ Pugilist = 1 << 2,
+
+ ///
+ /// Marauder (MRD).
+ ///
+ Marauder = 1 << 3,
+
+ ///
+ /// Lancer (LNC).
+ ///
+ Lancer = 1 << 4,
+
+ ///
+ /// Archer (ARC).
+ ///
+ Archer = 1 << 5,
+
+ ///
+ /// Conjurer (CNJ).
+ ///
+ Conjurer = 1 << 6,
+
+ ///
+ /// Thaumaturge (THM).
+ ///
+ Thaumaturge = 1 << 7,
+
+ ///
+ /// Paladin (PLD).
+ ///
+ Paladin = 1 << 8,
+
+ ///
+ /// Monk (MNK).
+ ///
+ Monk = 1 << 9,
+
+ ///
+ /// Warrior (WAR).
+ ///
+ Warrior = 1 << 10,
+
+ ///
+ /// Dragoon (DRG).
+ ///
+ Dragoon = 1 << 11,
+
+ ///
+ /// Bard (BRD).
+ ///
+ Bard = 1 << 12,
+
+ ///
+ /// White mage (WHM).
+ ///
+ WhiteMage = 1 << 13,
+
+ ///
+ /// Black mage (BLM).
+ ///
+ BlackMage = 1 << 14,
+
+ ///
+ /// Arcanist (ACN).
+ ///
+ Arcanist = 1 << 15,
+
+ ///
+ /// Summoner (SMN).
+ ///
+ Summoner = 1 << 16,
+
+ ///
+ /// Scholar (SCH).
+ ///
+ Scholar = 1 << 17,
+
+ ///
+ /// Rogue (ROG).
+ ///
+ Rogue = 1 << 18,
+
+ ///
+ /// Ninja (NIN).
+ ///
+ Ninja = 1 << 19,
+
+ ///
+ /// Machinist (MCH).
+ ///
+ Machinist = 1 << 20,
+
+ ///
+ /// Dark Knight (DRK).
+ ///
+ DarkKnight = 1 << 21,
+
+ ///
+ /// Astrologian (AST).
+ ///
+ Astrologian = 1 << 22,
+
+ ///
+ /// Samurai (SAM).
+ ///
+ Samurai = 1 << 23,
+
+ ///
+ /// Red mage (RDM).
+ ///
+ RedMage = 1 << 24,
+
+ ///
+ /// Blue mage (BLM).
+ ///
+ BlueMage = 1 << 25,
+
+ ///
+ /// Gunbreaker (GNB).
+ ///
+ Gunbreaker = 1 << 26,
+
+ ///
+ /// Dancer (DNC).
+ ///
+ Dancer = 1 << 27,
+ }
+}
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/JobFlagsExtensions.cs b/Dalamud/Game/Gui/PartyFinder/Types/JobFlagsExtensions.cs
new file mode 100644
index 000000000..b899dd62f
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/JobFlagsExtensions.cs
@@ -0,0 +1,27 @@
+using System;
+
+using Dalamud.Data;
+using Lumina.Excel.GeneratedSheets;
+
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// Extensions for the enum.
+ ///
+ public static class JobFlagsExtensions
+ {
+ ///
+ /// Get the actual ClassJob from the in-game sheets for this JobFlags.
+ ///
+ /// A JobFlags enum member.
+ /// A DataManager to get the ClassJob from.
+ /// A ClassJob if found or null if not.
+ public static ClassJob ClassJob(this JobFlags job, DataManager data)
+ {
+ var result = Math.Log2((double)job);
+ return result % 1 == 0
+ ? data.GetExcelSheet().GetRow((uint)result)
+ : null;
+ }
+ }
+}
diff --git a/Dalamud/Game/Internal/Gui/Structs/PartyFinderListing.cs b/Dalamud/Game/Gui/PartyFinder/Types/PartyFinderListing.cs
similarity index 87%
rename from Dalamud/Game/Internal/Gui/Structs/PartyFinderListing.cs
rename to Dalamud/Game/Gui/PartyFinder/Types/PartyFinderListing.cs
index b533a9741..c75748942 100644
--- a/Dalamud/Game/Internal/Gui/Structs/PartyFinderListing.cs
+++ b/Dalamud/Game/Gui/PartyFinder/Types/PartyFinderListing.cs
@@ -3,10 +3,11 @@ using System.Collections.Generic;
using System.Linq;
using Dalamud.Data;
+using Dalamud.Game.Gui.PartyFinder.Internal;
using Dalamud.Game.Text.SeStringHandling;
using Lumina.Excel.GeneratedSheets;
-namespace Dalamud.Game.Internal.Gui.Structs
+namespace Dalamud.Game.Gui.PartyFinder.Types
{
///
/// A single listing in party finder.
@@ -31,7 +32,7 @@ namespace Dalamud.Game.Internal.Gui.Structs
/// The interop listing data.
/// The DataManager instance.
/// The SeStringManager instance.
- internal PartyFinderListing(PartyFinder.Listing listing, DataManager dataManager, SeStringManager seStringManager)
+ internal PartyFinderListing(PartyFinderPacketListing listing, DataManager dataManager, SeStringManager seStringManager)
{
this.objective = listing.Objective;
this.conditions = listing.Conditions;
@@ -48,7 +49,7 @@ namespace Dalamud.Game.Internal.Gui.Structs
this.World = new Lazy(() => dataManager.GetExcelSheet().GetRow(listing.World));
this.HomeWorld = new Lazy(() => dataManager.GetExcelSheet().GetRow(listing.HomeWorld));
this.CurrentWorld = new Lazy(() => dataManager.GetExcelSheet().GetRow(listing.CurrentWorld));
- this.Category = (Category)listing.Category;
+ this.Category = (DutyFinderCategory)listing.Category;
this.RawDuty = listing.Duty;
this.Duty = new Lazy(() => dataManager.GetExcelSheet().GetRow(listing.Duty));
this.DutyType = (DutyType)listing.DutyType;
@@ -103,7 +104,7 @@ namespace Dalamud.Game.Internal.Gui.Structs
///
/// Gets the Party Finder category this listing is listed under.
///
- public Category Category { get; }
+ public DutyFinderCategory Category { get; }
///
/// Gets the row ID of the duty this listing is for. May be 0 for non-duty listings.
@@ -154,12 +155,12 @@ namespace Dalamud.Game.Internal.Gui.Structs
///
/// Gets the objective of this listing.
///
- public ObjectiveFlags Objective => (ObjectiveFlags)this.objective;
+ public DutyFinderObjectiveFlags Objective => (DutyFinderObjectiveFlags)this.objective;
///
/// Gets the conditions of this listing.
///
- public ConditionFlags Conditions => (ConditionFlags)this.conditions;
+ public DutyFinderConditionFlags Conditions => (DutyFinderConditionFlags)this.conditions;
///
/// Gets the Duty Finder settings that will be used for this listing.
@@ -169,13 +170,13 @@ namespace Dalamud.Game.Internal.Gui.Structs
///
/// Gets the loot rules that will be used for this listing.
///
- public LootRuleFlags LootRules => (LootRuleFlags)this.lootRules;
+ public DutyFinderLootRuleFlags LootRules => (DutyFinderLootRuleFlags)this.lootRules;
///
/// Gets where this listing is searching. Note that this is also used for denoting alliance raid listings and one
/// player per job.
///
- public SearchAreaFlags SearchArea => (SearchAreaFlags)this.searchArea;
+ public DutyFinderSearchAreaFlags SearchArea => (DutyFinderSearchAreaFlags)this.searchArea;
///
/// Gets a list of the class/job IDs that are currently present in the party.
@@ -194,14 +195,14 @@ namespace Dalamud.Game.Internal.Gui.Structs
///
/// The flag to check for.
/// A value indicating whether the flag is present.
- public bool this[ObjectiveFlags flag] => this.objective == 0 || (this.objective & (uint)flag) > 0;
+ public bool this[DutyFinderObjectiveFlags flag] => this.objective == 0 || (this.objective & (uint)flag) > 0;
///
/// Check if the given flag is present.
///
/// The flag to check for.
/// A value indicating whether the flag is present.
- public bool this[ConditionFlags flag] => this.conditions == 0 || (this.conditions & (uint)flag) > 0;
+ public bool this[DutyFinderConditionFlags flag] => this.conditions == 0 || (this.conditions & (uint)flag) > 0;
///
/// Check if the given flag is present.
@@ -215,14 +216,14 @@ namespace Dalamud.Game.Internal.Gui.Structs
///
/// The flag to check for.
/// A value indicating whether the flag is present.
- public bool this[LootRuleFlags flag] => this.lootRules == 0 || (this.lootRules & (uint)flag) > 0;
+ public bool this[DutyFinderLootRuleFlags flag] => this.lootRules == 0 || (this.lootRules & (uint)flag) > 0;
///
/// Check if the given flag is present.
///
/// The flag to check for.
/// A value indicating whether the flag is present.
- public bool this[SearchAreaFlags flag] => this.searchArea == 0 || (this.searchArea & (uint)flag) > 0;
+ public bool this[DutyFinderSearchAreaFlags flag] => this.searchArea == 0 || (this.searchArea & (uint)flag) > 0;
#endregion
diff --git a/Dalamud/Game/Gui/PartyFinder/Types/PartyFinderListingEventArgs.cs b/Dalamud/Game/Gui/PartyFinder/Types/PartyFinderListingEventArgs.cs
new file mode 100644
index 000000000..ff6bd607d
--- /dev/null
+++ b/Dalamud/Game/Gui/PartyFinder/Types/PartyFinderListingEventArgs.cs
@@ -0,0 +1,27 @@
+namespace Dalamud.Game.Gui.PartyFinder.Types
+{
+ ///
+ /// This class represents additional arguments passed by the game.
+ ///
+ public class PartyFinderListingEventArgs
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The batch number.
+ internal PartyFinderListingEventArgs(int batchNumber)
+ {
+ this.BatchNumber = batchNumber;
+ }
+
+ ///
+ /// Gets the batch number.
+ ///
+ public int BatchNumber { get; }
+
+ ///
+ /// Gets or sets a value indicating whether the listing is visible.
+ ///
+ public bool Visible { get; set; } = true;
+ }
+}
diff --git a/Dalamud/Game/Internal/Gui/Structs/PartyFinderSlot.cs b/Dalamud/Game/Gui/PartyFinder/Types/PartyFinderSlot.cs
similarity index 97%
rename from Dalamud/Game/Internal/Gui/Structs/PartyFinderSlot.cs
rename to Dalamud/Game/Gui/PartyFinder/Types/PartyFinderSlot.cs
index 02b549842..d740c0c0a 100644
--- a/Dalamud/Game/Internal/Gui/Structs/PartyFinderSlot.cs
+++ b/Dalamud/Game/Gui/PartyFinder/Types/PartyFinderSlot.cs
@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
-namespace Dalamud.Game.Internal.Gui.Structs
+namespace Dalamud.Game.Gui.PartyFinder.Types
{
///
/// A player slot in a Party Finder listing.
diff --git a/Dalamud/Game/Internal/Gui/Structs/PartyFinder.cs b/Dalamud/Game/Internal/Gui/Structs/PartyFinder.cs
deleted file mode 100755
index 8fe3204b0..000000000
--- a/Dalamud/Game/Internal/Gui/Structs/PartyFinder.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-using System.Linq;
-using System.Runtime.InteropServices;
-
-namespace Dalamud.Game.Internal.Gui.Structs
-{
- ///
- /// PartyFinder related network structs and static constants.
- ///
- internal static class PartyFinder
- {
- ///
- /// The structure of the PartyFinder packet.
- ///
- [StructLayout(LayoutKind.Sequential)]
- internal readonly struct Packet
- {
- internal readonly int BatchNumber;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
- private readonly byte[] padding1;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
- internal readonly Listing[] Listings;
- }
-
- ///
- /// The structure of an individual listing within a packet.
- ///
- [StructLayout(LayoutKind.Sequential)]
- internal readonly struct Listing
- {
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
- private readonly byte[] header1;
-
- internal readonly uint Id;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
- private readonly byte[] header2;
-
- internal readonly uint ContentIdLower;
- private readonly ushort unknownShort1;
- private readonly ushort unknownShort2;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
- private readonly byte[] header3;
-
- internal readonly byte Category;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
- private readonly byte[] header4;
-
- internal readonly ushort Duty;
- internal readonly byte DutyType;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
- private readonly byte[] header5;
-
- internal readonly ushort World;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
- private readonly byte[] header6;
-
- internal readonly byte Objective;
- internal readonly byte BeginnersWelcome;
- internal readonly byte Conditions;
- internal readonly byte DutyFinderSettings;
- internal readonly byte LootRules;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
- private readonly byte[] header7; // all zero in every pf I've examined
-
- private readonly uint lastPatchHotfixTimestamp; // last time the servers were restarted?
- internal readonly ushort SecondsRemaining;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
- private readonly byte[] header8; // 00 00 01 00 00 00 in every pf I've examined
-
- internal readonly ushort MinimumItemLevel;
- internal readonly ushort HomeWorld;
- internal readonly ushort CurrentWorld;
-
- private readonly byte header9;
-
- internal readonly byte NumSlots;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
- private readonly byte[] header10;
-
- internal readonly byte SearchArea;
-
- private readonly byte header11;
-
- internal readonly byte NumParties;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
- private readonly byte[] header12; // 00 00 00 always. maybe numParties is a u32?
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
- internal readonly uint[] Slots;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
- internal readonly byte[] JobsPresent;
-
- // Note that ByValTStr will not work here because the strings are UTF-8 and there's only a CharSet for UTF-16 in C#.
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
- internal readonly byte[] Name;
-
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 192)]
- internal readonly byte[] Description;
-
- internal bool IsNull()
- {
- // a valid party finder must have at least one slot set
- return this.Slots.All(slot => slot == 0);
- }
- }
-
- ///
- /// PartyFinder packet constants.
- ///
- public static class PacketInfo
- {
- ///
- /// The size of the PartyFinder packet.
- ///
- public static readonly int PacketSize = Marshal.SizeOf();
- }
- }
-}
diff --git a/Dalamud/Game/Internal/Gui/Structs/PartyFinderTypes.cs b/Dalamud/Game/Internal/Gui/Structs/PartyFinderTypes.cs
deleted file mode 100644
index 7482b3ba3..000000000
--- a/Dalamud/Game/Internal/Gui/Structs/PartyFinderTypes.cs
+++ /dev/null
@@ -1,397 +0,0 @@
-using System;
-
-using Dalamud.Data;
-using Lumina.Excel.GeneratedSheets;
-
-namespace Dalamud.Game.Internal.Gui.Structs
-{
- ///
- /// Search area flags for the class.
- ///
- [Flags]
- public enum SearchAreaFlags : uint
- {
- ///
- /// Datacenter.
- ///
- DataCentre = 1 << 0,
-
- ///
- /// Private.
- ///
- Private = 1 << 1,
-
- ///
- /// Alliance raid.
- ///
- AllianceRaid = 1 << 2,
-
- ///
- /// World.
- ///
- World = 1 << 3,
-
- ///
- /// One player per job.
- ///
- OnePlayerPerJob = 1 << 5,
- }
-
- ///
- /// Job flags for the class.
- ///
- [Flags]
- public enum JobFlags
- {
- ///
- /// Gladiator (GLD).
- ///
- Gladiator = 1 << 1,
-
- ///
- /// Pugilist (PGL).
- ///
- Pugilist = 1 << 2,
-
- ///
- /// Marauder (MRD).
- ///
- Marauder = 1 << 3,
-
- ///
- /// Lancer (LNC).
- ///
- Lancer = 1 << 4,
-
- ///
- /// Archer (ARC).
- ///
- Archer = 1 << 5,
-
- ///
- /// Conjurer (CNJ).
- ///
- Conjurer = 1 << 6,
-
- ///
- /// Thaumaturge (THM).
- ///
- Thaumaturge = 1 << 7,
-
- ///
- /// Paladin (PLD).
- ///
- Paladin = 1 << 8,
-
- ///
- /// Monk (MNK).
- ///
- Monk = 1 << 9,
-
- ///
- /// Warrior (WAR).
- ///
- Warrior = 1 << 10,
-
- ///
- /// Dragoon (DRG).
- ///
- Dragoon = 1 << 11,
-
- ///
- /// Bard (BRD).
- ///
- Bard = 1 << 12,
-
- ///
- /// White mage (WHM).
- ///
- WhiteMage = 1 << 13,
-
- ///
- /// Black mage (BLM).
- ///
- BlackMage = 1 << 14,
-
- ///
- /// Arcanist (ACN).
- ///
- Arcanist = 1 << 15,
-
- ///
- /// Summoner (SMN).
- ///
- Summoner = 1 << 16,
-
- ///
- /// Scholar (SCH).
- ///
- Scholar = 1 << 17,
-
- ///
- /// Rogue (ROG).
- ///
- Rogue = 1 << 18,
-
- ///
- /// Ninja (NIN).
- ///
- Ninja = 1 << 19,
-
- ///
- /// Machinist (MCH).
- ///
- Machinist = 1 << 20,
-
- ///
- /// Dark Knight (DRK).
- ///
- DarkKnight = 1 << 21,
-
- ///
- /// Astrologian (AST).
- ///
- Astrologian = 1 << 22,
-
- ///
- /// Samurai (SAM).
- ///
- Samurai = 1 << 23,
-
- ///
- /// Red mage (RDM).
- ///
- RedMage = 1 << 24,
-
- ///
- /// Blue mage (BLM).
- ///
- BlueMage = 1 << 25,
-
- ///
- /// Gunbreaker (GNB).
- ///
- Gunbreaker = 1 << 26,
-
- ///
- /// Dancer (DNC).
- ///
- Dancer = 1 << 27,
- }
-
- ///
- /// Objective flags for the class.
- ///
- [Flags]
- public enum ObjectiveFlags : uint
- {
- ///
- /// No objective.
- ///
- None = 0,
-
- ///
- /// The duty completion objective.
- ///
- DutyCompletion = 1,
-
- ///
- /// The practice objective.
- ///
- Practice = 2,
-
- ///
- /// The loot objective.
- ///
- Loot = 4,
- }
-
- ///
- /// Condition flags for the class.
- ///
- [Flags]
- public enum ConditionFlags : uint
- {
- ///
- /// No duty condition.
- ///
- None = 1,
-
- ///
- /// The duty complete condition.
- ///
- DutyComplete = 2,
-
- ///
- /// The duty incomplete condition.
- ///
- DutyIncomplete = 4,
- }
-
- ///
- /// Duty finder settings flags for the class.
- ///
- [Flags]
- public enum DutyFinderSettingsFlags : uint
- {
- ///
- /// No duty finder settings.
- ///
- None = 0,
-
- ///
- /// The undersized party setting.
- ///
- UndersizedParty = 1 << 0,
-
- ///
- /// The minimum item level setting.
- ///
- MinimumItemLevel = 1 << 1,
-
- ///
- /// The silence echo setting.
- ///
- SilenceEcho = 1 << 2,
- }
-
- ///
- /// Loot rule flags for the class.
- ///
- [Flags]
- public enum LootRuleFlags : uint
- {
- ///
- /// No loot rules.
- ///
- None = 0,
-
- ///
- /// The greed only rule.
- ///
- GreedOnly = 1,
-
- ///
- /// The lootmaster rule.
- ///
- Lootmaster = 2,
- }
-
- ///
- /// Category flags for the class.
- ///
- public enum Category
- {
- ///
- /// The duty category.
- ///
- Duty = 0,
-
- ///
- /// The quest battle category.
- ///
- QuestBattles = 1 << 0,
-
- ///
- /// The fate category.
- ///
- Fates = 1 << 1,
-
- ///
- /// The treasure hunt category.
- ///
- TreasureHunt = 1 << 2,
-
- ///
- /// The hunt category.
- ///
- TheHunt = 1 << 3,
-
- ///
- /// The gathering forays category.
- ///
- GatheringForays = 1 << 4,
-
- ///
- /// The deep dungeons category.
- ///
- DeepDungeons = 1 << 5,
-
- ///
- /// The adventuring forays category.
- ///
- AdventuringForays = 1 << 6,
- }
-
- ///
- /// Duty type flags for the class.
- ///
- public enum DutyType
- {
- ///
- /// No duty type.
- ///
- Other = 0,
-
- ///
- /// The roulette duty type.
- ///
- Roulette = 1 << 0,
-
- ///
- /// The normal duty type.
- ///
- Normal = 1 << 1,
- }
-
- ///
- /// Extensions for the enum.
- ///
- public static class JobFlagsExt
- {
- ///
- /// Get the actual ClassJob from the in-game sheets for this JobFlags.
- ///
- /// A JobFlags enum member.
- /// A DataManager to get the ClassJob from.
- /// A ClassJob if found or null if not.
- public static ClassJob ClassJob(this JobFlags job, DataManager data)
- {
- var jobs = data.GetExcelSheet();
-
- uint? row = job switch
- {
- JobFlags.Gladiator => 1,
- JobFlags.Pugilist => 2,
- JobFlags.Marauder => 3,
- JobFlags.Lancer => 4,
- JobFlags.Archer => 5,
- JobFlags.Conjurer => 6,
- JobFlags.Thaumaturge => 7,
- JobFlags.Paladin => 19,
- JobFlags.Monk => 20,
- JobFlags.Warrior => 21,
- JobFlags.Dragoon => 22,
- JobFlags.Bard => 23,
- JobFlags.WhiteMage => 24,
- JobFlags.BlackMage => 25,
- JobFlags.Arcanist => 26,
- JobFlags.Summoner => 27,
- JobFlags.Scholar => 28,
- JobFlags.Rogue => 29,
- JobFlags.Ninja => 30,
- JobFlags.Machinist => 31,
- JobFlags.DarkKnight => 32,
- JobFlags.Astrologian => 33,
- JobFlags.Samurai => 34,
- JobFlags.RedMage => 35,
- JobFlags.BlueMage => 36,
- JobFlags.Gunbreaker => 37,
- JobFlags.Dancer => 38,
- _ => null,
- };
-
- return row == null ? null : jobs.GetRow((uint)row);
- }
- }
-}