From df68ed92ea0403f78e1578c235b1127dcfbd85c6 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 7 Aug 2026 20:08:06 -0400 Subject: [PATCH 1/4] Expose BoundingSphereSize in BgPartsLayoutInstance This is what it's used for I guess. --- .../FFXIV/Client/LayoutEngine/Layer/BgPartsLayoutInstance.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/BgPartsLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/BgPartsLayoutInstance.cs index 9759a57a2..e750b3472 100644 --- a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/BgPartsLayoutInstance.cs +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/BgPartsLayoutInstance.cs @@ -21,7 +21,7 @@ public unsafe partial struct BgPartsLayoutInstance { [FieldOffset(0x4C)] public uint CollisionMaterialMaskLow; [FieldOffset(0x50)] public uint CollisionMaterialIdHigh; [FieldOffset(0x54)] public uint CollisionMaterialMaskHigh; - //[FieldOffset(0x58)] public float u58; + [FieldOffset(0x58)] public float BoundingSphereSize; //[FieldOffset(0x5C)] public int u5C; [FieldOffset(0x60)] public void* CollisionUpdateListener; } From d4db448c285ef6c758d080e96ee3943e45c2f548 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 7 Aug 2026 20:08:36 -0400 Subject: [PATCH 2/4] Add unknown fields for EventNpcLayoutInstance These are read in another init function (not SetProperties) and are all booleans, although I have no idea what they do yet. --- .../Client/LayoutEngine/Layer/EventNpcLayoutInstance.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EventNpcLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EventNpcLayoutInstance.cs index ff09f8311..dd9b5818e 100644 --- a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EventNpcLayoutInstance.cs +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EventNpcLayoutInstance.cs @@ -7,4 +7,8 @@ namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; [GenerateInterop] [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0x90)] -public partial struct EventNpcLayoutInstance; +public partial struct EventNpcLayoutInstance { + [FieldOffset(0x80)] private bool Unk80; + [FieldOffset(0x81)] private bool Unk81; + [FieldOffset(0x82)] private bool Unk82; +} From a69b0e9b81ef428777ffe4ee67ce41dc0b9cd88f Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 7 Aug 2026 20:10:29 -0400 Subject: [PATCH 3/4] Add a good chunk of unmapped layout instance structs These are all read by the client - although some, especially the server-side/development ones - don't do much but still show up in the disassembly and have vtables. There's a lot more instance objects to go, but I got tired... --- .../Layer/CullingBoxLayoutInstance.cs | 11 ++++++++++ .../Layer/EventEffectRangeLayoutInstance.cs | 10 ++++++++++ .../Layer/GameContentsRangeLayoutInstance.cs | 10 ++++++++++ .../Layer/PositionMarkerLayoutInstance.cs | 11 ++++++++++ .../Layer/QuestMarkerLayoutInstance.cs | 13 ++++++++++++ .../Layer/ShowHideRangeLayoutInstance.cs | 12 +++++++++++ .../Layer/SphereCastRangeLayoutInstance.cs | 10 ++++++++++ .../Layer/TargetMarkerLayoutInstance.cs | 12 +++++++++++ .../Layer/VolumetricCloudLayoutInstance.cs | 14 +++++++++++++ .../Layer/WaterRangeLayoutInstance.cs | 10 ++++++++++ ida/data.yml | 20 +++++++++++++++++++ 11 files changed, 133 insertions(+) create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/CullingBoxLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EventEffectRangeLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/GameContentsRangeLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/PositionMarkerLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/QuestMarkerLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/ShowHideRangeLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/SphereCastRangeLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/TargetMarkerLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/VolumetricCloudLayoutInstance.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/WaterRangeLayoutInstance.cs diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/CullingBoxLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/CullingBoxLayoutInstance.cs new file mode 100644 index 000000000..90311e550 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/CullingBoxLayoutInstance.cs @@ -0,0 +1,11 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::CullingBoxLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x40)] +public unsafe partial struct CullingBoxLayoutInstance { + [FieldOffset(0x30)] private uint Unk30; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EventEffectRangeLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EventEffectRangeLayoutInstance.cs new file mode 100644 index 000000000..b5d5d580e --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EventEffectRangeLayoutInstance.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::EventEffectRangeLayoutInstance +// Client::LayoutEngine::Layer::TriggerBoxLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x1270)] +public unsafe partial struct EventEffectRangeLayoutInstance; diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/GameContentsRangeLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/GameContentsRangeLayoutInstance.cs new file mode 100644 index 000000000..df97772ba --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/GameContentsRangeLayoutInstance.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::GameContentsRangeLayoutInstance +// Client::LayoutEngine::Layer::TriggerBoxLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0xA0)] +public unsafe partial struct GameContentsRangeLayoutInstance; diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/PositionMarkerLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/PositionMarkerLayoutInstance.cs new file mode 100644 index 000000000..288cacabd --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/PositionMarkerLayoutInstance.cs @@ -0,0 +1,11 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::PositionMarkerLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x80)] +public unsafe partial struct PositionMarkerLayoutInstance { + [FieldOffset(0x70)] private uint Unk70; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/QuestMarkerLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/QuestMarkerLayoutInstance.cs new file mode 100644 index 000000000..4e822c682 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/QuestMarkerLayoutInstance.cs @@ -0,0 +1,13 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::QuestMarkerLayoutInstance +// Client::LayoutEngine::Layer::MarkerLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x80)] +public unsafe partial struct QuestMarkerLayoutInstance { + [FieldOffset(0x70)] private uint Unk70; + [FieldOffset(0x74)] private uint Unk74; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/ShowHideRangeLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/ShowHideRangeLayoutInstance.cs new file mode 100644 index 000000000..5c759452b --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/ShowHideRangeLayoutInstance.cs @@ -0,0 +1,12 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::ShowHideRangeLayoutInstance +// Client::LayoutEngine::Layer::TriggerBoxLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0xA0)] +public unsafe partial struct ShowHideRangeLayoutInstance { + [FieldOffset(0x80)] private uint Unk80; // Count of something +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/SphereCastRangeLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/SphereCastRangeLayoutInstance.cs new file mode 100644 index 000000000..306fc6f08 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/SphereCastRangeLayoutInstance.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::SphereCastRangeLayoutInstance +// Client::LayoutEngine::Layer::RangeLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x70)] +public unsafe partial struct SphereCastRangeLayoutInstance; diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/TargetMarkerLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/TargetMarkerLayoutInstance.cs new file mode 100644 index 000000000..638e70fb3 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/TargetMarkerLayoutInstance.cs @@ -0,0 +1,12 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::TargetMarkerLayoutInstance +// Client::LayoutEngine::Layer::MarkerLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x80)] +public unsafe partial struct TargetMarkerLayoutInstance { + [FieldOffset(0x70)] private uint Unk70; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/VolumetricCloudLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/VolumetricCloudLayoutInstance.cs new file mode 100644 index 000000000..92652f6fe --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/VolumetricCloudLayoutInstance.cs @@ -0,0 +1,14 @@ +using FFXIVClientStructs.FFXIV.Common.Math; + +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::VolumetricCloudLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x80)] +public unsafe partial struct VolumetricCloudLayoutInstance { + [FieldOffset(0x38)] public Vector4 Color; + [FieldOffset(0x50)] public Transform Transform; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/WaterRangeLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/WaterRangeLayoutInstance.cs new file mode 100644 index 000000000..95fd2b291 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/WaterRangeLayoutInstance.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::WaterRangeLayoutInstance +// Client::LayoutEngine::Layer::TriggerBoxLayoutInstance +// Client::LayoutEngine::ILayoutInstance +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x90)] +public unsafe partial struct WaterRangeLayoutInstance; diff --git a/ida/data.yml b/ida/data.yml index ecf5eb762..55532c809 100644 --- a/ida/data.yml +++ b/ida/data.yml @@ -10171,6 +10171,26 @@ classes: vtbls: - ea: 0x14217C6F0 base: Client::LayoutEngine::ILayoutInstance + Client::LayoutEngine::Layer::VolumetricCloudLayoutInstance: + vtbls: + - ea: 0x14217CBD0 + base: Client::LayoutEngine::ILayoutInstance + Client::LayoutEngine::Layer::EventEffectRangeLayoutInstance: + vtbls: + - ea: 0x14217E220 + base: Client::LayoutEngine::Layer::TriggerBoxLayoutInstance + Client::LayoutEngine::Layer::GameContentsRangeLayoutInstance: + vtbls: + - ea: 0x14217DFA8 + base: Client::LayoutEngine::Layer::TriggerBoxLayoutInstance + Client::LayoutEngine::Layer::ShowHideRangeLayoutInstance: + vtbls: + - ea: 0x14217DD30 + base: Client::LayoutEngine::Layer::TriggerBoxLayoutInstance + Client::LayoutEngine::Layer::WaterRangeLayoutInstance: + vtbls: + - ea: 0x14217DAB8 + base: Client::LayoutEngine::Layer::TriggerBoxLayoutInstance Client::LayoutEngine::Group::TimeLineLayoutInstance: vtbls: - ea: 0x1421815C8 From 6b45d27ca38c9616f3d01b88528f97cec129b500 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sun, 9 Aug 2026 20:57:36 -0400 Subject: [PATCH 4/4] Rename ColliderLayerN InstanceTypes Thanks to @pmgr for the idea on how to name these. --- .../FFXIV/Client/LayoutEngine/ILayoutInstance.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/ILayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/ILayoutInstance.cs index d1fa35f14..90f730b4e 100644 --- a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/ILayoutInstance.cs +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/ILayoutInstance.cs @@ -292,15 +292,23 @@ public enum InstanceType : byte { Decal = 83, Unk84 = 84, Unk85 = 85, - ColliderLayer7 = 86, - ColliderLayer8 = 87, - ColliderLayer9 = 88, - ColliderLayer10 = 89, + WaterRange = 86, + ShowHideRange = 87, + GameContentsRange = 88, + EventEffectRange = 89, CullingBox = 90, Unk91 = 91, Unk92 = 92, VolumetricCloud = 93, + [Obsolete("Renamed to WaterRange")] + ColliderLayer7 = 86, + [Obsolete("Renamed to ShowHideRange")] + ColliderLayer8 = 87, + [Obsolete("Renamed to GameContentsRange")] + ColliderLayer9 = 88, + [Obsolete("Renamed to EventEffectRange")] + ColliderLayer10 = 89, [Obsolete("Renamed to CullingBox")] Culling = 90, }