diff --git a/Penumbra.GameData/Enums/WeaponCategory.cs b/Penumbra.GameData/Enums/WeaponCategory.cs index b40fa48a..4128361f 100644 --- a/Penumbra.GameData/Enums/WeaponCategory.cs +++ b/Penumbra.GameData/Enums/WeaponCategory.cs @@ -1,5 +1,3 @@ -using System; - namespace Penumbra.GameData.Enums; public enum WeaponCategory : byte diff --git a/Penumbra.GameData/Signatures.cs b/Penumbra.GameData/Signatures.cs index aae686dc..fd6bdcfd 100644 --- a/Penumbra.GameData/Signatures.cs +++ b/Penumbra.GameData/Signatures.cs @@ -4,7 +4,7 @@ public static class Sigs { // ResourceLoader.Debug public const string ResourceHandleDestructor = "48 89 5C 24 ?? 57 48 83 EC ?? 48 8D 05 ?? ?? ?? ?? 48 8B D9 48 89 01 B8"; - public const string ResourceManager = "48 8B 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 32 C0"; + public const string ResourceManager = "48 8B 05 ?? ?? ?? ?? 33 ED F0"; // ResourceLoader.Replacement public const string GetResourceSync = "E8 ?? ?? 00 00 48 8D 8F ?? ?? 00 00 48 89 87 ?? ?? 00 00"; diff --git a/Penumbra/Dalamud.cs b/Penumbra/Dalamud.cs index 5be53335..d0784fa6 100644 --- a/Penumbra/Dalamud.cs +++ b/Penumbra/Dalamud.cs @@ -35,6 +35,7 @@ public class Dalamud [PluginService][RequiredVersion("1.0")] public static TitleScreenMenu TitleScreenMenu { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public static GameGui GameGui { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public static KeyState KeyState { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public static SigScanner SigScanner { get; private set; } = null!; // @formatter:on private static readonly object? DalamudConfig; diff --git a/Penumbra/Interop/Loader/ResourceLoader.Debug.cs b/Penumbra/Interop/Loader/ResourceLoader.Debug.cs index a168299e..02f1882f 100644 --- a/Penumbra/Interop/Loader/ResourceLoader.Debug.cs +++ b/Penumbra/Interop/Loader/ResourceLoader.Debug.cs @@ -38,7 +38,7 @@ public unsafe partial class ResourceLoader } // A static pointer to the SE Resource Manager - [Signature( Sigs.ResourceManager, ScanType = ScanType.StaticAddress, UseFlags = SignatureUseFlags.Pointer )] + [Signature( Sigs.ResourceManager, ScanType = ScanType.StaticAddress)] public static ResourceManager** ResourceManager; // Gather some debugging data about penumbra-loaded objects. @@ -177,11 +177,11 @@ public unsafe partial class ResourceLoader ref var manager = ref *ResourceManager; foreach( var resourceType in Enum.GetValues< ResourceCategory >().SkipLast( 1 ) ) { - var graph = ( ResourceGraph.CategoryContainer* )manager->ResourceGraph->ContainerArray + ( int )resourceType; + ref var graph = ref manager->ResourceGraph->ContainerArraySpan[(int) resourceType]; for( var i = 0; i < 20; ++i ) { - var map = ( StdMap< uint, Pointer< StdMap< uint, Pointer< ResourceHandle > > > >* )graph->CategoryMaps[ i ]; - if( map != null ) + var map = graph.CategoryMapsSpan[i]; + if( map.Value != null ) { action( resourceType, map, i ); } diff --git a/Penumbra/UI/ConfigWindow.ResourceTab.cs b/Penumbra/UI/ConfigWindow.ResourceTab.cs index ce6bf442..4af5b271 100644 --- a/Penumbra/UI/ConfigWindow.ResourceTab.cs +++ b/Penumbra/UI/ConfigWindow.ResourceTab.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Linq; using System.Numerics; using Dalamud.Interface; @@ -9,6 +10,7 @@ using FFXIVClientStructs.STD; using ImGuiNET; using OtterGui; using OtterGui.Raii; +using Penumbra.GameData; using Penumbra.Interop.Loader; using Penumbra.String.Classes; @@ -42,6 +44,13 @@ public partial class ConfigWindow return; } + unsafe + { + Dalamud.SigScanner.TryGetStaticAddressFromSig( Sigs.ResourceManager, out var x ); + ImGui.TextUnformatted( $"Static Address: 0x{( ulong )ResourceLoader.ResourceManager:X} (+0x{(ulong) ResourceLoader.ResourceManager - (ulong) Dalamud.SigScanner.Module.BaseAddress:X})" ); + ImGui.TextUnformatted( $"Actual Address: 0x{( ulong )*ResourceLoader.ResourceManager:X}" ); + } + // Filter for resources containing the input string. ImGui.SetNextItemWidth( -1 ); ImGui.InputTextWithHint( "##resourceFilter", "Filter...", ref _resourceManagerFilter, Utf8GamePath.MaxGamePathLength );