From 9c73cbe596c8479301f0dc19fcc564ba57ba6750 Mon Sep 17 00:00:00 2001 From: goaaats Date: Sun, 15 Feb 2026 17:42:21 +0100 Subject: [PATCH 1/3] Don't throw in HookVerifier if user does not have devPlugins, until api15 --- .../Internal/Verification/HookVerifier.cs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Dalamud/Hooking/Internal/Verification/HookVerifier.cs b/Dalamud/Hooking/Internal/Verification/HookVerifier.cs index 98568a567..721798a40 100644 --- a/Dalamud/Hooking/Internal/Verification/HookVerifier.cs +++ b/Dalamud/Hooking/Internal/Verification/HookVerifier.cs @@ -3,6 +3,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using Dalamud.Configuration.Internal; using Dalamud.Game; using Dalamud.Logging.Internal; @@ -65,6 +66,13 @@ internal static class HookVerifier /// Exception thrown when we think the hook is not correctly declared. public static void Verify(IntPtr address) where T : Delegate { + // API15 TODO: Always throw + var config = Service.GetNullable(); + if (config != null && config.DevPluginLoadLocations.Count == 0) + { + return; + } + var entry = ToVerify.FirstOrDefault(x => x.Address == address); // Nothing to verify for this hook? @@ -121,7 +129,7 @@ internal static class HookVerifier return sameType || SizeOf(paramLeft, isMarshaled) == SizeOf(paramRight, false); } - private static int SizeOf(Type type, bool isMarshaled) + private static int SizeOf(Type type, bool isMarshaled) { return type switch { _ when type == typeof(sbyte) || type == typeof(byte) || (type == typeof(bool) && !isMarshaled) => 1, @@ -137,19 +145,19 @@ internal static class HookVerifier }; } - private static int GetSizeOf(Type type) + private static int GetSizeOf(Type type) { - try + try { return Marshal.SizeOf(Activator.CreateInstance(type)!); - } - catch + } + catch { return 0; } } - private static bool IsStruct(Type type) + private static bool IsStruct(Type type) { return type != typeof(decimal) && type is { IsValueType: true, IsPrimitive: false, IsEnum: false }; } From 2deeacd4434a67acbb49eb1cf8db301ea283472e Mon Sep 17 00:00:00 2001 From: goaaats Date: Sun, 15 Feb 2026 18:12:32 +0100 Subject: [PATCH 2/3] build: 14.0.2.2 --- Dalamud/Dalamud.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dalamud/Dalamud.csproj b/Dalamud/Dalamud.csproj index adaf876ee..5a89f08ae 100644 --- a/Dalamud/Dalamud.csproj +++ b/Dalamud/Dalamud.csproj @@ -6,7 +6,7 @@ XIV Launcher addon framework - 14.0.2.1 + 14.0.2.2 $(DalamudVersion) $(DalamudVersion) $(DalamudVersion) From d417a06db76f679bd4c40a78eb15bc28196bd386 Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 17 Feb 2026 18:27:16 +0100 Subject: [PATCH 3/3] Fix crash on getting the FileName of ImageNodes --- .../Internal/UiDebug/Browsing/NodeTree.Image.cs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Dalamud/Interface/Internal/UiDebug/Browsing/NodeTree.Image.cs b/Dalamud/Interface/Internal/UiDebug/Browsing/NodeTree.Image.cs index 949197f50..8c9207f5d 100644 --- a/Dalamud/Interface/Internal/UiDebug/Browsing/NodeTree.Image.cs +++ b/Dalamud/Interface/Internal/UiDebug/Browsing/NodeTree.Image.cs @@ -297,17 +297,11 @@ internal unsafe partial class ImageNodeTree : ResNodeTree } this.TexType = asset->AtkTexture.TextureType; + this.Texture = asset->AtkTexture.IsTextureReady() ? asset->AtkTexture.GetKernelTexture() : null; - if (this.TexType == Resource) + if (this.TexType == Resource && asset->AtkTexture.Resource != null && asset->AtkTexture.Resource->TexFileResourceHandle != null) { - var resource = asset->AtkTexture.Resource; - this.Texture = resource->KernelTextureObject; - this.Path = Marshal.PtrToStringAnsi(new(resource->TexFileResourceHandle->ResourceHandle.FileName.BufferPtr)); - } - else - { - this.Texture = this.TexType == KernelTexture ? asset->AtkTexture.KernelTexture : null; - this.Path = null; + this.Path = asset->AtkTexture.Resource->TexFileResourceHandle->ResourceHandle.FileName.ToString(); } this.HiRes = this.Path?.Contains("_hr1") ?? false;