From 09ca32f33dd084bbe9e8e8c702efe5e89c6776f8 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Thu, 10 Aug 2023 17:38:35 +0200 Subject: [PATCH] Add DalamudSubstitutionProvider --- Penumbra/Api/DalamudSubstitutionProvider.cs | 46 +++++++++++++++++++++ Penumbra/Services/DalamudServices.cs | 19 +++++---- 2 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 Penumbra/Api/DalamudSubstitutionProvider.cs diff --git a/Penumbra/Api/DalamudSubstitutionProvider.cs b/Penumbra/Api/DalamudSubstitutionProvider.cs new file mode 100644 index 00000000..faa6710a --- /dev/null +++ b/Penumbra/Api/DalamudSubstitutionProvider.cs @@ -0,0 +1,46 @@ +using System; +using Dalamud.Plugin.Services; +using Penumbra.Collections.Manager; +using Penumbra.String.Classes; + +namespace Penumbra.Api; + +public class DalamudSubstitutionProvider : IDisposable +{ + private readonly ITextureSubstitutionProvider _substitution; + private readonly ActiveCollectionData _activeCollectionData; + + public DalamudSubstitutionProvider(ITextureSubstitutionProvider substitution, ActiveCollectionData activeCollectionData) + { + _substitution = substitution; + _activeCollectionData = activeCollectionData; + _substitution.InterceptTexDataLoad += Substitute; + } + + public void Dispose() + => _substitution.InterceptTexDataLoad -= Substitute; + + private void Substitute(string path, ref string? replacementPath) + { + // Let other plugins prioritize replacement paths. + if (replacementPath != null) + return; + + // Only replace interface textures. + if (!path.StartsWith("ui/") && !path.StartsWith("common/font/")) + return; + + try + { + if (!Utf8GamePath.FromString(path, out var utf8Path, true)) + return; + + var resolved = _activeCollectionData.Interface.ResolvePath(utf8Path); + replacementPath = resolved?.FullName; + } + catch + { + // ignored + } + } +} \ No newline at end of file diff --git a/Penumbra/Services/DalamudServices.cs b/Penumbra/Services/DalamudServices.cs index c2cf0c75..491e2161 100644 --- a/Penumbra/Services/DalamudServices.cs +++ b/Penumbra/Services/DalamudServices.cs @@ -13,6 +13,7 @@ using Dalamud.Plugin; using System.Linq; using System.Reflection; using Dalamud.Interface.DragDrop; +using Dalamud.Plugin.Services; using Microsoft.Extensions.DependencyInjection; // ReSharper disable AutoPropertyCanBeMadeGetOnly.Local @@ -78,24 +79,28 @@ public class DalamudServices services.AddSingleton(this); services.AddSingleton(UiBuilder); services.AddSingleton(DragDropManager); + services.AddSingleton(TextureProvider); + services.AddSingleton(TextureSubstitutionProvider); } // TODO remove static // @formatter:off - [PluginService][RequiredVersion("1.0")] public DalamudPluginInterface PluginInterface { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public DalamudPluginInterface PluginInterface { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public CommandManager Commands { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public DataManager GameData { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public ClientState ClientState { get; private set; } = null!; - [PluginService][RequiredVersion("1.0")] public ChatGui Chat { get; private set; } = null!; - [PluginService][RequiredVersion("1.0")] public Framework Framework { get; private set; } = null!; - [PluginService][RequiredVersion("1.0")] public Condition Conditions { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public ChatGui Chat { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public Framework Framework { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public Condition Conditions { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public TargetManager Targets { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public ObjectTable Objects { get; private set; } = null!; - [PluginService][RequiredVersion("1.0")] public TitleScreenMenu TitleScreenMenu { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public TitleScreenMenu TitleScreenMenu { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public GameGui GameGui { get; private set; } = null!; - [PluginService][RequiredVersion("1.0")] public KeyState KeyState { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public KeyState KeyState { get; private set; } = null!; [PluginService][RequiredVersion("1.0")] public SigScanner SigScanner { get; private set; } = null!; - [PluginService][RequiredVersion("1.0")] public IDragDropManager DragDropManager { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public IDragDropManager DragDropManager { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public ITextureProvider TextureProvider { get; private set; } = null!; + [PluginService][RequiredVersion("1.0")] public ITextureSubstitutionProvider TextureSubstitutionProvider { get; private set; } = null!; // @formatter:on public UiBuilder UiBuilder