From 2fc7ff81dd5a340787562ee39e3e8ac81cfe84cc Mon Sep 17 00:00:00 2001 From: Universal Conquistador Date: Wed, 27 May 2026 14:03:14 -0700 Subject: [PATCH 1/2] Adds environment research. --- .../Client/Graphics/Scene/EnvLocation.cs | 24 ++++++++++++++++++- .../FFXIV/Client/Graphics/Scene/EnvScene.cs | 15 ++++++++++++ .../FFXIV/Client/Graphics/Scene/EnvSpace.cs | 4 ++++ .../Environment/LayoutEnvironment.cs | 11 +++++++++ .../Layer/EnvLocationLayoutInstance.cs | 15 ++++++++++++ .../Client/LayoutEngine/LayoutManager.cs | 2 +- ida/data.yml | 4 ++++ 7 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs index f8a5273429..5510bf8121 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs @@ -1,9 +1,31 @@ +using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; +using FFXIVClientStructs.FFXIV.Client.System.File; +using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; // Client::Graphics::Scene::EnvLocation // Client::Graphics::Scene::DrawObject // Client::Graphics::Scene::Object +// Client::Graphics::Vfx::VfxResourceInstanceListenner @ 0x240 [GenerateInterop] [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0x4E0)] -public unsafe partial struct EnvLocation; +public unsafe partial struct EnvLocation { + [FieldOffset(0x90)] public ResourceHandle* AmbientSetResource; // AmbientSetResourceHandle, .amb + [FieldOffset(0x98)] public TextureResourceHandle* EnvironmentCubemapResource; + [FieldOffset(0xA0)] public void* AmbientSet; + [FieldOffset(0xA8)] public Texture* EnvironmentCubemap; + [FieldOffset(0xB0)] private float _unk_B0; + [FieldOffset(0xB8)] private byte _unk_B8; + [FieldOffset(0xB9)] private ushort _unk_B9; + [FieldOffset(0xC0)] public FileAccessPath AmbientSetResourcePath; + [FieldOffset(0x2D0)] public FileAccessPath EnvironmentCubemapResourcePath; + + // There can only be 32 at once--beyond that, returns null. + [MemberFunction("40 53 48 83 EC 20 83 3D ?? ?? ?? ?? ?? 7D 4E")] + public static partial EnvLocation* TryCreate(); + + [MemberFunction("E9 ?? ?? ?? ?? 48 83 C4 20 5B C3 CC CC CC CC CC CC C2 00 00")] + public static partial void TryDestroy(EnvLocation** locationPointer); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvScene.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvScene.cs index 0dd53bf31d..389e8bc579 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvScene.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvScene.cs @@ -1,10 +1,25 @@ +using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; + namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; // Client::Graphics::Scene::EnvScene +// Created by the LayoutEnvironment [GenerateInterop] [StructLayout(LayoutKind.Explicit, Size = 0x8F0)] public unsafe partial struct EnvScene { [FieldOffset(0x30), FixedSizeArray] internal FixedSizeArray32 _weatherIds; [FieldOffset(0xF0), FixedSizeArray] internal FixedSizeArray8 _envSpaces; + + [FieldOffset(0x880)] public EnvLocation** Locations; // array that can store 32 pointers + [FieldOffset(0x888)] public uint LocationCount; // How many valid EnvLocation pointers in Locations + [FieldOffset(0x8D0)] public Texture* CubemapArray; + [FieldOffset(0x8D8)] public ConstantBuffer* ConstantBuffer; // constant buffer size: 0x10 + + // Returns true but does nothing if the given location is already in this scene. + [MemberFunction("4C 8B D1 48 85 D2 74 3F")] + public partial bool AddLocation(EnvLocation* location); + + [MemberFunction("4C 8B D1 48 85 D2 74 25 44 8B 81")] + public partial bool RemoveLocation(EnvLocation* location); } diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs index 135936798a..ac1b9ce8f9 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs @@ -1,3 +1,5 @@ +using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; // Client::Graphics::Scene::EnvSpace @@ -7,5 +9,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0xF0)] public unsafe partial struct EnvSpace { + [FieldOffset(0x90)] public ResourceHandle* EnvSetResourceHandle; // is an EnvSetResourceHandle, .envb + [FieldOffset(0x98)] public ResourceHandle* SoundSetResourceHandle; // is a SoundSetResourceHandle, .essb [FieldOffset(0xB0)] public EnvLocation* EnvLocation; } diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs new file mode 100644 index 0000000000..9c6bb502fe --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs @@ -0,0 +1,11 @@ +using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; + +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Environment; + +[GenerateInterop] +[StructLayout(LayoutKind.Explicit, Size = 0x28)] +public unsafe partial struct LayoutEnvironment { + [FieldOffset(0x08)] public LayoutManager* LayoutManager; + [FieldOffset(0x10)] public EnvScene* GraphicsEnvironment; // Only set in the ActiveLayout, null in the GlobalLayout + [FieldOffset(0x18)] private void* _unk_18; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs new file mode 100644 index 0000000000..7f8c37f470 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs @@ -0,0 +1,15 @@ +using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; + +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::EnvLocationLayoutInstance +// Client::LayoutEngine::ILayoutInstance +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x48)] +public unsafe partial struct EnvLocationLayoutInstance { + [FieldOffset(0x30)] public EnvLocation* GraphicsObject; + [FieldOffset(0x38)] private void* _unk_38; // Array of 0x4C structures memcpy'd from the file + [FieldOffset(0x40)] private int _unk_40; // Count of _unk_38 + [FieldOffset(0x44)] private uint _unk_44; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs index 6cf43127be..c631a7f8e2 100644 --- a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs @@ -27,7 +27,7 @@ public unsafe partial struct LayoutManager { [FieldOffset(0x080)] public float FestivalLayersAddTimer; // dt * 30 [FieldOffset(0x084)] public float FestivalLayersRemoveTimer; // dt * 30 [FieldOffset(0x088)] public void* StreamingManager; - [FieldOffset(0x090)] public void* Environment; + [FieldOffset(0x090)] public void* Environment; // TODO: Change to LayoutEnvironment* [FieldOffset(0x098)] public void* OBSetManager; [FieldOffset(0x0A0)] public OutdoorAreaLayoutData* OutdoorAreaData; [FieldOffset(0x0A8)] public OutdoorExteriorLayoutData* OutdoorExteriorData; diff --git a/ida/data.yml b/ida/data.yml index ab6ab17954..d1ddf5623c 100644 --- a/ida/data.yml +++ b/ida/data.yml @@ -7466,6 +7466,8 @@ classes: base: Client::Graphics::Scene::DrawObject funcs: 0x140455530: ctor + 0x140798B70: TryCreate + 0x140798BF0: TryDestroy Client::Graphics::Scene::EnvSpace: vtbls: - ea: 0x142162168 @@ -7493,6 +7495,8 @@ classes: - ea: 0x1421622F8 funcs: 0x1404582A0: ctor + 0x1404590E0: AddLocation + 0x140459130: RemoveLocation Client::Graphics::Scene::ResidentResourceManager::ResourceList: vtbls: - ea: 0x1421625B8 From 360f9c093fda9ed2ad5b181b8a8c9504c281caca Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Thu, 28 May 2026 01:03:49 +0200 Subject: [PATCH 2/2] Update stuff all around - Format Unk field names like everywhere else in the project - Add placeholder structs for AmbientSetResourceHandle, EnvSetResourceHandle, SoundSetResourceHandle - Remove GenerateInterop from struct that doesn't need it - Correct comments --- .../FFXIV/Client/Graphics/Scene/EnvLocation.cs | 13 ++++++------- .../FFXIV/Client/Graphics/Scene/EnvSpace.cs | 4 ++-- .../LayoutEngine/Environment/LayoutEnvironment.cs | 6 +++--- .../LayoutEngine/Layer/EnvLocationLayoutInstance.cs | 6 +++--- .../Resource/Handle/AmbientSetResourceHandle.cs | 10 ++++++++++ .../System/Resource/Handle/ApricotResourceHandle.cs | 2 +- .../System/Resource/Handle/EnvSetResourceHandle.cs | 10 ++++++++++ .../Resource/Handle/SoundSetResourceHandle.cs | 10 ++++++++++ 8 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/AmbientSetResourceHandle.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/EnvSetResourceHandle.cs create mode 100644 FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/SoundSetResourceHandle.cs diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs index 5510bf8121..0de4c6de0a 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs @@ -7,22 +7,21 @@ namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; // Client::Graphics::Scene::EnvLocation // Client::Graphics::Scene::DrawObject // Client::Graphics::Scene::Object -// Client::Graphics::Vfx::VfxResourceInstanceListenner @ 0x240 [GenerateInterop] [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0x4E0)] public unsafe partial struct EnvLocation { - [FieldOffset(0x90)] public ResourceHandle* AmbientSetResource; // AmbientSetResourceHandle, .amb + [FieldOffset(0x90)] public AmbientSetResourceHandle* AmbientSetResource; [FieldOffset(0x98)] public TextureResourceHandle* EnvironmentCubemapResource; [FieldOffset(0xA0)] public void* AmbientSet; [FieldOffset(0xA8)] public Texture* EnvironmentCubemap; - [FieldOffset(0xB0)] private float _unk_B0; - [FieldOffset(0xB8)] private byte _unk_B8; - [FieldOffset(0xB9)] private ushort _unk_B9; + [FieldOffset(0xB0)] private float UnkB0; + [FieldOffset(0xB8)] private byte UnkB8; + [FieldOffset(0xB9)] private ushort UnkB9; [FieldOffset(0xC0)] public FileAccessPath AmbientSetResourcePath; - [FieldOffset(0x2D0)] public FileAccessPath EnvironmentCubemapResourcePath; + [FieldOffset(0x2D0)] public FileAccessPath EnvironmentCubemapResourcePath; - // There can only be 32 at once--beyond that, returns null. + // There can only be 32 at once. Beyond that it returns null. [MemberFunction("40 53 48 83 EC 20 83 3D ?? ?? ?? ?? ?? 7D 4E")] public static partial EnvLocation* TryCreate(); diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs index ac1b9ce8f9..c1517633c8 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs @@ -9,7 +9,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0xF0)] public unsafe partial struct EnvSpace { - [FieldOffset(0x90)] public ResourceHandle* EnvSetResourceHandle; // is an EnvSetResourceHandle, .envb - [FieldOffset(0x98)] public ResourceHandle* SoundSetResourceHandle; // is a SoundSetResourceHandle, .essb + [FieldOffset(0x90)] public EnvSetResourceHandle* EnvSetResourceHandle; + [FieldOffset(0x98)] public SoundSetResourceHandle* SoundSetResourceHandle; [FieldOffset(0xB0)] public EnvLocation* EnvLocation; } diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs index 9c6bb502fe..f918dc4a4b 100644 --- a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs @@ -2,10 +2,10 @@ namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Environment; -[GenerateInterop] +// Client::LayoutEngine::Environment::LayoutEnvironment [StructLayout(LayoutKind.Explicit, Size = 0x28)] -public unsafe partial struct LayoutEnvironment { +public unsafe struct LayoutEnvironment { [FieldOffset(0x08)] public LayoutManager* LayoutManager; [FieldOffset(0x10)] public EnvScene* GraphicsEnvironment; // Only set in the ActiveLayout, null in the GlobalLayout - [FieldOffset(0x18)] private void* _unk_18; + [FieldOffset(0x18)] private void* Unk18; } diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs index 7f8c37f470..1232ee1c8b 100644 --- a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs @@ -9,7 +9,7 @@ namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; [StructLayout(LayoutKind.Explicit, Size = 0x48)] public unsafe partial struct EnvLocationLayoutInstance { [FieldOffset(0x30)] public EnvLocation* GraphicsObject; - [FieldOffset(0x38)] private void* _unk_38; // Array of 0x4C structures memcpy'd from the file - [FieldOffset(0x40)] private int _unk_40; // Count of _unk_38 - [FieldOffset(0x44)] private uint _unk_44; + [FieldOffset(0x38)] private void* Unk38; // Array of 0x4C structures memcpy'd from the file + [FieldOffset(0x40)] private int Unk40; // Count of Unk38 + [FieldOffset(0x44)] private uint Unk44; } diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/AmbientSetResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/AmbientSetResourceHandle.cs new file mode 100644 index 0000000000..9e625c5acf --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/AmbientSetResourceHandle.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + +// Client::System::Resource::Handle::AmbientSetResourceHandle +// Client::System::Resource::Handle::DefaultResourceHandle +// Client::System::Resource::Handle::ResourceHandle +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0xC8)] +public partial struct AmbientSetResourceHandle; // .amb diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/ApricotResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/ApricotResourceHandle.cs index 3f5abf7fcc..7bc732fe8e 100644 --- a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/ApricotResourceHandle.cs +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/ApricotResourceHandle.cs @@ -7,4 +7,4 @@ namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; [GenerateInterop] [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0xC8)] -public unsafe partial struct ApricotResourceHandle { } +public partial struct ApricotResourceHandle; diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/EnvSetResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/EnvSetResourceHandle.cs new file mode 100644 index 0000000000..90be2b8838 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/EnvSetResourceHandle.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + +// Client::System::Resource::Handle::EnvSetResourceHandle +// Client::System::Resource::Handle::DefaultResourceHandle +// Client::System::Resource::Handle::ResourceHandle +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0xC8)] +public partial struct EnvSetResourceHandle; // .envb diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/SoundSetResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/SoundSetResourceHandle.cs new file mode 100644 index 0000000000..090bb2ea44 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/SoundSetResourceHandle.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + +// Client::System::Resource::Handle::SoundSetResourceHandle +// Client::System::Resource::Handle::DefaultResourceHandle +// Client::System::Resource::Handle::ResourceHandle +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0xC8)] +public partial struct SoundSetResourceHandle; // .essb