mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-22 08:29:18 +01:00
Merge pull request #461 from daemitus/namespaces
This commit is contained in:
commit
fc9c324922
41 changed files with 722 additions and 724 deletions
|
|
@ -7,11 +7,9 @@ using System.Threading;
|
||||||
using Dalamud.Configuration.Internal;
|
using Dalamud.Configuration.Internal;
|
||||||
using Dalamud.Data;
|
using Dalamud.Data;
|
||||||
using Dalamud.Game;
|
using Dalamud.Game;
|
||||||
using Dalamud.Game.Addon;
|
|
||||||
using Dalamud.Game.ClientState;
|
using Dalamud.Game.ClientState;
|
||||||
using Dalamud.Game.Command;
|
using Dalamud.Game.Command;
|
||||||
using Dalamud.Game.Internal;
|
using Dalamud.Game.Internal;
|
||||||
using Dalamud.Game.Network;
|
|
||||||
using Dalamud.Game.Network.Internal;
|
using Dalamud.Game.Network.Internal;
|
||||||
using Dalamud.Game.Text.SeStringHandling;
|
using Dalamud.Game.Text.SeStringHandling;
|
||||||
using Dalamud.Hooking.Internal;
|
using Dalamud.Hooking.Internal;
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,13 @@ using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
using Dalamud.Game.Internal.Gui;
|
using Dalamud.Game.Gui;
|
||||||
using Dalamud.Game.Internal.Network;
|
|
||||||
using Dalamud.Game.Libc;
|
using Dalamud.Game.Libc;
|
||||||
|
using Dalamud.Game.Network;
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal
|
namespace Dalamud.Game
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class represents the Framework of the native game client and grants access to various subsystems.
|
/// This class represents the Framework of the native game client and grants access to various subsystems.
|
||||||
|
|
@ -90,7 +90,7 @@ namespace Dalamud.Game.Internal
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the stats history mapping.
|
/// Gets the stats history mapping.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static Dictionary<string, List<double>> StatsHistory = new();
|
public static Dictionary<string, List<double>> StatsHistory { get; } = new();
|
||||||
|
|
||||||
#region Subsystems
|
#region Subsystems
|
||||||
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal
|
using Dalamud.Game.Internal;
|
||||||
|
|
||||||
|
namespace Dalamud.Game
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The address resolver for the <see cref="Framework"/> class.
|
/// The address resolver for the <see cref="Framework"/> class.
|
||||||
|
|
@ -1,66 +1,63 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui.Addon
|
using Dalamud.Memory;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.Addons
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class represents an in-game UI "Addon".
|
/// This class represents an in-game UI "Addon".
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Addon
|
public unsafe class Addon
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// The address of the addon.
|
|
||||||
/// </summary>
|
|
||||||
public IntPtr Address;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The addon interop data.
|
|
||||||
/// </summary>
|
|
||||||
protected Structs.Addon addonStruct;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="Addon"/> class.
|
/// Initializes a new instance of the <see cref="Addon"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="address">The address of the addon.</param>
|
/// <param name="address">The address of the addon.</param>
|
||||||
/// <param name="addonStruct">The addon interop data.</param>
|
public Addon(IntPtr address)
|
||||||
public Addon(IntPtr address, Structs.Addon addonStruct)
|
|
||||||
{
|
{
|
||||||
this.Address = address;
|
this.Address = address;
|
||||||
this.addonStruct = addonStruct;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the address of the addon.
|
||||||
|
/// </summary>
|
||||||
|
public IntPtr Address { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the name of the addon.
|
/// Gets the name of the addon.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Name => this.addonStruct.Name;
|
public string Name => MemoryHelper.ReadString((IntPtr)this.Struct->Name, 0x20);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the X position of the addon on screen.
|
/// Gets the X position of the addon on screen.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public short X => this.addonStruct.X;
|
public short X => this.Struct->X;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the Y position of the addon on screen.
|
/// Gets the Y position of the addon on screen.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public short Y => this.addonStruct.Y;
|
public short Y => this.Struct->Y;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the scale of the addon.
|
/// Gets the scale of the addon.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float Scale => this.addonStruct.Scale;
|
public float Scale => this.Struct->Scale;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the width of the addon. This may include non-visible parts.
|
/// Gets the width of the addon. This may include non-visible parts.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public unsafe float Width => this.addonStruct.RootNode->Width * this.Scale;
|
public unsafe float Width => this.Struct->RootNode->Width * this.Scale;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the height of the addon. This may include non-visible parts.
|
/// Gets the height of the addon. This may include non-visible parts.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public unsafe float Height => this.addonStruct.RootNode->Height * this.Scale;
|
public unsafe float Height => this.Struct->RootNode->Height * this.Scale;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a value indicating whether the addon is visible.
|
/// Gets a value indicating whether the addon is visible.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool Visible => (this.addonStruct.Flags & 0x20) == 0x20;
|
public bool Visible => this.Struct->IsVisible;
|
||||||
|
|
||||||
|
private FFXIVClientStructs.FFXIV.Component.GUI.AtkUnitBase* Struct => (FFXIVClientStructs.FFXIV.Component.GUI.AtkUnitBase*)this.Address;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -10,7 +10,7 @@ using Dalamud.Game.Text.SeStringHandling.Payloads;
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui
|
namespace Dalamud.Game.Gui
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class handles interacting with the native chat UI.
|
/// This class handles interacting with the native chat UI.
|
||||||
|
|
@ -335,7 +335,7 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
this.LastLinkedItemId = Marshal.ReadInt32(itemInfoPtr, 8);
|
this.LastLinkedItemId = Marshal.ReadInt32(itemInfoPtr, 8);
|
||||||
this.LastLinkedItemFlags = Marshal.ReadByte(itemInfoPtr, 0x14);
|
this.LastLinkedItemFlags = Marshal.ReadByte(itemInfoPtr, 0x14);
|
||||||
|
|
||||||
Log.Debug($"HandlePopulateItemLinkDetour {linkObjectPtr} {itemInfoPtr} - linked:{this.LastLinkedItemId}");
|
Log.Verbose($"HandlePopulateItemLinkDetour {linkObjectPtr} {itemInfoPtr} - linked:{this.LastLinkedItemId}");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui
|
using Dalamud.Game.Internal;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The address resolver for the <see cref="ChatGui"/> class.
|
/// The address resolver for the <see cref="ChatGui"/> class.
|
||||||
|
|
@ -102,7 +104,7 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
protected override void Setup64Bit(SigScanner sig)
|
protected override void Setup64Bit(SigScanner sig)
|
||||||
{
|
{
|
||||||
// PrintMessage = sig.ScanText("4055 57 41 ?? 41 ?? 488DAC24D8FEFFFF 4881EC28020000 488B05???????? 4833C4 488985F0000000 4532D2 48894C2448"); LAST PART FOR 5.1???
|
// PrintMessage = sig.ScanText("4055 57 41 ?? 41 ?? 488DAC24D8FEFFFF 4881EC28020000 488B05???????? 4833C4 488985F0000000 4532D2 48894C2448"); LAST PART FOR 5.1???
|
||||||
this.PrintMessage = sig.ScanText("4055 53 56 4154 4157 48 8d ac 24 ?? ?? ?? ?? 48 81 ec 20 02 00 00 48 8b 05");
|
this.PrintMessage = sig.ScanText("40 55 53 56 41 54 41 57 48 8D AC 24 ?? ?? ?? ?? 48 81 EC 20 02 00 00 48 8B 05");
|
||||||
// PrintMessage = sig.ScanText("4055 57 41 ?? 41 ?? 488DAC24E8FEFFFF 4881EC18020000 488B05???????? 4833C4 488985E0000000 4532D2 48894C2438"); old
|
// PrintMessage = sig.ScanText("4055 57 41 ?? 41 ?? 488DAC24E8FEFFFF 4881EC18020000 488B05???????? 4833C4 488985E0000000 4532D2 48894C2438"); old
|
||||||
|
|
||||||
// PrintMessage = sig.ScanText("40 55 57 41 56 41 57 48 8D AC 24 D8 FE FF FF 48 81 EC 28 02 00 00 48 8B 05 63 47 4A 01 48 33 C4 48 89 85 F0 00 00 00 45 32 D2 48 89 4C 24 48 33");
|
// PrintMessage = sig.ScanText("40 55 57 41 56 41 57 48 8D AC 24 D8 FE FF FF 48 81 EC 28 02 00 00 48 8B 05 63 47 4A 01 48 33 C4 48 89 85 F0 00 00 00 45 32 D2 48 89 4C 24 48 33");
|
||||||
|
|
@ -1,25 +1,22 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Numerics;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
using Dalamud.Game.Gui.Addons;
|
||||||
|
using Dalamud.Game.Gui.PartyFinder;
|
||||||
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
|
using Dalamud.Utility;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using SharpDX;
|
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui
|
namespace Dalamud.Game.Gui
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A class handling many aspects of the in-game UI.
|
/// A class handling many aspects of the in-game UI.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class GameGui : IDisposable
|
public sealed class GameGui : IDisposable
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// The delegate of the native method that gets the Client::UI::UIModule address.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The Client::UI::UIModule address.</returns>
|
|
||||||
public readonly GetBaseUIObjectDelegate GetBaseUIObject;
|
|
||||||
|
|
||||||
private readonly Dalamud dalamud;
|
private readonly Dalamud dalamud;
|
||||||
private readonly GameGuiAddressResolver address;
|
private readonly GameGuiAddressResolver address;
|
||||||
|
|
||||||
|
|
@ -146,6 +143,12 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public event EventHandler<bool> OnUiHideToggled;
|
public event EventHandler<bool> OnUiHideToggled;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a callable delegate for the GetBaseUIObject game method.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The Client::UI::UIModule address.</returns>
|
||||||
|
public GetBaseUIObjectDelegate GetBaseUIObject { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the <see cref="Chat"/> instance.
|
/// Gets the <see cref="Chat"/> instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -227,13 +230,13 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
/// <param name="worldPos">Coordinates in the world.</param>
|
/// <param name="worldPos">Coordinates in the world.</param>
|
||||||
/// <param name="screenPos">Converted coordinates.</param>
|
/// <param name="screenPos">Converted coordinates.</param>
|
||||||
/// <returns>True if worldPos corresponds to a position in front of the camera.</returns>
|
/// <returns>True if worldPos corresponds to a position in front of the camera.</returns>
|
||||||
public bool WorldToScreen(Vector3 worldPos, out Vector2 screenPos)
|
public bool WorldToScreen(SharpDX.Vector3 worldPos, out SharpDX.Vector2 screenPos)
|
||||||
{
|
{
|
||||||
// Get base object with matrices
|
// Get base object with matrices
|
||||||
var matrixSingleton = this.getMatrixSingleton();
|
var matrixSingleton = this.getMatrixSingleton();
|
||||||
|
|
||||||
// Read current ViewProjectionMatrix plus game window size
|
// Read current ViewProjectionMatrix plus game window size
|
||||||
var viewProjectionMatrix = default(Matrix);
|
var viewProjectionMatrix = default(SharpDX.Matrix);
|
||||||
float width, height;
|
float width, height;
|
||||||
var windowPos = ImGuiHelpers.MainViewport.Pos;
|
var windowPos = ImGuiHelpers.MainViewport.Pos;
|
||||||
|
|
||||||
|
|
@ -248,9 +251,9 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
height = *(rawMatrix + 1);
|
height = *(rawMatrix + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3.Transform(ref worldPos, ref viewProjectionMatrix, out Vector3 pCoords);
|
SharpDX.Vector3.Transform(ref worldPos, ref viewProjectionMatrix, out SharpDX.Vector3 pCoords);
|
||||||
|
|
||||||
screenPos = new Vector2(pCoords.X / pCoords.Z, pCoords.Y / pCoords.Z);
|
screenPos = new SharpDX.Vector2(pCoords.X / pCoords.Z, pCoords.Y / pCoords.Z);
|
||||||
|
|
||||||
screenPos.X = (0.5f * width * (screenPos.X + 1f)) + windowPos.X;
|
screenPos.X = (0.5f * width * (screenPos.X + 1f)) + windowPos.X;
|
||||||
screenPos.Y = (0.5f * height * (1f - screenPos.Y)) + windowPos.Y;
|
screenPos.Y = (0.5f * height * (1f - screenPos.Y)) + windowPos.Y;
|
||||||
|
|
@ -260,6 +263,39 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
screenPos.Y > windowPos.Y && screenPos.Y < windowPos.Y + height;
|
screenPos.Y > windowPos.Y && screenPos.Y < windowPos.Y + height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts in-world coordinates to screen coordinates (upper left corner origin).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="worldPos">Coordinates in the world.</param>
|
||||||
|
/// <param name="screenPos">Converted coordinates.</param>
|
||||||
|
/// <returns>True if worldPos corresponds to a position in front of the camera.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// This overload requires a conversion to SharpDX vectors, however the penalty should be negligible.
|
||||||
|
/// </remarks>
|
||||||
|
public bool WorldToScreen(Vector3 worldPos, out Vector2 screenPos)
|
||||||
|
{
|
||||||
|
var result = this.WorldToScreen(worldPos.ToSharpDX(), out var sharpScreenPos);
|
||||||
|
screenPos = sharpScreenPos.ToSystem();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts in-world coordinates to screen coordinates (upper left corner origin).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="worldPos">Coordinates in the world.</param>
|
||||||
|
/// <param name="screenPos">Converted coordinates.</param>
|
||||||
|
/// <returns>True if worldPos corresponds to a position in front of the camera.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// This overload requires a conversion to SharpDX vectors, however the penalty should be negligible.
|
||||||
|
/// </remarks>
|
||||||
|
public bool WorldToScreen(Position3 worldPos, out Vector2 screenPos)
|
||||||
|
{
|
||||||
|
// This overload is necessary due to Positon3 implicit operators.
|
||||||
|
var result = this.WorldToScreen((SharpDX.Vector3)worldPos, out var sharpScreenPos);
|
||||||
|
screenPos = sharpScreenPos.ToSystem();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Converts screen coordinates to in-world coordinates via raycasting.
|
/// Converts screen coordinates to in-world coordinates via raycasting.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -267,7 +303,7 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
/// <param name="worldPos">Converted coordinates.</param>
|
/// <param name="worldPos">Converted coordinates.</param>
|
||||||
/// <param name="rayDistance">How far to search for a collision.</param>
|
/// <param name="rayDistance">How far to search for a collision.</param>
|
||||||
/// <returns>True if successful. On false, worldPos's contents are undefined.</returns>
|
/// <returns>True if successful. On false, worldPos's contents are undefined.</returns>
|
||||||
public bool ScreenToWorld(Vector2 screenPos, out Vector3 worldPos, float rayDistance = 100000.0f)
|
public bool ScreenToWorld(SharpDX.Vector2 screenPos, out SharpDX.Vector3 worldPos, float rayDistance = 100000.0f)
|
||||||
{
|
{
|
||||||
// The game is only visible in the main viewport, so if the cursor is outside
|
// The game is only visible in the main viewport, so if the cursor is outside
|
||||||
// of the game window, do not bother calculating anything
|
// of the game window, do not bother calculating anything
|
||||||
|
|
@ -285,7 +321,7 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
var matrixSingleton = this.getMatrixSingleton();
|
var matrixSingleton = this.getMatrixSingleton();
|
||||||
|
|
||||||
// Read current ViewProjectionMatrix plus game window size
|
// Read current ViewProjectionMatrix plus game window size
|
||||||
var viewProjectionMatrix = default(Matrix);
|
var viewProjectionMatrix = default(SharpDX.Matrix);
|
||||||
float width, height;
|
float width, height;
|
||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
|
|
@ -300,18 +336,18 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
|
|
||||||
viewProjectionMatrix.Invert();
|
viewProjectionMatrix.Invert();
|
||||||
|
|
||||||
var localScreenPos = new Vector2(screenPos.X - windowPos.X, screenPos.Y - windowPos.Y);
|
var localScreenPos = new SharpDX.Vector2(screenPos.X - windowPos.X, screenPos.Y - windowPos.Y);
|
||||||
var screenPos3D = new Vector3
|
var screenPos3D = new SharpDX.Vector3
|
||||||
{
|
{
|
||||||
X = (localScreenPos.X / width * 2.0f) - 1.0f,
|
X = (localScreenPos.X / width * 2.0f) - 1.0f,
|
||||||
Y = -((localScreenPos.Y / height * 2.0f) - 1.0f),
|
Y = -((localScreenPos.Y / height * 2.0f) - 1.0f),
|
||||||
Z = 0,
|
Z = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
Vector3.TransformCoordinate(ref screenPos3D, ref viewProjectionMatrix, out var camPos);
|
SharpDX.Vector3.TransformCoordinate(ref screenPos3D, ref viewProjectionMatrix, out var camPos);
|
||||||
|
|
||||||
screenPos3D.Z = 1;
|
screenPos3D.Z = 1;
|
||||||
Vector3.TransformCoordinate(ref screenPos3D, ref viewProjectionMatrix, out var camPosOne);
|
SharpDX.Vector3.TransformCoordinate(ref screenPos3D, ref viewProjectionMatrix, out var camPosOne);
|
||||||
|
|
||||||
var clipPos = camPosOne - camPos;
|
var clipPos = camPosOne - camPos;
|
||||||
clipPos.Normalize();
|
clipPos.Normalize();
|
||||||
|
|
@ -341,7 +377,7 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
worldPos = new Vector3
|
worldPos = new SharpDX.Vector3
|
||||||
{
|
{
|
||||||
X = worldPosArray[0],
|
X = worldPosArray[0],
|
||||||
Y = worldPosArray[1],
|
Y = worldPosArray[1],
|
||||||
|
|
@ -352,6 +388,23 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
return isSuccess;
|
return isSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts screen coordinates to in-world coordinates via raycasting.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="screenPos">Screen coordinates.</param>
|
||||||
|
/// <param name="worldPos">Converted coordinates.</param>
|
||||||
|
/// <param name="rayDistance">How far to search for a collision.</param>
|
||||||
|
/// <returns>True if successful. On false, worldPos's contents are undefined.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// This overload requires a conversion to SharpDX vectors, however the penalty should be negligible.
|
||||||
|
/// </remarks>
|
||||||
|
public bool ScreenToWorld(Vector2 screenPos, out Vector3 worldPos, float rayDistance = 100000.0f)
|
||||||
|
{
|
||||||
|
var result = this.ScreenToWorld(screenPos.ToSharpDX(), out var sharpworldPos);
|
||||||
|
worldPos = sharpworldPos.ToSystem();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a pointer to the game's UI module.
|
/// Gets a pointer to the game's UI module.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -379,12 +432,14 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
/// <param name="name">The addon name.</param>
|
/// <param name="name">The addon name.</param>
|
||||||
/// <param name="index">The index of the addon, starting at 1.</param>
|
/// <param name="index">The index of the addon, starting at 1.</param>
|
||||||
/// <returns>The native memory representation of the addon, if it exists.</returns>
|
/// <returns>The native memory representation of the addon, if it exists.</returns>
|
||||||
public Addon.Addon GetAddonByName(string name, int index)
|
public Addon GetAddonByName(string name, int index)
|
||||||
{
|
{
|
||||||
var addonMem = this.GetUiObjectByName(name, index);
|
var address = this.GetUiObjectByName(name, index);
|
||||||
if (addonMem == IntPtr.Zero) return null;
|
|
||||||
var addonStruct = Marshal.PtrToStructure<Structs.Addon>(addonMem);
|
if (address == IntPtr.Zero)
|
||||||
return new Addon.Addon(addonMem, addonStruct);
|
return null;
|
||||||
|
|
||||||
|
return new Addon(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui
|
namespace Dalamud.Game.Gui
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The address resolver for the <see cref="GameGui"/> class.
|
/// The address resolver for the <see cref="GameGui"/> class.
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
namespace Dalamud.Game.Internal.Gui
|
namespace Dalamud.Game.Gui
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ActionKinds used in AgentActionDetail.
|
/// ActionKinds used in AgentActionDetail.
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
namespace Dalamud.Game.Internal.Gui
|
namespace Dalamud.Game.Gui
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class represents the hotbar action currently hovered over by the cursor.
|
/// This class represents the hotbar action currently hovered over by the cursor.
|
||||||
28
Dalamud/Game/Gui/PartyFinder/Internal/PartyFinderPacket.cs
Normal file
28
Dalamud/Game/Gui/PartyFinder/Internal/PartyFinderPacket.cs
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Internal
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The structure of the PartyFinder packet.
|
||||||
|
/// </summary>
|
||||||
|
[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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the size of this packet.
|
||||||
|
/// </summary>
|
||||||
|
internal static int PacketSize { get; } = Marshal.SizeOf<PartyFinderPacket>();
|
||||||
|
|
||||||
|
internal readonly int BatchNumber;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||||
|
private readonly byte[] padding1;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
||||||
|
internal readonly PartyFinderPacketListing[] Listings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Internal
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The structure of an individual listing within a packet.
|
||||||
|
/// </summary>
|
||||||
|
[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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
4
Dalamud/Game/Internal/Gui/PartyFinderAddressResolver.cs → Dalamud/Game/Gui/PartyFinder/PartyFinderAddressResolver.cs
Executable file → Normal file
4
Dalamud/Game/Internal/Gui/PartyFinderAddressResolver.cs → Dalamud/Game/Gui/PartyFinder/PartyFinderAddressResolver.cs
Executable file → Normal file
|
|
@ -1,11 +1,11 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui
|
namespace Dalamud.Game.Gui.PartyFinder
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The address resolver for the <see cref="PartyFinderGui"/> class.
|
/// The address resolver for the <see cref="PartyFinderGui"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class PartyFinderAddressResolver : BaseAddressResolver
|
public class PartyFinderAddressResolver : BaseAddressResolver
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the address of the native ReceiveListing method.
|
/// Gets the address of the native ReceiveListing method.
|
||||||
36
Dalamud/Game/Internal/Gui/PartyFinderGui.cs → Dalamud/Game/Gui/PartyFinder/PartyFinderGui.cs
Executable file → Normal file
36
Dalamud/Game/Internal/Gui/PartyFinderGui.cs → Dalamud/Game/Gui/PartyFinder/PartyFinderGui.cs
Executable file → Normal file
|
|
@ -1,11 +1,12 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
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 Dalamud.Hooking;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui
|
namespace Dalamud.Game.Gui.PartyFinder
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class handles interacting with the native PartyFinder window.
|
/// This class handles interacting with the native PartyFinder window.
|
||||||
|
|
@ -30,7 +31,7 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
this.address = new PartyFinderAddressResolver();
|
this.address = new PartyFinderAddressResolver();
|
||||||
this.address.Setup(scanner);
|
this.address.Setup(scanner);
|
||||||
|
|
||||||
this.memory = Marshal.AllocHGlobal(PartyFinder.PacketInfo.PacketSize);
|
this.memory = Marshal.AllocHGlobal(PartyFinderPacket.PacketSize);
|
||||||
|
|
||||||
this.receiveListingHook = new Hook<ReceiveListingDelegate>(this.address.ReceiveListing, new ReceiveListingDelegate(this.HandleReceiveListingDetour));
|
this.receiveListingHook = new Hook<ReceiveListingDelegate>(this.address.ReceiveListing, new ReceiveListingDelegate(this.HandleReceiveListingDetour));
|
||||||
}
|
}
|
||||||
|
|
@ -87,7 +88,7 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
{
|
{
|
||||||
var dataPtr = data + 0x10;
|
var dataPtr = data + 0x10;
|
||||||
|
|
||||||
var packet = Marshal.PtrToStructure<PartyFinder.Packet>(dataPtr);
|
var packet = Marshal.PtrToStructure<PartyFinderPacket>(dataPtr);
|
||||||
|
|
||||||
// rewriting is an expensive operation, so only do it if necessary
|
// rewriting is an expensive operation, so only do it if necessary
|
||||||
var needToRewrite = false;
|
var needToRewrite = false;
|
||||||
|
|
@ -125,33 +126,8 @@ namespace Dalamud.Game.Internal.Gui
|
||||||
// copy our new memory over the game's
|
// copy our new memory over the game's
|
||||||
unsafe
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This class represents additional arguments passed by the game.
|
|
||||||
/// </summary>
|
|
||||||
public class PartyFinderListingEventArgs
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="PartyFinderListingEventArgs"/> class.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="batchNumber">The batch number.</param>
|
|
||||||
internal PartyFinderListingEventArgs(int batchNumber)
|
|
||||||
{
|
|
||||||
this.BatchNumber = batchNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the batch number.
|
|
||||||
/// </summary>
|
|
||||||
public int BatchNumber { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets a value indicating whether the listing is visible.
|
|
||||||
/// </summary>
|
|
||||||
public bool Visible { get; set; } = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
48
Dalamud/Game/Gui/PartyFinder/Types/DutyFinderCategory.cs
Normal file
48
Dalamud/Game/Gui/PartyFinder/Types/DutyFinderCategory.cs
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Category flags for the <see cref="PartyFinder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
public enum DutyFinderCategory
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The duty category.
|
||||||
|
/// </summary>
|
||||||
|
Duty = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The quest battle category.
|
||||||
|
/// </summary>
|
||||||
|
QuestBattles = 1 << 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The fate category.
|
||||||
|
/// </summary>
|
||||||
|
Fates = 1 << 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The treasure hunt category.
|
||||||
|
/// </summary>
|
||||||
|
TreasureHunt = 1 << 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The hunt category.
|
||||||
|
/// </summary>
|
||||||
|
TheHunt = 1 << 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The gathering forays category.
|
||||||
|
/// </summary>
|
||||||
|
GatheringForays = 1 << 4,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The deep dungeons category.
|
||||||
|
/// </summary>
|
||||||
|
DeepDungeons = 1 << 5,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The adventuring forays category.
|
||||||
|
/// </summary>
|
||||||
|
AdventuringForays = 1 << 6,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Condition flags for the <see cref="PartyFinder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum DutyFinderConditionFlags : uint
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// No duty condition.
|
||||||
|
/// </summary>
|
||||||
|
None = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The duty complete condition.
|
||||||
|
/// </summary>
|
||||||
|
DutyComplete = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The duty incomplete condition.
|
||||||
|
/// </summary>
|
||||||
|
DutyIncomplete = 4,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Loot rule flags for the <see cref="PartyFinder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum DutyFinderLootRuleFlags : uint
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// No loot rules.
|
||||||
|
/// </summary>
|
||||||
|
None = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The greed only rule.
|
||||||
|
/// </summary>
|
||||||
|
GreedOnly = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The lootmaster rule.
|
||||||
|
/// </summary>
|
||||||
|
Lootmaster = 2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Objective flags for the <see cref="PartyFinder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum DutyFinderObjectiveFlags : uint
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// No objective.
|
||||||
|
/// </summary>
|
||||||
|
None = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The duty completion objective.
|
||||||
|
/// </summary>
|
||||||
|
DutyCompletion = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The practice objective.
|
||||||
|
/// </summary>
|
||||||
|
Practice = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The loot objective.
|
||||||
|
/// </summary>
|
||||||
|
Loot = 4,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Search area flags for the <see cref="PartyFinder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum DutyFinderSearchAreaFlags : uint
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Datacenter.
|
||||||
|
/// </summary>
|
||||||
|
DataCentre = 1 << 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Private.
|
||||||
|
/// </summary>
|
||||||
|
Private = 1 << 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Alliance raid.
|
||||||
|
/// </summary>
|
||||||
|
AllianceRaid = 1 << 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// World.
|
||||||
|
/// </summary>
|
||||||
|
World = 1 << 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// One player per job.
|
||||||
|
/// </summary>
|
||||||
|
OnePlayerPerJob = 1 << 5,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Duty finder settings flags for the <see cref="PartyFinder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum DutyFinderSettingsFlags : uint
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// No duty finder settings.
|
||||||
|
/// </summary>
|
||||||
|
None = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The undersized party setting.
|
||||||
|
/// </summary>
|
||||||
|
UndersizedParty = 1 << 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The minimum item level setting.
|
||||||
|
/// </summary>
|
||||||
|
MinimumItemLevel = 1 << 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The silence echo setting.
|
||||||
|
/// </summary>
|
||||||
|
SilenceEcho = 1 << 2,
|
||||||
|
}
|
||||||
|
}
|
||||||
23
Dalamud/Game/Gui/PartyFinder/Types/DutyType.cs
Normal file
23
Dalamud/Game/Gui/PartyFinder/Types/DutyType.cs
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Duty type flags for the <see cref="PartyFinder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
public enum DutyType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// No duty type.
|
||||||
|
/// </summary>
|
||||||
|
Other = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The roulette duty type.
|
||||||
|
/// </summary>
|
||||||
|
Roulette = 1 << 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The normal duty type.
|
||||||
|
/// </summary>
|
||||||
|
Normal = 1 << 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
146
Dalamud/Game/Gui/PartyFinder/Types/JobFlags.cs
Normal file
146
Dalamud/Game/Gui/PartyFinder/Types/JobFlags.cs
Normal file
|
|
@ -0,0 +1,146 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Job flags for the <see cref="PartyFinder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum JobFlags
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gladiator (GLD).
|
||||||
|
/// </summary>
|
||||||
|
Gladiator = 1 << 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pugilist (PGL).
|
||||||
|
/// </summary>
|
||||||
|
Pugilist = 1 << 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Marauder (MRD).
|
||||||
|
/// </summary>
|
||||||
|
Marauder = 1 << 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Lancer (LNC).
|
||||||
|
/// </summary>
|
||||||
|
Lancer = 1 << 4,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Archer (ARC).
|
||||||
|
/// </summary>
|
||||||
|
Archer = 1 << 5,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Conjurer (CNJ).
|
||||||
|
/// </summary>
|
||||||
|
Conjurer = 1 << 6,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Thaumaturge (THM).
|
||||||
|
/// </summary>
|
||||||
|
Thaumaturge = 1 << 7,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Paladin (PLD).
|
||||||
|
/// </summary>
|
||||||
|
Paladin = 1 << 8,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Monk (MNK).
|
||||||
|
/// </summary>
|
||||||
|
Monk = 1 << 9,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Warrior (WAR).
|
||||||
|
/// </summary>
|
||||||
|
Warrior = 1 << 10,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Dragoon (DRG).
|
||||||
|
/// </summary>
|
||||||
|
Dragoon = 1 << 11,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bard (BRD).
|
||||||
|
/// </summary>
|
||||||
|
Bard = 1 << 12,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// White mage (WHM).
|
||||||
|
/// </summary>
|
||||||
|
WhiteMage = 1 << 13,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Black mage (BLM).
|
||||||
|
/// </summary>
|
||||||
|
BlackMage = 1 << 14,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Arcanist (ACN).
|
||||||
|
/// </summary>
|
||||||
|
Arcanist = 1 << 15,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Summoner (SMN).
|
||||||
|
/// </summary>
|
||||||
|
Summoner = 1 << 16,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Scholar (SCH).
|
||||||
|
/// </summary>
|
||||||
|
Scholar = 1 << 17,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Rogue (ROG).
|
||||||
|
/// </summary>
|
||||||
|
Rogue = 1 << 18,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ninja (NIN).
|
||||||
|
/// </summary>
|
||||||
|
Ninja = 1 << 19,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Machinist (MCH).
|
||||||
|
/// </summary>
|
||||||
|
Machinist = 1 << 20,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Dark Knight (DRK).
|
||||||
|
/// </summary>
|
||||||
|
DarkKnight = 1 << 21,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Astrologian (AST).
|
||||||
|
/// </summary>
|
||||||
|
Astrologian = 1 << 22,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Samurai (SAM).
|
||||||
|
/// </summary>
|
||||||
|
Samurai = 1 << 23,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Red mage (RDM).
|
||||||
|
/// </summary>
|
||||||
|
RedMage = 1 << 24,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Blue mage (BLM).
|
||||||
|
/// </summary>
|
||||||
|
BlueMage = 1 << 25,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gunbreaker (GNB).
|
||||||
|
/// </summary>
|
||||||
|
Gunbreaker = 1 << 26,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Dancer (DNC).
|
||||||
|
/// </summary>
|
||||||
|
Dancer = 1 << 27,
|
||||||
|
}
|
||||||
|
}
|
||||||
27
Dalamud/Game/Gui/PartyFinder/Types/JobFlagsExtensions.cs
Normal file
27
Dalamud/Game/Gui/PartyFinder/Types/JobFlagsExtensions.cs
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
using Dalamud.Data;
|
||||||
|
using Lumina.Excel.GeneratedSheets;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Extensions for the <see cref="JobFlags"/> enum.
|
||||||
|
/// </summary>
|
||||||
|
public static class JobFlagsExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Get the actual ClassJob from the in-game sheets for this JobFlags.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="job">A JobFlags enum member.</param>
|
||||||
|
/// <param name="data">A DataManager to get the ClassJob from.</param>
|
||||||
|
/// <returns>A ClassJob if found or null if not.</returns>
|
||||||
|
public static ClassJob ClassJob(this JobFlags job, DataManager data)
|
||||||
|
{
|
||||||
|
var result = Math.Log2((double)job);
|
||||||
|
return result % 1 == 0
|
||||||
|
? data.GetExcelSheet<ClassJob>().GetRow((uint)result)
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,10 +3,11 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
using Dalamud.Data;
|
using Dalamud.Data;
|
||||||
|
using Dalamud.Game.Gui.PartyFinder.Internal;
|
||||||
using Dalamud.Game.Text.SeStringHandling;
|
using Dalamud.Game.Text.SeStringHandling;
|
||||||
using Lumina.Excel.GeneratedSheets;
|
using Lumina.Excel.GeneratedSheets;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui.Structs
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A single listing in party finder.
|
/// A single listing in party finder.
|
||||||
|
|
@ -31,7 +32,7 @@ namespace Dalamud.Game.Internal.Gui.Structs
|
||||||
/// <param name="listing">The interop listing data.</param>
|
/// <param name="listing">The interop listing data.</param>
|
||||||
/// <param name="dataManager">The DataManager instance.</param>
|
/// <param name="dataManager">The DataManager instance.</param>
|
||||||
/// <param name="seStringManager">The SeStringManager instance.</param>
|
/// <param name="seStringManager">The SeStringManager instance.</param>
|
||||||
internal PartyFinderListing(PartyFinder.Listing listing, DataManager dataManager, SeStringManager seStringManager)
|
internal PartyFinderListing(PartyFinderPacketListing listing, DataManager dataManager, SeStringManager seStringManager)
|
||||||
{
|
{
|
||||||
this.objective = listing.Objective;
|
this.objective = listing.Objective;
|
||||||
this.conditions = listing.Conditions;
|
this.conditions = listing.Conditions;
|
||||||
|
|
@ -48,7 +49,7 @@ namespace Dalamud.Game.Internal.Gui.Structs
|
||||||
this.World = new Lazy<World>(() => dataManager.GetExcelSheet<World>().GetRow(listing.World));
|
this.World = new Lazy<World>(() => dataManager.GetExcelSheet<World>().GetRow(listing.World));
|
||||||
this.HomeWorld = new Lazy<World>(() => dataManager.GetExcelSheet<World>().GetRow(listing.HomeWorld));
|
this.HomeWorld = new Lazy<World>(() => dataManager.GetExcelSheet<World>().GetRow(listing.HomeWorld));
|
||||||
this.CurrentWorld = new Lazy<World>(() => dataManager.GetExcelSheet<World>().GetRow(listing.CurrentWorld));
|
this.CurrentWorld = new Lazy<World>(() => dataManager.GetExcelSheet<World>().GetRow(listing.CurrentWorld));
|
||||||
this.Category = (Category)listing.Category;
|
this.Category = (DutyFinderCategory)listing.Category;
|
||||||
this.RawDuty = listing.Duty;
|
this.RawDuty = listing.Duty;
|
||||||
this.Duty = new Lazy<ContentFinderCondition>(() => dataManager.GetExcelSheet<ContentFinderCondition>().GetRow(listing.Duty));
|
this.Duty = new Lazy<ContentFinderCondition>(() => dataManager.GetExcelSheet<ContentFinderCondition>().GetRow(listing.Duty));
|
||||||
this.DutyType = (DutyType)listing.DutyType;
|
this.DutyType = (DutyType)listing.DutyType;
|
||||||
|
|
@ -103,7 +104,7 @@ namespace Dalamud.Game.Internal.Gui.Structs
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the Party Finder category this listing is listed under.
|
/// Gets the Party Finder category this listing is listed under.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Category Category { get; }
|
public DutyFinderCategory Category { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the row ID of the duty this listing is for. May be 0 for non-duty listings.
|
/// 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
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the objective of this listing.
|
/// Gets the objective of this listing.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ObjectiveFlags Objective => (ObjectiveFlags)this.objective;
|
public DutyFinderObjectiveFlags Objective => (DutyFinderObjectiveFlags)this.objective;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the conditions of this listing.
|
/// Gets the conditions of this listing.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ConditionFlags Conditions => (ConditionFlags)this.conditions;
|
public DutyFinderConditionFlags Conditions => (DutyFinderConditionFlags)this.conditions;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the Duty Finder settings that will be used for this listing.
|
/// Gets the Duty Finder settings that will be used for this listing.
|
||||||
|
|
@ -169,13 +170,13 @@ namespace Dalamud.Game.Internal.Gui.Structs
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the loot rules that will be used for this listing.
|
/// Gets the loot rules that will be used for this listing.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public LootRuleFlags LootRules => (LootRuleFlags)this.lootRules;
|
public DutyFinderLootRuleFlags LootRules => (DutyFinderLootRuleFlags)this.lootRules;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets where this listing is searching. Note that this is also used for denoting alliance raid listings and one
|
/// Gets where this listing is searching. Note that this is also used for denoting alliance raid listings and one
|
||||||
/// player per job.
|
/// player per job.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SearchAreaFlags SearchArea => (SearchAreaFlags)this.searchArea;
|
public DutyFinderSearchAreaFlags SearchArea => (DutyFinderSearchAreaFlags)this.searchArea;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a list of the class/job IDs that are currently present in the party.
|
/// 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
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="flag">The flag to check for.</param>
|
/// <param name="flag">The flag to check for.</param>
|
||||||
/// <returns>A value indicating whether the flag is present.</returns>
|
/// <returns>A value indicating whether the flag is present.</returns>
|
||||||
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;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check if the given flag is present.
|
/// Check if the given flag is present.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="flag">The flag to check for.</param>
|
/// <param name="flag">The flag to check for.</param>
|
||||||
/// <returns>A value indicating whether the flag is present.</returns>
|
/// <returns>A value indicating whether the flag is present.</returns>
|
||||||
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;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check if the given flag is present.
|
/// Check if the given flag is present.
|
||||||
|
|
@ -215,14 +216,14 @@ namespace Dalamud.Game.Internal.Gui.Structs
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="flag">The flag to check for.</param>
|
/// <param name="flag">The flag to check for.</param>
|
||||||
/// <returns>A value indicating whether the flag is present.</returns>
|
/// <returns>A value indicating whether the flag is present.</returns>
|
||||||
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;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check if the given flag is present.
|
/// Check if the given flag is present.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="flag">The flag to check for.</param>
|
/// <param name="flag">The flag to check for.</param>
|
||||||
/// <returns>A value indicating whether the flag is present.</returns>
|
/// <returns>A value indicating whether the flag is present.</returns>
|
||||||
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
|
#endregion
|
||||||
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This class represents additional arguments passed by the game.
|
||||||
|
/// </summary>
|
||||||
|
public class PartyFinderListingEventArgs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="PartyFinderListingEventArgs"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="batchNumber">The batch number.</param>
|
||||||
|
internal PartyFinderListingEventArgs(int batchNumber)
|
||||||
|
{
|
||||||
|
this.BatchNumber = batchNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the batch number.
|
||||||
|
/// </summary>
|
||||||
|
public int BatchNumber { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether the listing is visible.
|
||||||
|
/// </summary>
|
||||||
|
public bool Visible { get; set; } = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui.Structs
|
namespace Dalamud.Game.Gui.PartyFinder.Types
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A player slot in a Party Finder listing.
|
/// A player slot in a Party Finder listing.
|
||||||
2
Dalamud/Game/Internal/Gui/Toast/QuestToastOptions.cs → Dalamud/Game/Gui/Toast/QuestToastOptions.cs
Executable file → Normal file
2
Dalamud/Game/Internal/Gui/Toast/QuestToastOptions.cs → Dalamud/Game/Gui/Toast/QuestToastOptions.cs
Executable file → Normal file
|
|
@ -1,4 +1,4 @@
|
||||||
namespace Dalamud.Game.Internal.Gui.Toast
|
namespace Dalamud.Game.Gui.Toast
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class represents options that can be used with the <see cref="ToastGui"/> class for the quest toast variant.
|
/// This class represents options that can be used with the <see cref="ToastGui"/> class for the quest toast variant.
|
||||||
2
Dalamud/Game/Internal/Gui/Toast/QuestToastPosition.cs → Dalamud/Game/Gui/Toast/QuestToastPosition.cs
Executable file → Normal file
2
Dalamud/Game/Internal/Gui/Toast/QuestToastPosition.cs → Dalamud/Game/Gui/Toast/QuestToastPosition.cs
Executable file → Normal file
|
|
@ -1,4 +1,4 @@
|
||||||
namespace Dalamud.Game.Internal.Gui.Toast
|
namespace Dalamud.Game.Gui.Toast
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The alignment of native quest toast windows.
|
/// The alignment of native quest toast windows.
|
||||||
2
Dalamud/Game/Internal/Gui/Toast/ToastOptions.cs → Dalamud/Game/Gui/Toast/ToastOptions.cs
Executable file → Normal file
2
Dalamud/Game/Internal/Gui/Toast/ToastOptions.cs → Dalamud/Game/Gui/Toast/ToastOptions.cs
Executable file → Normal file
|
|
@ -1,4 +1,4 @@
|
||||||
namespace Dalamud.Game.Internal.Gui.Toast
|
namespace Dalamud.Game.Gui.Toast
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class represents options that can be used with the <see cref="ToastGui"/> class.
|
/// This class represents options that can be used with the <see cref="ToastGui"/> class.
|
||||||
2
Dalamud/Game/Internal/Gui/Toast/ToastPosition.cs → Dalamud/Game/Gui/Toast/ToastPosition.cs
Executable file → Normal file
2
Dalamud/Game/Internal/Gui/Toast/ToastPosition.cs → Dalamud/Game/Gui/Toast/ToastPosition.cs
Executable file → Normal file
|
|
@ -1,4 +1,4 @@
|
||||||
namespace Dalamud.Game.Internal.Gui.Toast
|
namespace Dalamud.Game.Gui.Toast
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The positioning of native toast windows.
|
/// The positioning of native toast windows.
|
||||||
2
Dalamud/Game/Internal/Gui/Toast/ToastSpeed.cs → Dalamud/Game/Gui/Toast/ToastSpeed.cs
Executable file → Normal file
2
Dalamud/Game/Internal/Gui/Toast/ToastSpeed.cs → Dalamud/Game/Gui/Toast/ToastSpeed.cs
Executable file → Normal file
|
|
@ -1,4 +1,4 @@
|
||||||
namespace Dalamud.Game.Internal.Gui.Toast
|
namespace Dalamud.Game.Gui.Toast
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The speed at which native toast windows will persist.
|
/// The speed at which native toast windows will persist.
|
||||||
4
Dalamud/Game/Internal/Gui/ToastGui.cs → Dalamud/Game/Gui/ToastGui.cs
Executable file → Normal file
4
Dalamud/Game/Internal/Gui/ToastGui.cs → Dalamud/Game/Gui/ToastGui.cs
Executable file → Normal file
|
|
@ -2,11 +2,11 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
using Dalamud.Game.Internal.Gui.Toast;
|
using Dalamud.Game.Gui.Toast;
|
||||||
using Dalamud.Game.Text.SeStringHandling;
|
using Dalamud.Game.Text.SeStringHandling;
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui
|
namespace Dalamud.Game.Gui
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class facilitates interacting with and creating native toast windows.
|
/// This class facilitates interacting with and creating native toast windows.
|
||||||
4
Dalamud/Game/Internal/Gui/ToastGuiAddressResolver.cs → Dalamud/Game/Gui/ToastGuiAddressResolver.cs
Executable file → Normal file
4
Dalamud/Game/Internal/Gui/ToastGuiAddressResolver.cs → Dalamud/Game/Gui/ToastGuiAddressResolver.cs
Executable file → Normal file
|
|
@ -1,6 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui
|
using Dalamud.Game.Internal;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Gui
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An address resolver for the <see cref="ToastGui"/> class.
|
/// An address resolver for the <see cref="ToastGui"/> class.
|
||||||
|
|
@ -8,7 +8,7 @@ namespace Dalamud.Game.Internal
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class disables anti-debug functionality in the game client.
|
/// This class disables anti-debug functionality in the game client.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed partial class AntiDebug
|
internal sealed partial class AntiDebug
|
||||||
{
|
{
|
||||||
private readonly byte[] nop = new byte[] { 0x31, 0xC0, 0x90, 0x90, 0x90, 0x90 };
|
private readonly byte[] nop = new byte[] { 0x31, 0xC0, 0x90, 0x90, 0x90, 0x90 };
|
||||||
private byte[] original;
|
private byte[] original;
|
||||||
|
|
@ -79,7 +79,7 @@ namespace Dalamud.Game.Internal
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Implementing IDisposable.
|
/// Implementing IDisposable.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed partial class AntiDebug : IDisposable
|
internal sealed partial class AntiDebug : IDisposable
|
||||||
{
|
{
|
||||||
private bool disposed = false;
|
private bool disposed = false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ using FFXIVClientStructs.FFXIV.Component.GUI;
|
||||||
|
|
||||||
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;
|
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;
|
||||||
|
|
||||||
namespace Dalamud.Game.Addon
|
namespace Dalamud.Game.Internal
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class implements in-game Dalamud options in the in-game System menu.
|
/// This class implements in-game Dalamud options in the in-game System menu.
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
using FFXIVClientStructs.FFXIV.Component.GUI;
|
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui.Structs
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Native memory representation of an FFXIV UI addon.
|
|
||||||
/// </summary>
|
|
||||||
[StructLayout(LayoutKind.Explicit)]
|
|
||||||
public struct Addon
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The name of the addon.
|
|
||||||
/// </summary>
|
|
||||||
[FieldOffset(AddonOffsets.Name)]
|
|
||||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
|
|
||||||
public string Name;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Various flags that can be set on the addon.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// This is a bitfield.
|
|
||||||
/// </remarks>
|
|
||||||
[FieldOffset(AddonOffsets.Flags)]
|
|
||||||
public byte Flags;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The X position of the addon on screen.
|
|
||||||
/// </summary>
|
|
||||||
[FieldOffset(AddonOffsets.X)]
|
|
||||||
public short X;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The Y position of the addon on screen.
|
|
||||||
/// </summary>
|
|
||||||
[FieldOffset(AddonOffsets.Y)]
|
|
||||||
public short Y;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The scale of the addon.
|
|
||||||
/// </summary>
|
|
||||||
[FieldOffset(AddonOffsets.Scale)]
|
|
||||||
public float Scale;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The root node of the addon's node tree.
|
|
||||||
/// </summary>
|
|
||||||
[FieldOffset(AddonOffsets.RootNode)]
|
|
||||||
public unsafe AtkResNode* RootNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Memory offsets for the <see cref="Addon"/> type.
|
|
||||||
/// </summary>
|
|
||||||
public static class AddonOffsets
|
|
||||||
{
|
|
||||||
public const int Name = 0x8;
|
|
||||||
public const int RootNode = 0xC8;
|
|
||||||
public const int Flags = 0x182;
|
|
||||||
public const int X = 0x1BC;
|
|
||||||
public const int Y = 0x1BE;
|
|
||||||
public const int Scale = 0x1AC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,129 +0,0 @@
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui.Structs
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// PartyFinder related network structs and static constants.
|
|
||||||
/// </summary>
|
|
||||||
internal static class PartyFinder
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The structure of the PartyFinder packet.
|
|
||||||
/// </summary>
|
|
||||||
[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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The structure of an individual listing within a packet.
|
|
||||||
/// </summary>
|
|
||||||
[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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// PartyFinder packet constants.
|
|
||||||
/// </summary>
|
|
||||||
public static class PacketInfo
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The size of the PartyFinder packet.
|
|
||||||
/// </summary>
|
|
||||||
public static readonly int PacketSize = Marshal.SizeOf<Packet>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,397 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
using Dalamud.Data;
|
|
||||||
using Lumina.Excel.GeneratedSheets;
|
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Gui.Structs
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Search area flags for the <see cref="PartyFinder"/> class.
|
|
||||||
/// </summary>
|
|
||||||
[Flags]
|
|
||||||
public enum SearchAreaFlags : uint
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Datacenter.
|
|
||||||
/// </summary>
|
|
||||||
DataCentre = 1 << 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Private.
|
|
||||||
/// </summary>
|
|
||||||
Private = 1 << 1,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Alliance raid.
|
|
||||||
/// </summary>
|
|
||||||
AllianceRaid = 1 << 2,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// World.
|
|
||||||
/// </summary>
|
|
||||||
World = 1 << 3,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// One player per job.
|
|
||||||
/// </summary>
|
|
||||||
OnePlayerPerJob = 1 << 5,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Job flags for the <see cref="PartyFinder"/> class.
|
|
||||||
/// </summary>
|
|
||||||
[Flags]
|
|
||||||
public enum JobFlags
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gladiator (GLD).
|
|
||||||
/// </summary>
|
|
||||||
Gladiator = 1 << 1,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Pugilist (PGL).
|
|
||||||
/// </summary>
|
|
||||||
Pugilist = 1 << 2,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Marauder (MRD).
|
|
||||||
/// </summary>
|
|
||||||
Marauder = 1 << 3,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Lancer (LNC).
|
|
||||||
/// </summary>
|
|
||||||
Lancer = 1 << 4,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Archer (ARC).
|
|
||||||
/// </summary>
|
|
||||||
Archer = 1 << 5,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Conjurer (CNJ).
|
|
||||||
/// </summary>
|
|
||||||
Conjurer = 1 << 6,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Thaumaturge (THM).
|
|
||||||
/// </summary>
|
|
||||||
Thaumaturge = 1 << 7,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Paladin (PLD).
|
|
||||||
/// </summary>
|
|
||||||
Paladin = 1 << 8,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Monk (MNK).
|
|
||||||
/// </summary>
|
|
||||||
Monk = 1 << 9,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Warrior (WAR).
|
|
||||||
/// </summary>
|
|
||||||
Warrior = 1 << 10,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dragoon (DRG).
|
|
||||||
/// </summary>
|
|
||||||
Dragoon = 1 << 11,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Bard (BRD).
|
|
||||||
/// </summary>
|
|
||||||
Bard = 1 << 12,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// White mage (WHM).
|
|
||||||
/// </summary>
|
|
||||||
WhiteMage = 1 << 13,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Black mage (BLM).
|
|
||||||
/// </summary>
|
|
||||||
BlackMage = 1 << 14,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Arcanist (ACN).
|
|
||||||
/// </summary>
|
|
||||||
Arcanist = 1 << 15,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Summoner (SMN).
|
|
||||||
/// </summary>
|
|
||||||
Summoner = 1 << 16,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Scholar (SCH).
|
|
||||||
/// </summary>
|
|
||||||
Scholar = 1 << 17,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Rogue (ROG).
|
|
||||||
/// </summary>
|
|
||||||
Rogue = 1 << 18,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Ninja (NIN).
|
|
||||||
/// </summary>
|
|
||||||
Ninja = 1 << 19,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Machinist (MCH).
|
|
||||||
/// </summary>
|
|
||||||
Machinist = 1 << 20,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dark Knight (DRK).
|
|
||||||
/// </summary>
|
|
||||||
DarkKnight = 1 << 21,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Astrologian (AST).
|
|
||||||
/// </summary>
|
|
||||||
Astrologian = 1 << 22,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Samurai (SAM).
|
|
||||||
/// </summary>
|
|
||||||
Samurai = 1 << 23,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Red mage (RDM).
|
|
||||||
/// </summary>
|
|
||||||
RedMage = 1 << 24,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Blue mage (BLM).
|
|
||||||
/// </summary>
|
|
||||||
BlueMage = 1 << 25,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gunbreaker (GNB).
|
|
||||||
/// </summary>
|
|
||||||
Gunbreaker = 1 << 26,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dancer (DNC).
|
|
||||||
/// </summary>
|
|
||||||
Dancer = 1 << 27,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Objective flags for the <see cref="PartyFinder"/> class.
|
|
||||||
/// </summary>
|
|
||||||
[Flags]
|
|
||||||
public enum ObjectiveFlags : uint
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// No objective.
|
|
||||||
/// </summary>
|
|
||||||
None = 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The duty completion objective.
|
|
||||||
/// </summary>
|
|
||||||
DutyCompletion = 1,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The practice objective.
|
|
||||||
/// </summary>
|
|
||||||
Practice = 2,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The loot objective.
|
|
||||||
/// </summary>
|
|
||||||
Loot = 4,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Condition flags for the <see cref="PartyFinder"/> class.
|
|
||||||
/// </summary>
|
|
||||||
[Flags]
|
|
||||||
public enum ConditionFlags : uint
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// No duty condition.
|
|
||||||
/// </summary>
|
|
||||||
None = 1,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The duty complete condition.
|
|
||||||
/// </summary>
|
|
||||||
DutyComplete = 2,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The duty incomplete condition.
|
|
||||||
/// </summary>
|
|
||||||
DutyIncomplete = 4,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Duty finder settings flags for the <see cref="PartyFinder"/> class.
|
|
||||||
/// </summary>
|
|
||||||
[Flags]
|
|
||||||
public enum DutyFinderSettingsFlags : uint
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// No duty finder settings.
|
|
||||||
/// </summary>
|
|
||||||
None = 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The undersized party setting.
|
|
||||||
/// </summary>
|
|
||||||
UndersizedParty = 1 << 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The minimum item level setting.
|
|
||||||
/// </summary>
|
|
||||||
MinimumItemLevel = 1 << 1,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The silence echo setting.
|
|
||||||
/// </summary>
|
|
||||||
SilenceEcho = 1 << 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Loot rule flags for the <see cref="PartyFinder"/> class.
|
|
||||||
/// </summary>
|
|
||||||
[Flags]
|
|
||||||
public enum LootRuleFlags : uint
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// No loot rules.
|
|
||||||
/// </summary>
|
|
||||||
None = 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The greed only rule.
|
|
||||||
/// </summary>
|
|
||||||
GreedOnly = 1,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The lootmaster rule.
|
|
||||||
/// </summary>
|
|
||||||
Lootmaster = 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Category flags for the <see cref="PartyFinder"/> class.
|
|
||||||
/// </summary>
|
|
||||||
public enum Category
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The duty category.
|
|
||||||
/// </summary>
|
|
||||||
Duty = 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The quest battle category.
|
|
||||||
/// </summary>
|
|
||||||
QuestBattles = 1 << 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The fate category.
|
|
||||||
/// </summary>
|
|
||||||
Fates = 1 << 1,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The treasure hunt category.
|
|
||||||
/// </summary>
|
|
||||||
TreasureHunt = 1 << 2,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The hunt category.
|
|
||||||
/// </summary>
|
|
||||||
TheHunt = 1 << 3,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The gathering forays category.
|
|
||||||
/// </summary>
|
|
||||||
GatheringForays = 1 << 4,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The deep dungeons category.
|
|
||||||
/// </summary>
|
|
||||||
DeepDungeons = 1 << 5,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The adventuring forays category.
|
|
||||||
/// </summary>
|
|
||||||
AdventuringForays = 1 << 6,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Duty type flags for the <see cref="PartyFinder"/> class.
|
|
||||||
/// </summary>
|
|
||||||
public enum DutyType
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// No duty type.
|
|
||||||
/// </summary>
|
|
||||||
Other = 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The roulette duty type.
|
|
||||||
/// </summary>
|
|
||||||
Roulette = 1 << 0,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The normal duty type.
|
|
||||||
/// </summary>
|
|
||||||
Normal = 1 << 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extensions for the <see cref="JobFlags"/> enum.
|
|
||||||
/// </summary>
|
|
||||||
public static class JobFlagsExt
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Get the actual ClassJob from the in-game sheets for this JobFlags.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="job">A JobFlags enum member.</param>
|
|
||||||
/// <param name="data">A DataManager to get the ClassJob from.</param>
|
|
||||||
/// <returns>A ClassJob if found or null if not.</returns>
|
|
||||||
public static ClassJob ClassJob(this JobFlags job, DataManager data)
|
|
||||||
{
|
|
||||||
var jobs = data.GetExcelSheet<ClassJob>();
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -6,18 +6,13 @@ using Dalamud.Game.Network;
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Network
|
namespace Dalamud.Game.Network
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class handles interacting with game network events.
|
/// This class handles interacting with game network events.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class GameNetwork : IDisposable
|
public sealed class GameNetwork : IDisposable
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Event that is called when a network message is sent/received.
|
|
||||||
/// </summary>
|
|
||||||
public OnNetworkMessageDelegate OnNetworkMessage;
|
|
||||||
|
|
||||||
private readonly GameNetworkAddressResolver address;
|
private readonly GameNetworkAddressResolver address;
|
||||||
private readonly Hook<ProcessZonePacketDownDelegate> processZonePacketDownHook;
|
private readonly Hook<ProcessZonePacketDownDelegate> processZonePacketDownHook;
|
||||||
private readonly Hook<ProcessZonePacketUpDelegate> processZonePacketUpHook;
|
private readonly Hook<ProcessZonePacketUpDelegate> processZonePacketUpHook;
|
||||||
|
|
@ -58,6 +53,11 @@ namespace Dalamud.Game.Internal.Network
|
||||||
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
|
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
|
||||||
private delegate byte ProcessZonePacketUpDelegate(IntPtr a1, IntPtr dataPtr, IntPtr a3, byte a4);
|
private delegate byte ProcessZonePacketUpDelegate(IntPtr a1, IntPtr dataPtr, IntPtr a3, byte a4);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event that is called when a network message is sent/received.
|
||||||
|
/// </summary>
|
||||||
|
public event OnNetworkMessageDelegate OnNetworkMessage;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enable this module.
|
/// Enable this module.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Dalamud.Game.Internal.Network
|
using Dalamud.Game.Internal;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Network
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The address resolver for the <see cref="GameNetwork"/> class.
|
/// The address resolver for the <see cref="GameNetwork"/> class.
|
||||||
|
|
@ -9,8 +9,8 @@ using Dalamud.Game.ClientState;
|
||||||
using Dalamud.Game.ClientState.Actors.Types;
|
using Dalamud.Game.ClientState.Actors.Types;
|
||||||
using Dalamud.Game.ClientState.Actors.Types.NonPlayer;
|
using Dalamud.Game.ClientState.Actors.Types.NonPlayer;
|
||||||
using Dalamud.Game.ClientState.Structs.JobGauge;
|
using Dalamud.Game.ClientState.Structs.JobGauge;
|
||||||
using Dalamud.Game.Internal.Gui.Addon;
|
using Dalamud.Game.Gui.Addons;
|
||||||
using Dalamud.Game.Internal.Gui.Toast;
|
using Dalamud.Game.Gui.Toast;
|
||||||
using Dalamud.Game.Text;
|
using Dalamud.Game.Text;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using Dalamud.Plugin;
|
using Dalamud.Plugin;
|
||||||
|
|
@ -104,6 +104,17 @@ namespace Dalamud.Interface.Internal.Windows
|
||||||
Gamepad,
|
Gamepad,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override void OnOpen()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override void OnClose()
|
||||||
|
{
|
||||||
|
this.resultAddon = null;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set the DataKind dropdown menu.
|
/// Set the DataKind dropdown menu.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -562,9 +573,7 @@ namespace Dalamud.Interface.Internal.Windows
|
||||||
|
|
||||||
if (ImGui.Button("Get Addon"))
|
if (ImGui.Button("Get Addon"))
|
||||||
{
|
{
|
||||||
this.resultAddon =
|
this.resultAddon = this.dalamud.Framework.Gui.GetAddonByName(this.inputAddonName, this.inputAddonIndex);
|
||||||
this.dalamud.Framework.Gui.GetAddonByName(
|
|
||||||
this.inputAddonName, this.inputAddonIndex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui.Button("Find Agent"))
|
if (ImGui.Button("Find Agent"))
|
||||||
|
|
@ -572,14 +581,12 @@ namespace Dalamud.Interface.Internal.Windows
|
||||||
|
|
||||||
if (this.resultAddon != null)
|
if (this.resultAddon != null)
|
||||||
{
|
{
|
||||||
ImGui.TextUnformatted(
|
ImGui.TextUnformatted($"{this.resultAddon.Name} - 0x{this.resultAddon.Address.ToInt64():x}\n v:{this.resultAddon.Visible} x:{this.resultAddon.X} y:{this.resultAddon.Y} s:{this.resultAddon.Scale}, w:{this.resultAddon.Width}, h:{this.resultAddon.Height}");
|
||||||
$"{this.resultAddon.Name} - 0x{this.resultAddon.Address.ToInt64():x}\n v:{this.resultAddon.Visible} x:{this.resultAddon.X} y:{this.resultAddon.Y} s:{this.resultAddon.Scale}, w:{this.resultAddon.Width}, h:{this.resultAddon.Height}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.findAgentInterfacePtr != IntPtr.Zero)
|
if (this.findAgentInterfacePtr != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
ImGui.TextUnformatted(
|
ImGui.TextUnformatted($"Agent: 0x{this.findAgentInterfacePtr.ToInt64():x}");
|
||||||
$"Agent: 0x{this.findAgentInterfacePtr.ToInt64():x}");
|
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
|
|
||||||
if (ImGui.Button("C"))
|
if (ImGui.Button("C"))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue