diff --git a/OtterGui b/OtterGui
index 9b431c1f..c70fcc06 160000
--- a/OtterGui
+++ b/OtterGui
@@ -1 +1 @@
-Subproject commit 9b431c1f491c0739132da65da08bc092d7ff79da
+Subproject commit c70fcc069ea44e1ffb8b33fc409c4ccfdef5e298
diff --git a/Penumbra.GameData b/Penumbra.GameData
index d400686c..3c9e0d03 160000
--- a/Penumbra.GameData
+++ b/Penumbra.GameData
@@ -1 +1 @@
-Subproject commit d400686c8bfb0b9f72fa0c3301d1fe1df9be525b
+Subproject commit 3c9e0d03281c350f8260debb0eab4059408cd0cd
diff --git a/Penumbra/Api/IpcTester.cs b/Penumbra/Api/IpcTester.cs
index 148d4481..dd800f0a 100644
--- a/Penumbra/Api/IpcTester.cs
+++ b/Penumbra/Api/IpcTester.cs
@@ -1,4 +1,5 @@
using Dalamud.Interface;
+using Dalamud.Interface.Utility;
using Dalamud.Plugin;
using ImGuiNET;
using OtterGui;
@@ -15,7 +16,6 @@ using Penumbra.Services;
using Penumbra.UI;
using Penumbra.Collections.Manager;
using Dalamud.Plugin.Services;
-using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
namespace Penumbra.Api;
diff --git a/Penumbra/Collections/Cache/CollectionCacheManager.cs b/Penumbra/Collections/Cache/CollectionCacheManager.cs
index 5daecaa9..a24eb2fa 100644
--- a/Penumbra/Collections/Cache/CollectionCacheManager.cs
+++ b/Penumbra/Collections/Cache/CollectionCacheManager.cs
@@ -1,4 +1,4 @@
-using Dalamud.Game;
+using Dalamud.Plugin.Services;
using OtterGui.Classes;
using Penumbra.Api;
using Penumbra.Api.Enums;
@@ -382,7 +382,7 @@ public class CollectionCacheManager : IDisposable
///
/// Update forced files only on framework.
///
- private void OnFramework(Framework _)
+ private void OnFramework(IFramework _)
{
while (_changeQueue.TryDequeue(out var changeData))
changeData.Apply();
diff --git a/Penumbra/CommandHandler.cs b/Penumbra/CommandHandler.cs
index 920e9cef..3249cc43 100644
--- a/Penumbra/CommandHandler.cs
+++ b/Penumbra/CommandHandler.cs
@@ -1,6 +1,4 @@
-using Dalamud.Game;
using Dalamud.Game.Command;
-using Dalamud.Game.Gui;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Plugin.Services;
using ImGuiNET;
@@ -23,7 +21,7 @@ public class CommandHandler : IDisposable
private readonly ICommandManager _commandManager;
private readonly RedrawService _redrawService;
- private readonly ChatGui _chat;
+ private readonly IChatGui _chat;
private readonly Configuration _config;
private readonly ConfigWindow _configWindow;
private readonly ActorManager _actors;
@@ -32,7 +30,7 @@ public class CommandHandler : IDisposable
private readonly Penumbra _penumbra;
private readonly CollectionEditor _collectionEditor;
- public CommandHandler(Framework framework, ICommandManager commandManager, ChatGui chat, RedrawService redrawService, Configuration config,
+ public CommandHandler(IFramework framework, ICommandManager commandManager, IChatGui chat, RedrawService redrawService, Configuration config,
ConfigWindow configWindow, ModManager modManager, CollectionManager collectionManager, ActorService actors, Penumbra penumbra,
CollectionEditor collectionEditor)
{
diff --git a/Penumbra/Import/Textures/BaseImage.cs b/Penumbra/Import/Textures/BaseImage.cs
index 4f8c5305..a4a0e203 100644
--- a/Penumbra/Import/Textures/BaseImage.cs
+++ b/Penumbra/Import/Textures/BaseImage.cs
@@ -103,7 +103,7 @@ public readonly struct BaseImage : IDisposable
{
null => 0,
ScratchImage s => s.Meta.MipLevels,
- TexFile t => t.Header.MipLevels,
+ TexFile t => t.Header.MipLevelsCount,
_ => 1,
};
}
diff --git a/Penumbra/Import/Textures/CombinedTexture.Manipulation.cs b/Penumbra/Import/Textures/CombinedTexture.Manipulation.cs
index 8bac0a3b..2d131d71 100644
--- a/Penumbra/Import/Textures/CombinedTexture.Manipulation.cs
+++ b/Penumbra/Import/Textures/CombinedTexture.Manipulation.cs
@@ -2,7 +2,7 @@ using ImGuiNET;
using OtterGui.Raii;
using OtterGui;
using SixLabors.ImageSharp.PixelFormats;
-using Dalamud.Interface;
+using Dalamud.Interface.Utility;
using Penumbra.UI;
namespace Penumbra.Import.Textures;
@@ -13,11 +13,11 @@ public partial class CombinedTexture
private Vector4 _constantLeft = Vector4.Zero;
private Matrix4x4 _multiplierRight = Matrix4x4.Identity;
private Vector4 _constantRight = Vector4.Zero;
- private int _offsetX = 0;
- private int _offsetY = 0;
- private CombineOp _combineOp = CombineOp.Over;
- private ResizeOp _resizeOp = ResizeOp.None;
- private Channels _copyChannels = Channels.Red | Channels.Green | Channels.Blue | Channels.Alpha;
+ private int _offsetX;
+ private int _offsetY;
+ private CombineOp _combineOp = CombineOp.Over;
+ private ResizeOp _resizeOp = ResizeOp.None;
+ private Channels _copyChannels = Channels.Red | Channels.Green | Channels.Blue | Channels.Alpha;
private RgbaPixelData _leftPixels = RgbaPixelData.Empty;
private RgbaPixelData _rightPixels = RgbaPixelData.Empty;
diff --git a/Penumbra/Import/Textures/TexFileParser.cs b/Penumbra/Import/Textures/TexFileParser.cs
index 15d45be6..629cdff5 100644
--- a/Penumbra/Import/Textures/TexFileParser.cs
+++ b/Penumbra/Import/Textures/TexFileParser.cs
@@ -79,7 +79,7 @@ public static class TexFileParser
w.Write(header.Width);
w.Write(header.Height);
w.Write(header.Depth);
- w.Write((byte)header.MipLevels);
+ w.Write(header.MipLevelsCount);
w.Write((byte)0); // TODO Lumina Update
unsafe
{
@@ -96,11 +96,11 @@ public static class TexFileParser
var meta = scratch.Meta;
var ret = new TexFile.TexHeader()
{
- Height = (ushort)meta.Height,
- Width = (ushort)meta.Width,
- Depth = (ushort)Math.Max(meta.Depth, 1),
- MipLevels = (byte)Math.Min(meta.MipLevels, 13),
- Format = meta.Format.ToTexFormat(),
+ Height = (ushort)meta.Height,
+ Width = (ushort)meta.Width,
+ Depth = (ushort)Math.Max(meta.Depth, 1),
+ MipLevelsCount = (byte)Math.Min(meta.MipLevels, 13),
+ Format = meta.Format.ToTexFormat(),
Type = meta.Dimension switch
{
_ when meta.IsCubeMap => TexFile.Attribute.TextureTypeCube,
@@ -143,7 +143,7 @@ public static class TexFileParser
Height = header.Height,
Width = header.Width,
Depth = Math.Max(header.Depth, (ushort)1),
- MipLevels = header.MipLevels,
+ MipLevels = header.MipLevelsCount,
ArraySize = 1,
Format = header.Format.ToDXGI(),
Dimension = header.Type.ToDimension(),
diff --git a/Penumbra/Import/Textures/Texture.cs b/Penumbra/Import/Textures/Texture.cs
index fe1d3371..c4d6dc56 100644
--- a/Penumbra/Import/Textures/Texture.cs
+++ b/Penumbra/Import/Textures/Texture.cs
@@ -1,4 +1,4 @@
-using ImGuiScene;
+using Dalamud.Interface.Internal;
using OtterTex;
namespace Penumbra.Import.Textures;
@@ -21,7 +21,7 @@ public sealed class Texture : IDisposable
internal string? TmpPath;
// If the load failed, an exception is stored.
- public Exception? LoadError = null;
+ public Exception? LoadError;
// The pixels of the main image in RGBA order.
// Empty if LoadError != null or Path is empty.
@@ -29,7 +29,7 @@ public sealed class Texture : IDisposable
// The ImGui wrapper to load the image.
// null if LoadError != null or Path is empty.
- public TextureWrap? TextureWrap = null;
+ public IDalamudTextureWrap? TextureWrap;
// The base image in whatever format it has.
public BaseImage BaseImage;
@@ -76,9 +76,9 @@ public sealed class Texture : IDisposable
try
{
- (BaseImage, Type) = textures.Load(path);
- (RgbaPixels, var width, var height) = BaseImage.GetPixelData();
- TextureWrap = textures.LoadTextureWrap(BaseImage, RgbaPixels);
+ (BaseImage, Type) = textures.Load(path);
+ (RgbaPixels, _, _) = BaseImage.GetPixelData();
+ TextureWrap = textures.LoadTextureWrap(BaseImage, RgbaPixels);
Loaded?.Invoke(true);
}
catch (Exception e)
diff --git a/Penumbra/Import/Textures/TextureDrawer.cs b/Penumbra/Import/Textures/TextureDrawer.cs
index a5692c23..bea28749 100644
--- a/Penumbra/Import/Textures/TextureDrawer.cs
+++ b/Penumbra/Import/Textures/TextureDrawer.cs
@@ -94,7 +94,7 @@ public static class TextureDrawer
ImGuiUtil.DrawTableColumn("Format");
ImGuiUtil.DrawTableColumn(t.Header.Format.ToString());
ImGuiUtil.DrawTableColumn("Mip Levels");
- ImGuiUtil.DrawTableColumn(t.Header.MipLevels.ToString());
+ ImGuiUtil.DrawTableColumn(t.Header.MipLevelsCount.ToString());
ImGuiUtil.DrawTableColumn("Data Size");
ImGuiUtil.DrawTableColumn($"{Functions.HumanReadableSize(t.ImageData.Length)} ({t.ImageData.Length} Bytes)");
break;
@@ -106,7 +106,7 @@ public static class TextureDrawer
private int _skipPrefix = 0;
public PathSelectCombo(TextureManager textures, ModEditor editor)
- : base(() => CreateFiles(textures, editor))
+ : base(() => CreateFiles(textures, editor), Penumbra.Log)
{ }
protected override string ToString((string, bool) obj)
diff --git a/Penumbra/Import/Textures/TextureManager.cs b/Penumbra/Import/Textures/TextureManager.cs
index 31c3275e..5653d760 100644
--- a/Penumbra/Import/Textures/TextureManager.cs
+++ b/Penumbra/Import/Textures/TextureManager.cs
@@ -1,6 +1,6 @@
using Dalamud.Interface;
+using Dalamud.Interface.Internal;
using Dalamud.Plugin.Services;
-using ImGuiScene;
using Lumina.Data.Files;
using OtterGui.Log;
using OtterGui.Tasks;
@@ -19,7 +19,7 @@ public sealed class TextureManager : SingleTaskQueue, IDisposable
private readonly IDataManager _gameData;
private readonly ConcurrentDictionary _tasks = new();
- private bool _disposed = false;
+ private bool _disposed;
public TextureManager(UiBuilder uiBuilder, IDataManager gameData, Logger logger)
{
@@ -209,14 +209,14 @@ public sealed class TextureManager : SingleTaskQueue, IDisposable
}
/// Load a texture wrap for a given image.
- public TextureWrap LoadTextureWrap(BaseImage image, byte[]? rgba = null, int width = 0, int height = 0)
+ public IDalamudTextureWrap LoadTextureWrap(BaseImage image, byte[]? rgba = null, int width = 0, int height = 0)
{
(rgba, width, height) = GetData(image, rgba, width, height);
return LoadTextureWrap(rgba, width, height);
}
/// Load a texture wrap for a given image.
- public TextureWrap LoadTextureWrap(byte[] rgba, int width, int height)
+ public IDalamudTextureWrap LoadTextureWrap(byte[] rgba, int width, int height)
=> _uiBuilder.LoadImageRaw(rgba, width, height, 4);
/// Load any supported file from game data or drive depending on extension and if the path is rooted.
@@ -335,7 +335,7 @@ public sealed class TextureManager : SingleTaskQueue, IDisposable
if (numMips == input.Meta.MipLevels)
return input;
- var flags = (Dalamud.Utility.Util.IsLinux() ? FilterFlags.ForceNonWIC : 0) | FilterFlags.SeparateAlpha;
+ var flags = (Dalamud.Utility.Util.IsWine() ? FilterFlags.ForceNonWIC : 0) | FilterFlags.SeparateAlpha;
var ec = input.GenerateMipMaps(out var ret, numMips, flags);
if (ec != ErrorCode.Ok)
throw new Exception(
diff --git a/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs b/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs
index e89f0d10..bacc72fa 100644
--- a/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs
+++ b/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs
@@ -1,7 +1,5 @@
-using Dalamud.Game;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
-using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
using Penumbra.GameData.Files;
using Penumbra.Interop.SafeHandles;
@@ -13,7 +11,7 @@ public sealed unsafe class LiveColorTablePreviewer : LiveMaterialPreviewerBase
public const int TextureHeight = MtrlFile.ColorTable.NumRows;
public const int TextureLength = TextureWidth * TextureHeight * 4;
- private readonly Framework _framework;
+ private readonly IFramework _framework;
private readonly Texture** _colorTableTexture;
private readonly SafeTextureHandle _originalColorTableTexture;
@@ -24,7 +22,7 @@ public sealed unsafe class LiveColorTablePreviewer : LiveMaterialPreviewerBase
public Half[] ColorTable
=> _colorTable;
- public LiveColorTablePreviewer(IObjectTable objects, Framework framework, MaterialInfo materialInfo)
+ public LiveColorTablePreviewer(IObjectTable objects, IFramework framework, MaterialInfo materialInfo)
: base(objects, materialInfo)
{
_framework = framework;
@@ -66,7 +64,7 @@ public sealed unsafe class LiveColorTablePreviewer : LiveMaterialPreviewerBase
_updatePending = true;
}
- private void OnFrameworkUpdate(Framework _)
+ private void OnFrameworkUpdate(IFramework _)
{
if (!_updatePending)
return;
diff --git a/Penumbra/Interop/PathResolving/AnimationHookService.cs b/Penumbra/Interop/PathResolving/AnimationHookService.cs
index 616cb2f6..7f69ceef 100644
--- a/Penumbra/Interop/PathResolving/AnimationHookService.cs
+++ b/Penumbra/Interop/PathResolving/AnimationHookService.cs
@@ -21,13 +21,13 @@ public unsafe class AnimationHookService : IDisposable
private readonly CollectionResolver _collectionResolver;
private readonly DrawObjectState _drawObjectState;
private readonly CollectionResolver _resolver;
- private readonly Condition _conditions;
+ private readonly ICondition _conditions;
private readonly ThreadLocal _animationLoadData = new(() => ResolveData.Invalid, true);
private readonly ThreadLocal _characterSoundData = new(() => ResolveData.Invalid, true);
public AnimationHookService(PerformanceTracker performance, IObjectTable objects, CollectionResolver collectionResolver,
- DrawObjectState drawObjectState, CollectionResolver resolver, Condition conditions)
+ DrawObjectState drawObjectState, CollectionResolver resolver, ICondition conditions, IGameInteropProvider interop)
{
_performance = performance;
_objects = objects;
@@ -36,7 +36,7 @@ public unsafe class AnimationHookService : IDisposable
_resolver = resolver;
_conditions = conditions;
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_loadCharacterSoundHook.Enable();
_loadTimelineResourcesHook.Enable();
diff --git a/Penumbra/Interop/PathResolving/DrawObjectState.cs b/Penumbra/Interop/PathResolving/DrawObjectState.cs
index be1484db..9726d84c 100644
--- a/Penumbra/Interop/PathResolving/DrawObjectState.cs
+++ b/Penumbra/Interop/PathResolving/DrawObjectState.cs
@@ -20,9 +20,9 @@ public class DrawObjectState : IDisposable, IReadOnlyDictionary _lastGameObject.IsValueCreated && _lastGameObject.Value!.Count > 0 ? _lastGameObject.Value.Peek() : nint.Zero;
- public DrawObjectState(IObjectTable objects, GameEventManager gameEvents)
+ public DrawObjectState(IObjectTable objects, GameEventManager gameEvents, IGameInteropProvider interop)
{
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_enableDrawHook.Enable();
_objects = objects;
_gameEvents = gameEvents;
diff --git a/Penumbra/Interop/PathResolving/IdentifiedCollectionCache.cs b/Penumbra/Interop/PathResolving/IdentifiedCollectionCache.cs
index 0b456b3c..73c20ab9 100644
--- a/Penumbra/Interop/PathResolving/IdentifiedCollectionCache.cs
+++ b/Penumbra/Interop/PathResolving/IdentifiedCollectionCache.cs
@@ -85,7 +85,7 @@ public unsafe class IdentifiedCollectionCache : IDisposable, IEnumerable<(nint A
_dirty = _cache.Count > 0;
}
- private void TerritoryClear(object? _1, ushort _2)
+ private void TerritoryClear(ushort _2)
=> _dirty = _cache.Count > 0;
private void OnCharacterDestruct(Character* character)
diff --git a/Penumbra/Interop/PathResolving/MetaState.cs b/Penumbra/Interop/PathResolving/MetaState.cs
index a68e376b..6defe78c 100644
--- a/Penumbra/Interop/PathResolving/MetaState.cs
+++ b/Penumbra/Interop/PathResolving/MetaState.cs
@@ -1,4 +1,5 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
@@ -59,7 +60,7 @@ public unsafe class MetaState : IDisposable
private DisposableContainer _characterBaseCreateMetaChanges = DisposableContainer.Empty;
public MetaState(PerformanceTracker performance, CommunicatorService communicator, CollectionResolver collectionResolver,
- ResourceLoader resources, GameEventManager gameEventManager, CharacterUtility characterUtility, Configuration config)
+ ResourceLoader resources, GameEventManager gameEventManager, CharacterUtility characterUtility, Configuration config, IGameInteropProvider interop)
{
_performance = performance;
_communicator = communicator;
@@ -68,8 +69,8 @@ public unsafe class MetaState : IDisposable
_gameEventManager = gameEventManager;
_characterUtility = characterUtility;
_config = config;
- SignatureHelper.Initialise(this);
- _onModelLoadCompleteHook = Hook.FromAddress(_humanVTable[58], OnModelLoadCompleteDetour);
+ interop.InitializeFromAttributes(this);
+ _onModelLoadCompleteHook = interop.HookFromAddress(_humanVTable[58], OnModelLoadCompleteDetour);
_getEqpIndirectHook.Enable();
_updateModelsHook.Enable();
_onModelLoadCompleteHook.Enable();
diff --git a/Penumbra/Interop/PathResolving/PathState.cs b/Penumbra/Interop/PathResolving/PathState.cs
index 0c6566a3..4fb3d31d 100644
--- a/Penumbra/Interop/PathResolving/PathState.cs
+++ b/Penumbra/Interop/PathResolving/PathState.cs
@@ -1,3 +1,4 @@
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using Penumbra.Collections;
using Penumbra.GameData;
@@ -34,16 +35,16 @@ public unsafe class PathState : IDisposable
public IList CurrentData
=> _resolveData.Values;
- public PathState(CollectionResolver collectionResolver, MetaState metaState, CharacterUtility characterUtility)
+ public PathState(CollectionResolver collectionResolver, MetaState metaState, CharacterUtility characterUtility, IGameInteropProvider interop)
{
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
CollectionResolver = collectionResolver;
MetaState = metaState;
CharacterUtility = characterUtility;
- _human = new ResolvePathHooks(this, _humanVTable, ResolvePathHooks.Type.Human);
- _weapon = new ResolvePathHooks(this, _weaponVTable, ResolvePathHooks.Type.Weapon);
- _demiHuman = new ResolvePathHooks(this, _demiHumanVTable, ResolvePathHooks.Type.Other);
- _monster = new ResolvePathHooks(this, _monsterVTable, ResolvePathHooks.Type.Other);
+ _human = new ResolvePathHooks(interop, this, _humanVTable, ResolvePathHooks.Type.Human);
+ _weapon = new ResolvePathHooks(interop, this, _weaponVTable, ResolvePathHooks.Type.Weapon);
+ _demiHuman = new ResolvePathHooks(interop, this, _demiHumanVTable, ResolvePathHooks.Type.Other);
+ _monster = new ResolvePathHooks(interop, this, _monsterVTable, ResolvePathHooks.Type.Other);
_human.Enable();
_weapon.Enable();
_demiHuman.Enable();
diff --git a/Penumbra/Interop/PathResolving/ResolvePathHooks.cs b/Penumbra/Interop/PathResolving/ResolvePathHooks.cs
index 6f8f93dd..f9a341b9 100644
--- a/Penumbra/Interop/PathResolving/ResolvePathHooks.cs
+++ b/Penumbra/Interop/PathResolving/ResolvePathHooks.cs
@@ -1,4 +1,5 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using OtterGui.Classes;
using Penumbra.Collections;
@@ -35,21 +36,21 @@ public unsafe class ResolvePathHooks : IDisposable
private readonly PathState _parent;
- public ResolvePathHooks(PathState parent, nint* vTable, Type type)
+ public ResolvePathHooks(IGameInteropProvider interop, PathState parent, nint* vTable, Type type)
{
_parent = parent;
- _resolveDecalPathHook = Create(vTable[83], type, ResolveDecalWeapon, ResolveDecal);
- _resolveEidPathHook = Create(vTable[85], type, ResolveEidWeapon, ResolveEid);
- _resolveImcPathHook = Create(vTable[81], type, ResolveImcWeapon, ResolveImc);
- _resolveMPapPathHook = Create(vTable[79], type, ResolveMPapWeapon, ResolveMPap);
- _resolveMdlPathHook = Create(vTable[73], type, ResolveMdlWeapon, ResolveMdl, ResolveMdlHuman);
- _resolveMtrlPathHook = Create(vTable[82], type, ResolveMtrlWeapon, ResolveMtrl);
- _resolvePapPathHook = Create(vTable[76], type, ResolvePapWeapon, ResolvePap, ResolvePapHuman);
- _resolvePhybPathHook = Create(vTable[75], type, ResolvePhybWeapon, ResolvePhyb, ResolvePhybHuman);
- _resolveSklbPathHook = Create(vTable[72], type, ResolveSklbWeapon, ResolveSklb, ResolveSklbHuman);
- _resolveSkpPathHook = Create(vTable[74], type, ResolveSkpWeapon, ResolveSkp, ResolveSkpHuman);
- _resolveTmbPathHook = Create(vTable[77], type, ResolveTmbWeapon, ResolveTmb);
- _resolveVfxPathHook = Create(vTable[84], type, ResolveVfxWeapon, ResolveVfx);
+ _resolveDecalPathHook = Create(interop, vTable[83], type, ResolveDecalWeapon, ResolveDecal);
+ _resolveEidPathHook = Create(interop, vTable[85], type, ResolveEidWeapon, ResolveEid);
+ _resolveImcPathHook = Create(interop, vTable[81], type, ResolveImcWeapon, ResolveImc);
+ _resolveMPapPathHook = Create(interop, vTable[79], type, ResolveMPapWeapon, ResolveMPap);
+ _resolveMdlPathHook = Create(interop, vTable[73], type, ResolveMdlWeapon, ResolveMdl, ResolveMdlHuman);
+ _resolveMtrlPathHook = Create(interop, vTable[82], type, ResolveMtrlWeapon, ResolveMtrl);
+ _resolvePapPathHook = Create(interop, vTable[76], type, ResolvePapWeapon, ResolvePap, ResolvePapHuman);
+ _resolvePhybPathHook = Create(interop, vTable[75], type, ResolvePhybWeapon, ResolvePhyb, ResolvePhybHuman);
+ _resolveSklbPathHook = Create(interop, vTable[72], type, ResolveSklbWeapon, ResolveSklb, ResolveSklbHuman);
+ _resolveSkpPathHook = Create(interop, vTable[74], type, ResolveSkpWeapon, ResolveSkp, ResolveSkpHuman);
+ _resolveTmbPathHook = Create(interop, vTable[77], type, ResolveTmbWeapon, ResolveTmb);
+ _resolveVfxPathHook = Create(interop, vTable[84], type, ResolveVfxWeapon, ResolveVfx);
}
public void Enable()
@@ -217,7 +218,7 @@ public unsafe class ResolvePathHooks : IDisposable
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
- private static Hook Create(nint address, Type type, T weapon, T other, T human) where T : Delegate
+ private static Hook Create(IGameInteropProvider interop, nint address, Type type, T weapon, T other, T human) where T : Delegate
{
var del = type switch
{
@@ -225,12 +226,12 @@ public unsafe class ResolvePathHooks : IDisposable
Type.Weapon => weapon,
_ => other,
};
- return Hook.FromAddress(address, del);
+ return interop.HookFromAddress(address, del);
}
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
- private static Hook Create(nint address, Type type, T weapon, T other) where T : Delegate
- => Create(address, type, weapon, other, other);
+ private static Hook Create(IGameInteropProvider interop, nint address, Type type, T weapon, T other) where T : Delegate
+ => Create(interop, address, type, weapon, other, other);
// Implementation
diff --git a/Penumbra/Interop/PathResolving/SubfileHelper.cs b/Penumbra/Interop/PathResolving/SubfileHelper.cs
index a8fd816a..3a60450d 100644
--- a/Penumbra/Interop/PathResolving/SubfileHelper.cs
+++ b/Penumbra/Interop/PathResolving/SubfileHelper.cs
@@ -1,4 +1,5 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using Penumbra.Api.Enums;
using Penumbra.Collections;
@@ -30,9 +31,9 @@ public unsafe class SubfileHelper : IDisposable, IReadOnlyCollection _subFileCollection = new();
- public SubfileHelper(PerformanceTracker performance, ResourceLoader loader, GameEventManager events, CommunicatorService communicator)
+ public SubfileHelper(PerformanceTracker performance, ResourceLoader loader, GameEventManager events, CommunicatorService communicator, IGameInteropProvider interop)
{
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_performance = performance;
_loader = loader;
diff --git a/Penumbra/Interop/ResourceLoading/CreateFileWHook.cs b/Penumbra/Interop/ResourceLoading/CreateFileWHook.cs
index ca9c2577..b77ac1e0 100644
--- a/Penumbra/Interop/ResourceLoading/CreateFileWHook.cs
+++ b/Penumbra/Interop/ResourceLoading/CreateFileWHook.cs
@@ -1,4 +1,5 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using Penumbra.String;
using Penumbra.String.Classes;
using Penumbra.String.Functions;
@@ -14,9 +15,9 @@ public unsafe class CreateFileWHook : IDisposable
{
public const int RequiredSize = 28;
- public CreateFileWHook()
+ public CreateFileWHook(IGameInteropProvider interop)
{
- _createFileWHook = Hook.FromImport(null, "KERNEL32.dll", "CreateFileW", 0, CreateFileWDetour);
+ _createFileWHook = interop.HookFromImport(null, "KERNEL32.dll", "CreateFileW", 0, CreateFileWDetour);
_createFileWHook.Enable();
}
diff --git a/Penumbra/Interop/ResourceLoading/FileReadService.cs b/Penumbra/Interop/ResourceLoading/FileReadService.cs
index 9dc89ab2..64442771 100644
--- a/Penumbra/Interop/ResourceLoading/FileReadService.cs
+++ b/Penumbra/Interop/ResourceLoading/FileReadService.cs
@@ -1,4 +1,5 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using Penumbra.GameData;
using Penumbra.Interop.Structs;
@@ -8,11 +9,11 @@ namespace Penumbra.Interop.ResourceLoading;
public unsafe class FileReadService : IDisposable
{
- public FileReadService(PerformanceTracker performance, ResourceManagerService resourceManager)
+ public FileReadService(PerformanceTracker performance, ResourceManagerService resourceManager, IGameInteropProvider interop)
{
_resourceManager = resourceManager;
_performance = performance;
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_readSqPackHook.Enable();
}
diff --git a/Penumbra/Interop/ResourceLoading/ResourceManagerService.cs b/Penumbra/Interop/ResourceLoading/ResourceManagerService.cs
index ce7d3d4c..a087a659 100644
--- a/Penumbra/Interop/ResourceLoading/ResourceManagerService.cs
+++ b/Penumbra/Interop/ResourceLoading/ResourceManagerService.cs
@@ -1,3 +1,4 @@
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.System.Resource;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
@@ -10,8 +11,8 @@ namespace Penumbra.Interop.ResourceLoading;
public unsafe class ResourceManagerService
{
- public ResourceManagerService()
- => SignatureHelper.Initialise(this);
+ public ResourceManagerService(IGameInteropProvider interop)
+ => interop.InitializeFromAttributes(this);
/// The SE Resource Manager as pointer.
public ResourceManager* ResourceManager
diff --git a/Penumbra/Interop/ResourceLoading/ResourceService.cs b/Penumbra/Interop/ResourceLoading/ResourceService.cs
index 5d060d85..47107f44 100644
--- a/Penumbra/Interop/ResourceLoading/ResourceService.cs
+++ b/Penumbra/Interop/ResourceLoading/ResourceService.cs
@@ -1,8 +1,8 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.System.Resource;
using Penumbra.Api.Enums;
-using Penumbra.Collections;
using Penumbra.GameData;
using Penumbra.Interop.Structs;
using Penumbra.String;
@@ -16,19 +16,19 @@ public unsafe class ResourceService : IDisposable
private readonly PerformanceTracker _performance;
private readonly ResourceManagerService _resourceManager;
- public ResourceService(PerformanceTracker performance, ResourceManagerService resourceManager)
+ public ResourceService(PerformanceTracker performance, ResourceManagerService resourceManager, IGameInteropProvider interop)
{
_performance = performance;
_resourceManager = resourceManager;
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_getResourceSyncHook.Enable();
_getResourceAsyncHook.Enable();
_resourceHandleDestructorHook.Enable();
- _incRefHook = Hook.FromAddress(
+ _incRefHook = interop.HookFromAddress(
(nint)FFXIVClientStructs.FFXIV.Client.System.Resource.Handle.ResourceHandle.MemberFunctionPointers.IncRef,
ResourceHandleIncRefDetour);
_incRefHook.Enable();
- _decRefHook = Hook.FromAddress(
+ _decRefHook = interop.HookFromAddress(
(nint)FFXIVClientStructs.FFXIV.Client.System.Resource.Handle.ResourceHandle.MemberFunctionPointers.DecRef,
ResourceHandleDecRefDetour);
_decRefHook.Enable();
diff --git a/Penumbra/Interop/ResourceLoading/TexMdlService.cs b/Penumbra/Interop/ResourceLoading/TexMdlService.cs
index 574da240..68ad518c 100644
--- a/Penumbra/Interop/ResourceLoading/TexMdlService.cs
+++ b/Penumbra/Interop/ResourceLoading/TexMdlService.cs
@@ -1,4 +1,5 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
using Penumbra.Api.Enums;
@@ -19,9 +20,9 @@ public unsafe class TexMdlService
public IReadOnlySet CustomFileCrc
=> _customFileCrc;
- public TexMdlService()
+ public TexMdlService(IGameInteropProvider interop)
{
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_checkFileStateHook.Enable();
_loadTexFileExternHook.Enable();
_loadMdlFileExternHook.Enable();
diff --git a/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs b/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs
index dee28797..df97371b 100644
--- a/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs
+++ b/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs
@@ -1,4 +1,4 @@
-using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
+using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
using Penumbra.Interop.Structs;
namespace Penumbra.Interop.SafeHandles;
diff --git a/Penumbra/Interop/Services/CharacterUtility.cs b/Penumbra/Interop/Services/CharacterUtility.cs
index 48824888..699b59e0 100644
--- a/Penumbra/Interop/Services/CharacterUtility.cs
+++ b/Penumbra/Interop/Services/CharacterUtility.cs
@@ -1,4 +1,4 @@
-using Dalamud.Game;
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using Penumbra.Collections.Manager;
using Penumbra.GameData;
@@ -6,7 +6,7 @@ using Penumbra.Interop.Structs;
namespace Penumbra.Interop.Services;
-public unsafe partial class CharacterUtility : IDisposable
+public unsafe class CharacterUtility : IDisposable
{
public record struct InternalIndex(int Value);
@@ -52,12 +52,12 @@ public unsafe partial class CharacterUtility : IDisposable
public (nint Address, int Size) DefaultResource(InternalIndex idx)
=> _lists[idx.Value].DefaultResource;
- private readonly Framework _framework;
+ private readonly IFramework _framework;
public readonly ActiveCollectionData Active;
- public CharacterUtility(Framework framework, ActiveCollectionData active)
+ public CharacterUtility(IFramework framework, IGameInteropProvider interop, ActiveCollectionData active)
{
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_lists = Enumerable.Range(0, RelevantIndices.Length)
.Select(idx => new MetaList(this, new InternalIndex(idx)))
.ToArray();
diff --git a/Penumbra/Interop/Services/FontReloader.cs b/Penumbra/Interop/Services/FontReloader.cs
index 76a205dc..2f4a3cfd 100644
--- a/Penumbra/Interop/Services/FontReloader.cs
+++ b/Penumbra/Interop/Services/FontReloader.cs
@@ -1,3 +1,4 @@
+using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.System.Framework;
using FFXIVClientStructs.FFXIV.Component.GUI;
using Penumbra.GameData;
@@ -24,7 +25,7 @@ public unsafe class FontReloader
private AtkModule* _atkModule = null!;
private delegate* unmanaged _reloadFontsFunc = null!;
- public FontReloader(Dalamud.Game.Framework dFramework)
+ public FontReloader(IFramework dFramework)
{
dFramework.RunOnFrameworkThread(() =>
{
diff --git a/Penumbra/Interop/Services/GameEventManager.cs b/Penumbra/Interop/Services/GameEventManager.cs
index 2e8a23f0..59714ff0 100644
--- a/Penumbra/Interop/Services/GameEventManager.cs
+++ b/Penumbra/Interop/Services/GameEventManager.cs
@@ -1,4 +1,5 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using Penumbra.GameData;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
@@ -20,9 +21,9 @@ public unsafe class GameEventManager : IDisposable
public event WeaponReloadingEvent? WeaponReloading;
public event WeaponReloadedEvent? WeaponReloaded;
- public GameEventManager()
+ public GameEventManager(IGameInteropProvider interop)
{
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_characterDtorHook.Enable();
_copyCharacterHook.Enable();
_resourceHandleDestructorHook.Enable();
diff --git a/Penumbra/Interop/Services/RedrawService.cs b/Penumbra/Interop/Services/RedrawService.cs
index 65d5b0c0..0864bb71 100644
--- a/Penumbra/Interop/Services/RedrawService.cs
+++ b/Penumbra/Interop/Services/RedrawService.cs
@@ -100,10 +100,10 @@ public unsafe partial class RedrawService
public sealed unsafe partial class RedrawService : IDisposable
{
- private readonly Framework _framework;
+ private readonly IFramework _framework;
private readonly IObjectTable _objects;
private readonly ITargetManager _targets;
- private readonly Condition _conditions;
+ private readonly ICondition _conditions;
private readonly List _queue = new(100);
private readonly List _afterGPoseQueue = new(GPoseSlots);
@@ -111,7 +111,7 @@ public sealed unsafe partial class RedrawService : IDisposable
public event GameObjectRedrawnDelegate? GameObjectRedrawn;
- public RedrawService(Framework framework, IObjectTable objects, ITargetManager targets, Condition conditions)
+ public RedrawService(IFramework framework, IObjectTable objects, ITargetManager targets, ICondition conditions)
{
_framework = framework;
_objects = objects;
diff --git a/Penumbra/Interop/Services/ResidentResourceManager.cs b/Penumbra/Interop/Services/ResidentResourceManager.cs
index ff7f95a5..72697185 100644
--- a/Penumbra/Interop/Services/ResidentResourceManager.cs
+++ b/Penumbra/Interop/Services/ResidentResourceManager.cs
@@ -1,3 +1,4 @@
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using Penumbra.GameData;
@@ -21,10 +22,8 @@ public unsafe class ResidentResourceManager
public Structs.ResidentResourceManager* Address
=> *_residentResourceManagerAddress;
- public ResidentResourceManager()
- {
- SignatureHelper.Initialise(this);
- }
+ public ResidentResourceManager(IGameInteropProvider interop)
+ => interop.InitializeFromAttributes(this);
// Reload certain player resources by force.
public void Reload()
diff --git a/Penumbra/Interop/Services/SkinFixer.cs b/Penumbra/Interop/Services/SkinFixer.cs
index 211a062c..be5b778e 100644
--- a/Penumbra/Interop/Services/SkinFixer.cs
+++ b/Penumbra/Interop/Services/SkinFixer.cs
@@ -1,4 +1,5 @@
using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
using OtterGui.Classes;
@@ -48,13 +49,13 @@ public sealed unsafe class SkinFixer : IDisposable
public int ModdedSkinShpkCount
=> _moddedSkinShpkCount;
- public SkinFixer(GameEventManager gameEvents, CharacterUtility utility, CommunicatorService communicator)
+ public SkinFixer(GameEventManager gameEvents, CharacterUtility utility, CommunicatorService communicator, IGameInteropProvider interop)
{
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
_gameEvents = gameEvents;
_utility = utility;
_communicator = communicator;
- _onRenderMaterialHook = Hook.FromAddress(_humanVTable[62], OnRenderHumanMaterial);
+ _onRenderMaterialHook = interop.HookFromAddress(_humanVTable[62], OnRenderHumanMaterial);
_communicator.MtrlShpkLoaded.Subscribe(OnMtrlShpkLoaded, MtrlShpkLoaded.Priority.SkinFixer);
_gameEvents.ResourceHandleDestructor += OnResourceHandleDestructor;
_onRenderMaterialHook.Enable();
diff --git a/Penumbra/Interop/Structs/CharacterBaseExt.cs b/Penumbra/Interop/Structs/CharacterBaseExt.cs
index 7cdcc6fe..53fda2cd 100644
--- a/Penumbra/Interop/Structs/CharacterBaseExt.cs
+++ b/Penumbra/Interop/Structs/CharacterBaseExt.cs
@@ -1,4 +1,4 @@
-using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
+using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
namespace Penumbra.Interop.Structs;
diff --git a/Penumbra/Interop/Structs/Material.cs b/Penumbra/Interop/Structs/Material.cs
index 0165a8ff..f7c8679e 100644
--- a/Penumbra/Interop/Structs/Material.cs
+++ b/Penumbra/Interop/Structs/Material.cs
@@ -1,4 +1,4 @@
-using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
+using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
namespace Penumbra.Interop.Structs;
diff --git a/Penumbra/Interop/Structs/TextureUtility.cs b/Penumbra/Interop/Structs/TextureUtility.cs
index a81480fb..eeea4c33 100644
--- a/Penumbra/Interop/Structs/TextureUtility.cs
+++ b/Penumbra/Interop/Structs/TextureUtility.cs
@@ -1,37 +1,31 @@
+using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
-using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
namespace Penumbra.Interop.Structs;
-public static unsafe class TextureUtility
+public unsafe class TextureUtility
{
- private static readonly Functions Funcs = new();
+ public TextureUtility(IGameInteropProvider interop)
+ => interop.InitializeFromAttributes(this);
+
+
+ [Signature("E8 ?? ?? ?? ?? 8B 0F 48 8D 54 24")]
+ private static nint _textureCreate2D = nint.Zero;
+
+ [Signature("E9 ?? ?? ?? ?? 8B 02 25")]
+ private static nint _textureInitializeContents = nint.Zero;
public static Texture* Create2D(Device* device, int* size, byte mipLevel, uint textureFormat, uint flags, uint unk)
- => ((delegate* unmanaged)Funcs.TextureCreate2D)(device, size, mipLevel, textureFormat,
+ => ((delegate* unmanaged)_textureCreate2D)(device, size, mipLevel, textureFormat,
flags, unk);
public static bool InitializeContents(Texture* texture, void* contents)
- => ((delegate* unmanaged)Funcs.TextureInitializeContents)(texture, contents);
+ => ((delegate* unmanaged)_textureInitializeContents)(texture, contents);
public static void IncRef(Texture* texture)
=> ((delegate* unmanaged)(*(void***)texture)[2])(texture);
public static void DecRef(Texture* texture)
=> ((delegate* unmanaged)(*(void***)texture)[3])(texture);
-
- private sealed class Functions
- {
- [Signature("E8 ?? ?? ?? ?? 8B 0F 48 8D 54 24")]
- public nint TextureCreate2D = nint.Zero;
-
- [Signature("E9 ?? ?? ?? ?? 8B 02 25")]
- public nint TextureInitializeContents = nint.Zero;
-
- public Functions()
- {
- SignatureHelper.Initialise(this);
- }
- }
}
diff --git a/Penumbra/Meta/MetaFileManager.cs b/Penumbra/Meta/MetaFileManager.cs
index 3155e188..d918bda2 100644
--- a/Penumbra/Meta/MetaFileManager.cs
+++ b/Penumbra/Meta/MetaFileManager.cs
@@ -29,7 +29,7 @@ public unsafe class MetaFileManager
public MetaFileManager(CharacterUtility characterUtility, ResidentResourceManager residentResources, IDataManager gameData,
ActiveCollectionData activeCollections, Configuration config, ValidityChecker validityChecker, IdentifierService identifier,
- FileCompactor compactor)
+ FileCompactor compactor, IGameInteropProvider interop)
{
CharacterUtility = characterUtility;
ResidentResources = residentResources;
@@ -39,7 +39,7 @@ public unsafe class MetaFileManager
ValidityChecker = validityChecker;
Identifier = identifier;
Compactor = compactor;
- SignatureHelper.Initialise(this);
+ interop.InitializeFromAttributes(this);
}
public void WriteAllTexToolsMeta(Mod mod)
diff --git a/Penumbra/Mods/Manager/ModStorage.cs b/Penumbra/Mods/Manager/ModStorage.cs
index 83d20969..490381d6 100644
--- a/Penumbra/Mods/Manager/ModStorage.cs
+++ b/Penumbra/Mods/Manager/ModStorage.cs
@@ -12,7 +12,7 @@ public class ModCombo : FilterComboCache
=> obj.Name.Text;
public ModCombo(Func> generator)
- : base(generator)
+ : base(generator, Penumbra.Log)
{ }
}
diff --git a/Penumbra/Penumbra.cs b/Penumbra/Penumbra.cs
index 2cca1789..0519baae 100644
--- a/Penumbra/Penumbra.cs
+++ b/Penumbra/Penumbra.cs
@@ -19,7 +19,9 @@ using Penumbra.UI.Tabs;
using ChangedItemClick = Penumbra.Communication.ChangedItemClick;
using ChangedItemHover = Penumbra.Communication.ChangedItemHover;
using OtterGui.Tasks;
+using Penumbra.Interop.Structs;
using Penumbra.UI;
+using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManager;
namespace Penumbra;
@@ -53,7 +55,7 @@ public class Penumbra : IDalamudPlugin
var startTimer = new StartTracker();
using var timer = startTimer.Measure(StartTimeType.Total);
_services = ServiceManager.CreateProvider(this, pluginInterface, Log, startTimer);
- Chat = _services.GetRequiredService();
+ Chat = _services.GetRequiredService();
_validityChecker = _services.GetRequiredService();
var startup = _services.GetRequiredService().GetDalamudConfig(DalamudServices.WaitingForPluginsOption, out bool s)
? s.ToString()
@@ -73,11 +75,13 @@ public class Penumbra : IDalamudPlugin
_communicatorService = _services.GetRequiredService();
_services.GetRequiredService(); // Initialize because not required anywhere else.
_services.GetRequiredService(); // Initialize because not required anywhere else.
+ _services.GetRequiredService(); // Initialize because not required anywhere else.
_collectionManager.Caches.CreateNecessaryCaches();
using (var t = _services.GetRequiredService().Measure(StartTimeType.PathResolver))
{
_services.GetRequiredService();
}
+
_services.GetRequiredService();
SetupInterface();
@@ -187,7 +191,7 @@ public class Penumbra : IDalamudPlugin
sb.Append($"> **`Commit Hash: `** {_validityChecker.CommitHash}\n");
sb.Append($"> **`Enable Mods: `** {_config.EnableMods}\n");
sb.Append($"> **`Enable HTTP API: `** {_config.EnableHttpApi}\n");
- sb.Append($"> **`Operating System: `** {(Dalamud.Utility.Util.IsLinux() ? "Mac/Linux (Wine)" : "Windows")}\n");
+ sb.Append($"> **`Operating System: `** {(Dalamud.Utility.Util.IsWine() ? "Mac/Linux (Wine)" : "Windows")}\n");
sb.Append($"> **`Root Directory: `** `{_config.ModDirectory}`, {(exists ? "Exists" : "Not Existing")}\n");
sb.Append(
$"> **`Free Drive Space: `** {(drive != null ? Functions.HumanReadableSize(drive.AvailableFreeSpace) : "Unknown")}\n");
diff --git a/Penumbra/Services/ChatService.cs b/Penumbra/Services/ChatService.cs
index adb24618..3e715a4f 100644
--- a/Penumbra/Services/ChatService.cs
+++ b/Penumbra/Services/ChatService.cs
@@ -1,8 +1,8 @@
-using Dalamud.Game.Gui;
using Dalamud.Game.Text;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Plugin;
+using Dalamud.Plugin.Services;
using Lumina.Excel.GeneratedSheets;
using OtterGui.Log;
@@ -10,9 +10,9 @@ namespace Penumbra.Services;
public class ChatService : OtterGui.Classes.ChatService
{
- private readonly ChatGui _chat;
+ private readonly IChatGui _chat;
- public ChatService(Logger log, DalamudPluginInterface pi, ChatGui chat)
+ public ChatService(Logger log, DalamudPluginInterface pi, IChatGui chat)
: base(log, pi)
=> _chat = chat;
@@ -37,7 +37,7 @@ public class ChatService : OtterGui.Classes.ChatService
var payload = new SeString(payloadList);
- _chat.PrintChat(new XivChatEntry
+ _chat.Print(new XivChatEntry
{
Message = payload,
});
diff --git a/Penumbra/Services/DalamudServices.cs b/Penumbra/Services/DalamudServices.cs
index 0cd4c97a..99539c39 100644
--- a/Penumbra/Services/DalamudServices.cs
+++ b/Penumbra/Services/DalamudServices.cs
@@ -1,8 +1,5 @@
using Dalamud.Game;
-using Dalamud.Game.ClientState.Conditions;
-using Dalamud.Game.ClientState.Keys;
using Dalamud.Game.ClientState.Objects;
-using Dalamud.Game.Gui;
using Dalamud.Interface;
using Dalamud.IoC;
using Dalamud.Plugin;
@@ -75,6 +72,8 @@ public class DalamudServices
services.AddSingleton(DragDropManager);
services.AddSingleton(TextureProvider);
services.AddSingleton(TextureSubstitutionProvider);
+ services.AddSingleton(Interop);
+ services.AddSingleton(Log);
}
// TODO remove static
@@ -83,18 +82,20 @@ public class DalamudServices
[PluginService][RequiredVersion("1.0")] public ICommandManager Commands { get; private set; } = null!;
[PluginService][RequiredVersion("1.0")] public IDataManager GameData { get; private set; } = null!;
[PluginService][RequiredVersion("1.0")] public IClientState 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 IChatGui Chat { get; private set; } = null!;
+ [PluginService][RequiredVersion("1.0")] public IFramework Framework { get; private set; } = null!;
+ [PluginService][RequiredVersion("1.0")] public ICondition Conditions { get; private set; } = null!;
[PluginService][RequiredVersion("1.0")] public ITargetManager Targets { get; private set; } = null!;
[PluginService][RequiredVersion("1.0")] public IObjectTable Objects { get; private set; } = null!;
- [PluginService][RequiredVersion("1.0")] public TitleScreenMenu TitleScreenMenu { get; private set; } = null!;
+ [PluginService][RequiredVersion("1.0")] public ITitleScreenMenu TitleScreenMenu { get; private set; } = null!;
[PluginService][RequiredVersion("1.0")] public IGameGui GameGui { get; private set; } = null!;
- [PluginService][RequiredVersion("1.0")] public KeyState KeyState { get; private set; } = null!;
+ [PluginService][RequiredVersion("1.0")] public IKeyState KeyState { get; private set; } = null!;
[PluginService][RequiredVersion("1.0")] public ISigScanner SigScanner { 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!;
+ [PluginService][RequiredVersion("1.0")] public IGameInteropProvider Interop { get; private set; } = null!;
+ [PluginService][RequiredVersion("1.0")] public IPluginLog Log { get; private set; } = null!;
// @formatter:on
public UiBuilder UiBuilder
diff --git a/Penumbra/Services/ServiceManager.cs b/Penumbra/Services/ServiceManager.cs
index b76c39ef..9e3b9b1a 100644
--- a/Penumbra/Services/ServiceManager.cs
+++ b/Penumbra/Services/ServiceManager.cs
@@ -13,6 +13,7 @@ using Penumbra.Interop.PathResolving;
using Penumbra.Interop.ResourceLoading;
using Penumbra.Interop.ResourceTree;
using Penumbra.Interop.Services;
+using Penumbra.Interop.Structs;
using Penumbra.Meta;
using Penumbra.Mods;
using Penumbra.Mods.Editor;
@@ -23,6 +24,7 @@ using Penumbra.UI.Classes;
using Penumbra.UI.ModsTab;
using Penumbra.UI.ResourceWatcher;
using Penumbra.UI.Tabs;
+using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManager;
namespace Penumbra.Services;
@@ -88,7 +90,8 @@ public static class ServiceManager
.AddSingleton()
.AddSingleton()
.AddSingleton()
- .AddSingleton();
+ .AddSingleton()
+ .AddSingleton();
private static IServiceCollection AddConfiguration(this IServiceCollection services)
=> services.AddTransient()
diff --git a/Penumbra/Services/StainService.cs b/Penumbra/Services/StainService.cs
index 30e22a7a..bbbfcc71 100644
--- a/Penumbra/Services/StainService.cs
+++ b/Penumbra/Services/StainService.cs
@@ -12,7 +12,7 @@ public class StainService : IDisposable
public sealed class StainTemplateCombo : FilterComboCache
{
public StainTemplateCombo(IEnumerable items)
- : base(items)
+ : base(items, Penumbra.Log)
{ }
}
@@ -21,12 +21,12 @@ public class StainService : IDisposable
public readonly StmFile StmFile;
public readonly StainTemplateCombo TemplateCombo;
- public StainService(StartTracker timer, DalamudPluginInterface pluginInterface, IDataManager dataManager)
+ public StainService(StartTracker timer, DalamudPluginInterface pluginInterface, IDataManager dataManager, IPluginLog dalamudLog)
{
using var t = timer.Measure(StartTimeType.Stains);
- StainData = new StainData(pluginInterface, dataManager, dataManager.Language);
+ StainData = new StainData(pluginInterface, dataManager, dataManager.Language, dalamudLog);
StainCombo = new FilterComboColors(140,
- StainData.Data.Prepend(new KeyValuePair(0, ("None", 0, false))));
+ StainData.Data.Prepend(new KeyValuePair(0, ("None", 0, false))), Penumbra.Log);
StmFile = new StmFile(dataManager);
TemplateCombo = new StainTemplateCombo(StmFile.Entries.Keys.Prepend((ushort)0));
Penumbra.Log.Verbose($"[{nameof(StainService)}] Created.");
diff --git a/Penumbra/Services/Wrappers.cs b/Penumbra/Services/Wrappers.cs
index 69dbbeab..b1f17d4d 100644
--- a/Penumbra/Services/Wrappers.cs
+++ b/Penumbra/Services/Wrappers.cs
@@ -11,24 +11,24 @@ namespace Penumbra.Services;
public sealed class IdentifierService : AsyncServiceWrapper
{
- public IdentifierService(StartTracker tracker, DalamudPluginInterface pi, IDataManager data, ItemService items)
+ public IdentifierService(StartTracker tracker, DalamudPluginInterface pi, IDataManager data, ItemService items, IPluginLog log)
: base(nameof(IdentifierService), tracker, StartTimeType.Identifier,
- () => GameData.GameData.GetIdentifier(pi, data, items.AwaitedService))
+ () => GameData.GameData.GetIdentifier(pi, data, items.AwaitedService, log))
{ }
}
public sealed class ItemService : AsyncServiceWrapper
{
- public ItemService(StartTracker tracker, DalamudPluginInterface pi, IDataManager gameData)
- : base(nameof(ItemService), tracker, StartTimeType.Items, () => new ItemData(pi, gameData, gameData.Language))
+ public ItemService(StartTracker tracker, DalamudPluginInterface pi, IDataManager gameData, IPluginLog log)
+ : base(nameof(ItemService), tracker, StartTimeType.Items, () => new ItemData(pi, gameData, gameData.Language, log))
{ }
}
public sealed class ActorService : AsyncServiceWrapper
{
public ActorService(StartTracker tracker, DalamudPluginInterface pi, IObjectTable objects, IClientState clientState,
- Framework framework, IDataManager gameData, IGameGui gui, CutsceneService cutscene)
+ IFramework framework, IDataManager gameData, IGameGui gui, CutsceneService cutscene, IPluginLog log, IGameInteropProvider interop)
: base(nameof(ActorService), tracker, StartTimeType.Actors,
- () => new ActorManager(pi, objects, clientState, framework, gameData, gui, idx => (short)cutscene.GetParentIndex(idx)))
+ () => new ActorManager(pi, objects, clientState, framework, interop, gameData, gui, idx => (short)cutscene.GetParentIndex(idx), log))
{ }
}
diff --git a/Penumbra/UI/AdvancedWindow/FileEditor.cs b/Penumbra/UI/AdvancedWindow/FileEditor.cs
index 2591145f..9354afaf 100644
--- a/Penumbra/UI/AdvancedWindow/FileEditor.cs
+++ b/Penumbra/UI/AdvancedWindow/FileEditor.cs
@@ -279,7 +279,7 @@ public class FileEditor : IDisposable where T : class, IWritable
private readonly Configuration _config;
public Combo(Configuration config, Func> generator)
- : base(generator)
+ : base(generator, Penumbra.Log)
=> _config = config;
protected override bool DrawSelectable(int globalIdx, bool selected)
diff --git a/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs b/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs
index 87598f5a..967e8d01 100644
--- a/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs
+++ b/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs
@@ -129,7 +129,7 @@ public class ItemSwapTab : IDisposable, ITab
private class ItemSelector : FilterComboCache
{
public ItemSelector(ItemService data, FullEquipType type)
- : base(() => data.AwaitedService[type])
+ : base(() => data.AwaitedService[type], Penumbra.Log)
{ }
protected override string ToString(EquipItem obj)
@@ -139,7 +139,7 @@ public class ItemSwapTab : IDisposable, ITab
private class WeaponSelector : FilterComboCache
{
public WeaponSelector()
- : base(FullEquipTypeExtensions.WeaponTypes.Concat(FullEquipTypeExtensions.ToolTypes))
+ : base(FullEquipTypeExtensions.WeaponTypes.Concat(FullEquipTypeExtensions.ToolTypes), Penumbra.Log)
{ }
protected override string ToString(FullEquipType type)
diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.ColorTable.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.ColorTable.cs
index cccc43ee..447382cf 100644
--- a/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.ColorTable.cs
+++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.ColorTable.cs
@@ -1,4 +1,5 @@
using Dalamud.Interface;
+using Dalamud.Interface.Utility;
using ImGuiNET;
using OtterGui;
using OtterGui.Raii;
diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.cs
index 73aad323..df20d60f 100644
--- a/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.cs
+++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.Materials.cs
@@ -1,4 +1,5 @@
using Dalamud.Interface;
+using Dalamud.Interface.Utility;
using ImGuiNET;
using OtterGui;
using OtterGui.Raii;
diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs
index c659ada0..0f171e21 100644
--- a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs
+++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs
@@ -1,6 +1,7 @@
using Dalamud.Interface;
using Dalamud.Interface.Components;
using Dalamud.Interface.DragDrop;
+using Dalamud.Interface.Utility;
using Dalamud.Interface.Windowing;
using Dalamud.Plugin.Services;
using ImGuiNET;
diff --git a/Penumbra/UI/AdvancedWindow/ModMergeTab.cs b/Penumbra/UI/AdvancedWindow/ModMergeTab.cs
index 60247d81..7d4fa96f 100644
--- a/Penumbra/UI/AdvancedWindow/ModMergeTab.cs
+++ b/Penumbra/UI/AdvancedWindow/ModMergeTab.cs
@@ -1,4 +1,4 @@
-using Dalamud.Interface;
+using Dalamud.Interface.Utility;
using ImGuiNET;
using OtterGui;
using OtterGui.Raii;
diff --git a/Penumbra/UI/AdvancedWindow/ResourceTreeViewer.cs b/Penumbra/UI/AdvancedWindow/ResourceTreeViewer.cs
index 39728cd4..ef847d8d 100644
--- a/Penumbra/UI/AdvancedWindow/ResourceTreeViewer.cs
+++ b/Penumbra/UI/AdvancedWindow/ResourceTreeViewer.cs
@@ -1,4 +1,5 @@
using Dalamud.Interface;
+using Dalamud.Interface.Utility;
using ImGuiNET;
using OtterGui.Raii;
using OtterGui;
diff --git a/Penumbra/UI/ChangedItemDrawer.cs b/Penumbra/UI/ChangedItemDrawer.cs
index 13a5787e..324c354a 100644
--- a/Penumbra/UI/ChangedItemDrawer.cs
+++ b/Penumbra/UI/ChangedItemDrawer.cs
@@ -1,9 +1,9 @@
using Dalamud.Interface;
+using Dalamud.Interface.Internal;
using Dalamud.Plugin.Services;
using Dalamud.Utility;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using ImGuiNET;
-using ImGuiScene;
using Lumina.Data.Files;
using Lumina.Excel;
using Lumina.Excel.GeneratedSheets;
@@ -46,11 +46,11 @@ public class ChangedItemDrawer : IDisposable
public const ChangedItemIcon AllFlags = (ChangedItemIcon)0x01FFFF;
public const ChangedItemIcon DefaultFlags = AllFlags & ~ChangedItemIcon.Offhand;
- private readonly Configuration _config;
- private readonly ExcelSheet- _items;
- private readonly CommunicatorService _communicator;
- private readonly Dictionary _icons = new(16);
- private float _smallestIconWidth;
+ private readonly Configuration _config;
+ private readonly ExcelSheet
- _items;
+ private readonly CommunicatorService _communicator;
+ private readonly Dictionary _icons = new(16);
+ private float _smallestIconWidth;
public ChangedItemDrawer(UiBuilder uiBuilder, IDataManager gameData, ITextureProvider textureProvider, CommunicatorService communicator,
Configuration config)
@@ -357,7 +357,7 @@ public class ChangedItemDrawer : IDisposable
if (!equipTypeIcons.Valid)
return false;
- void Add(ChangedItemIcon icon, TextureWrap? tex)
+ void Add(ChangedItemIcon icon, IDalamudTextureWrap? tex)
{
if (tex != null)
_icons.Add(icon, tex);
@@ -387,7 +387,7 @@ public class ChangedItemDrawer : IDisposable
return true;
}
- private static unsafe TextureWrap? LoadUnknownTexture(IDataManager gameData, UiBuilder uiBuilder)
+ private static unsafe IDalamudTextureWrap? LoadUnknownTexture(IDataManager gameData, UiBuilder uiBuilder)
{
var unk = gameData.GetFile("ui/uld/levelup2_hr1.tex");
if (unk == null)
@@ -402,7 +402,7 @@ public class ChangedItemDrawer : IDisposable
return uiBuilder.LoadImageRaw(bytes, unk.Header.Height, unk.Header.Height, 4);
}
- private static unsafe TextureWrap? LoadEmoteTexture(IDataManager gameData, UiBuilder uiBuilder)
+ private static unsafe IDalamudTextureWrap? LoadEmoteTexture(IDataManager gameData, UiBuilder uiBuilder)
{
var emote = gameData.GetFile("ui/icon/000000/000019_hr1.tex");
if (emote == null)
diff --git a/Penumbra/UI/CollectionTab/CollectionCombo.cs b/Penumbra/UI/CollectionTab/CollectionCombo.cs
index fc37eaf2..b2ee5c3b 100644
--- a/Penumbra/UI/CollectionTab/CollectionCombo.cs
+++ b/Penumbra/UI/CollectionTab/CollectionCombo.cs
@@ -13,7 +13,7 @@ public sealed class CollectionCombo : FilterComboCache
private readonly ImRaii.Color _color = new();
public CollectionCombo(CollectionManager manager, Func> items)
- : base(items)
+ : base(items, Penumbra.Log)
=> _collectionManager = manager;
protected override void DrawFilter(int currentSelected, float width)
diff --git a/Penumbra/UI/CollectionTab/CollectionPanel.cs b/Penumbra/UI/CollectionTab/CollectionPanel.cs
index 3ebd3252..bd37a484 100644
--- a/Penumbra/UI/CollectionTab/CollectionPanel.cs
+++ b/Penumbra/UI/CollectionTab/CollectionPanel.cs
@@ -2,6 +2,7 @@ using Dalamud.Game.ClientState.Objects;
using Dalamud.Interface;
using Dalamud.Interface.Components;
using Dalamud.Interface.GameFonts;
+using Dalamud.Interface.Utility;
using Dalamud.Plugin;
using ImGuiNET;
using OtterGui;
diff --git a/Penumbra/UI/CollectionTab/IndividualAssignmentUi.cs b/Penumbra/UI/CollectionTab/IndividualAssignmentUi.cs
index da011bde..5f463c43 100644
--- a/Penumbra/UI/CollectionTab/IndividualAssignmentUi.cs
+++ b/Penumbra/UI/CollectionTab/IndividualAssignmentUi.cs
@@ -126,12 +126,12 @@ public class IndividualAssignmentUi : IDisposable
/// Create combos when ready.
private void SetupCombos()
{
- _worldCombo = new WorldCombo(_actorService.AwaitedService.Data.Worlds);
- _mountCombo = new NpcCombo("##mountCombo", _actorService.AwaitedService.Data.Mounts);
- _companionCombo = new NpcCombo("##companionCombo", _actorService.AwaitedService.Data.Companions);
- _ornamentCombo = new NpcCombo("##ornamentCombo", _actorService.AwaitedService.Data.Ornaments);
- _bnpcCombo = new NpcCombo("##bnpcCombo", _actorService.AwaitedService.Data.BNpcs);
- _enpcCombo = new NpcCombo("##enpcCombo", _actorService.AwaitedService.Data.ENpcs);
+ _worldCombo = new WorldCombo(_actorService.AwaitedService.Data.Worlds, Penumbra.Log);
+ _mountCombo = new NpcCombo("##mountCombo", _actorService.AwaitedService.Data.Mounts, Penumbra.Log);
+ _companionCombo = new NpcCombo("##companionCombo", _actorService.AwaitedService.Data.Companions, Penumbra.Log);
+ _ornamentCombo = new NpcCombo("##ornamentCombo", _actorService.AwaitedService.Data.Ornaments, Penumbra.Log);
+ _bnpcCombo = new NpcCombo("##bnpcCombo", _actorService.AwaitedService.Data.BNpcs, Penumbra.Log);
+ _enpcCombo = new NpcCombo("##enpcCombo", _actorService.AwaitedService.Data.ENpcs, Penumbra.Log);
_ready = true;
_actorService.FinishedCreation -= SetupCombos;
}
diff --git a/Penumbra/UI/LaunchButton.cs b/Penumbra/UI/LaunchButton.cs
index 5b9bf5a4..9650ccf8 100644
--- a/Penumbra/UI/LaunchButton.cs
+++ b/Penumbra/UI/LaunchButton.cs
@@ -1,6 +1,7 @@
using Dalamud.Interface;
+using Dalamud.Interface.Internal;
using Dalamud.Plugin;
-using ImGuiScene;
+using Dalamud.Plugin.Services;
namespace Penumbra.UI;
@@ -10,18 +11,18 @@ namespace Penumbra.UI;
///
public class LaunchButton : IDisposable
{
- private readonly ConfigWindow _configWindow;
- private readonly UiBuilder _uiBuilder;
- private readonly TitleScreenMenu _title;
- private readonly string _fileName;
+ private readonly ConfigWindow _configWindow;
+ private readonly UiBuilder _uiBuilder;
+ private readonly ITitleScreenMenu _title;
+ private readonly string _fileName;
- private TextureWrap? _icon;
- private TitleScreenMenu.TitleScreenMenuEntry? _entry;
+ private IDalamudTextureWrap? _icon;
+ private TitleScreenMenuEntry? _entry;
///
/// Register the launch button to be created on the next draw event.
///
- public LaunchButton(DalamudPluginInterface pi, TitleScreenMenu title, ConfigWindow ui)
+ public LaunchButton(DalamudPluginInterface pi, ITitleScreenMenu title, ConfigWindow ui)
{
_uiBuilder = pi.UiBuilder;
_configWindow = ui;
diff --git a/Penumbra/UI/ModsTab/ModFileSystemSelector.cs b/Penumbra/UI/ModsTab/ModFileSystemSelector.cs
index 39fc7a0e..0d9b0a70 100644
--- a/Penumbra/UI/ModsTab/ModFileSystemSelector.cs
+++ b/Penumbra/UI/ModsTab/ModFileSystemSelector.cs
@@ -2,6 +2,7 @@ using Dalamud.Game.ClientState.Keys;
using Dalamud.Interface;
using Dalamud.Interface.DragDrop;
using Dalamud.Interface.Internal.Notifications;
+using Dalamud.Plugin.Services;
using ImGuiNET;
using OtterGui;
using OtterGui.Classes;
@@ -35,10 +36,10 @@ public sealed class ModFileSystemSelector : FileSystemSelector