diff --git a/Dalamud/Game/Internal/Gui/Addon/Addon.cs b/Dalamud/Game/Internal/Gui/Addon/Addon.cs new file mode 100644 index 000000000..b586dbd56 --- /dev/null +++ b/Dalamud/Game/Internal/Gui/Addon/Addon.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; + +namespace Dalamud.Game.Internal.Gui.Addon { + public class Addon { + public IntPtr Address; + protected Structs.Addon addonStruct; + + public Addon(IntPtr address, Structs.Addon addonStruct) { + this.Address = address; + this.addonStruct = addonStruct; + } + + public string Name => this.addonStruct.Name; + public short X => this.addonStruct.X; + public short Y => this.addonStruct.Y; + public float Scale => this.addonStruct.Scale; + + public bool Visible => (this.addonStruct.Flags & 0x20) == 1; + } +} diff --git a/Dalamud/Game/Internal/Gui/GameGui.cs b/Dalamud/Game/Internal/Gui/GameGui.cs index 521ea8179..adbd592ed 100644 --- a/Dalamud/Game/Internal/Gui/GameGui.cs +++ b/Dalamud/Game/Internal/Gui/GameGui.cs @@ -331,6 +331,13 @@ namespace Dalamud.Game.Internal.Gui { return this.getUIObjectByName(baseUiProperties, name, index); } + public Addon.Addon GetAddonByName(string name, int index) { + var addonMem = GetUiObjectByName(name, index); + if (addonMem == IntPtr.Zero) return null; + var addonStruct = Marshal.PtrToStructure(addonMem); + return new Addon.Addon(addonMem, addonStruct); + } + public void SetBgm(ushort bgmKey) => this.setGlobalBgmHook.Original(bgmKey, 0, 0, 0, 0, 0); public void Enable() { diff --git a/Dalamud/Game/Internal/Gui/Structs/Addon.cs b/Dalamud/Game/Internal/Gui/Structs/Addon.cs new file mode 100644 index 000000000..88b91e969 --- /dev/null +++ b/Dalamud/Game/Internal/Gui/Structs/Addon.cs @@ -0,0 +1,24 @@ +using System.Runtime.InteropServices; + +namespace Dalamud.Game.Internal.Gui.Structs { + + public class AddonOffsets { + public const int Name = 0x8; + public const int Flags = 0x182; + public const int X = 0x1BC; + public const int Y = 0x1BE; + public const int Scale = 0x1AC; + } + + [StructLayout(LayoutKind.Explicit)] + public struct Addon { + [FieldOffset(AddonOffsets.Name), MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] + public string Name; + + [FieldOffset(AddonOffsets.Flags)] public byte Flags; + [FieldOffset(AddonOffsets.X)] public short X; + [FieldOffset(AddonOffsets.Y)] public short Y; + [FieldOffset(AddonOffsets.Scale)] public float Scale; + + } +}