Skip to content

Commit 09ca32f

Browse files
committed
Add DalamudSubstitutionProvider
1 parent df80818 commit 09ca32f

File tree

2 files changed

+58
-7
lines changed

2 files changed

+58
-7
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using Dalamud.Plugin.Services;
3+
using Penumbra.Collections.Manager;
4+
using Penumbra.String.Classes;
5+
6+
namespace Penumbra.Api;
7+
8+
public class DalamudSubstitutionProvider : IDisposable
9+
{
10+
private readonly ITextureSubstitutionProvider _substitution;
11+
private readonly ActiveCollectionData _activeCollectionData;
12+
13+
public DalamudSubstitutionProvider(ITextureSubstitutionProvider substitution, ActiveCollectionData activeCollectionData)
14+
{
15+
_substitution = substitution;
16+
_activeCollectionData = activeCollectionData;
17+
_substitution.InterceptTexDataLoad += Substitute;
18+
}
19+
20+
public void Dispose()
21+
=> _substitution.InterceptTexDataLoad -= Substitute;
22+
23+
private void Substitute(string path, ref string? replacementPath)
24+
{
25+
// Let other plugins prioritize replacement paths.
26+
if (replacementPath != null)
27+
return;
28+
29+
// Only replace interface textures.
30+
if (!path.StartsWith("ui/") && !path.StartsWith("common/font/"))
31+
return;
32+
33+
try
34+
{
35+
if (!Utf8GamePath.FromString(path, out var utf8Path, true))
36+
return;
37+
38+
var resolved = _activeCollectionData.Interface.ResolvePath(utf8Path);
39+
replacementPath = resolved?.FullName;
40+
}
41+
catch
42+
{
43+
// ignored
44+
}
45+
}
46+
}

Penumbra/Services/DalamudServices.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System.Linq;
1414
using System.Reflection;
1515
using Dalamud.Interface.DragDrop;
16+
using Dalamud.Plugin.Services;
1617
using Microsoft.Extensions.DependencyInjection;
1718

1819
// ReSharper disable AutoPropertyCanBeMadeGetOnly.Local
@@ -78,24 +79,28 @@ public void AddServices(IServiceCollection services)
7879
services.AddSingleton(this);
7980
services.AddSingleton(UiBuilder);
8081
services.AddSingleton(DragDropManager);
82+
services.AddSingleton(TextureProvider);
83+
services.AddSingleton(TextureSubstitutionProvider);
8184
}
8285

8386
// TODO remove static
8487
// @formatter:off
85-
[PluginService][RequiredVersion("1.0")] public DalamudPluginInterface PluginInterface { get; private set; } = null!;
88+
[PluginService][RequiredVersion("1.0")] public DalamudPluginInterface PluginInterface { get; private set; } = null!;
8689
[PluginService][RequiredVersion("1.0")] public CommandManager Commands { get; private set; } = null!;
8790
[PluginService][RequiredVersion("1.0")] public DataManager GameData { get; private set; } = null!;
8891
[PluginService][RequiredVersion("1.0")] public ClientState ClientState { get; private set; } = null!;
89-
[PluginService][RequiredVersion("1.0")] public ChatGui Chat { get; private set; } = null!;
90-
[PluginService][RequiredVersion("1.0")] public Framework Framework { get; private set; } = null!;
91-
[PluginService][RequiredVersion("1.0")] public Condition Conditions { get; private set; } = null!;
92+
[PluginService][RequiredVersion("1.0")] public ChatGui Chat { get; private set; } = null!;
93+
[PluginService][RequiredVersion("1.0")] public Framework Framework { get; private set; } = null!;
94+
[PluginService][RequiredVersion("1.0")] public Condition Conditions { get; private set; } = null!;
9295
[PluginService][RequiredVersion("1.0")] public TargetManager Targets { get; private set; } = null!;
9396
[PluginService][RequiredVersion("1.0")] public ObjectTable Objects { get; private set; } = null!;
94-
[PluginService][RequiredVersion("1.0")] public TitleScreenMenu TitleScreenMenu { get; private set; } = null!;
97+
[PluginService][RequiredVersion("1.0")] public TitleScreenMenu TitleScreenMenu { get; private set; } = null!;
9598
[PluginService][RequiredVersion("1.0")] public GameGui GameGui { get; private set; } = null!;
96-
[PluginService][RequiredVersion("1.0")] public KeyState KeyState { get; private set; } = null!;
99+
[PluginService][RequiredVersion("1.0")] public KeyState KeyState { get; private set; } = null!;
97100
[PluginService][RequiredVersion("1.0")] public SigScanner SigScanner { get; private set; } = null!;
98-
[PluginService][RequiredVersion("1.0")] public IDragDropManager DragDropManager { get; private set; } = null!;
101+
[PluginService][RequiredVersion("1.0")] public IDragDropManager DragDropManager { get; private set; } = null!;
102+
[PluginService][RequiredVersion("1.0")] public ITextureProvider TextureProvider { get; private set; } = null!;
103+
[PluginService][RequiredVersion("1.0")] public ITextureSubstitutionProvider TextureSubstitutionProvider { get; private set; } = null!;
99104
// @formatter:on
100105

101106
public UiBuilder UiBuilder

0 commit comments

Comments
 (0)