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