From b9cf7eb6fa5b0f96d13a5c5466a570da2dadafda Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Wed, 17 Jul 2024 00:35:28 +0200 Subject: [PATCH] preliminary api10 update --- .../Interop/Ipc/IpcCallerCustomize.cs | 26 +++++++++---------- .../Interop/Ipc/IpcCallerGlamourer.cs | 8 +++--- MareSynchronos/Interop/Ipc/IpcCallerHeels.cs | 10 +++---- .../Interop/Ipc/IpcCallerHonorific.cs | 14 +++++----- .../Interop/Ipc/IpcCallerMoodles.cs | 8 +++--- .../Interop/Ipc/IpcCallerPenumbra.cs | 8 +++--- MareSynchronos/Interop/Ipc/IpcProvider.cs | 18 ++++++------- MareSynchronos/Interop/Ipc/RedrawManager.cs | 2 +- .../ConfigurationMigrator.cs | 2 +- .../Models/NotificationLocation.cs | 7 +++++ MareSynchronos/MareSynchronos.csproj | 18 ++++++------- .../PlayerData/Export/MareCharaFileManager.cs | 2 +- .../PlayerData/Factories/PlayerDataFactory.cs | 3 ++- .../PlayerData/Handlers/GameObjectHandler.cs | 21 ++++++++------- .../PlayerData/Handlers/PairHandler.cs | 2 +- .../PlayerData/Pairs/PairManager.cs | 15 ++++++----- MareSynchronos/Plugin.cs | 13 +++++----- .../Services/CommandManagerService.cs | 3 ++- MareSynchronos/Services/DalamudUtilService.cs | 26 +++++++++---------- MareSynchronos/Services/Mediator/Messages.cs | 4 +-- .../Services/NotificationService.cs | 23 +++++++++------- .../PluginWarningNotificationService.cs | 4 +-- MareSynchronos/Services/UiService.cs | 4 +-- MareSynchronos/Services/XivDataAnalyzer.cs | 4 ++- MareSynchronos/UI/DtrEntry.cs | 6 ++--- MareSynchronos/UI/EditProfileUi.cs | 10 +++---- MareSynchronos/UI/PopoutProfileUi.cs | 2 +- MareSynchronos/UI/StandaloneProfileUi.cs | 2 +- MareSynchronos/UI/UISharedService.cs | 13 +++++++--- MareSynchronos/Utils/VariousExtensions.cs | 2 +- .../ApiController.Functions.Callbacks.cs | 4 +-- .../WebAPI/SignalR/ApiController.cs | 7 ++--- .../WebAPI/SignalR/TokenProvider.cs | 7 ++--- .../SignalR/Utils/ForeverRetryPolicy.cs | 2 +- 34 files changed, 163 insertions(+), 137 deletions(-) diff --git a/MareSynchronos/Interop/Ipc/IpcCallerCustomize.cs b/MareSynchronos/Interop/Ipc/IpcCallerCustomize.cs index f6f92e9..cd4073c 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerCustomize.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerCustomize.cs @@ -12,25 +12,25 @@ namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerCustomize : IIpcCaller { private readonly ICallGateSubscriber<(int, int)> _customizePlusApiVersion; - private readonly ICallGateSubscriber _customizePlusGetActiveProfile; + private readonly ICallGateSubscriber _customizePlusGetActiveProfile; private readonly ICallGateSubscriber _customizePlusGetProfileById; - private readonly ICallGateSubscriber _customizePlusOnScaleUpdate; - private readonly ICallGateSubscriber _customizePlusRevertCharacter; - private readonly ICallGateSubscriber _customizePlusSetBodyScaleToCharacter; + private readonly ICallGateSubscriber _customizePlusOnScaleUpdate; + private readonly ICallGateSubscriber _customizePlusRevertCharacter; + private readonly ICallGateSubscriber _customizePlusSetBodyScaleToCharacter; private readonly ICallGateSubscriber _customizePlusDeleteByUniqueId; private readonly ILogger _logger; private readonly DalamudUtilService _dalamudUtil; private readonly MareMediator _mareMediator; - public IpcCallerCustomize(ILogger logger, DalamudPluginInterface dalamudPluginInterface, + public IpcCallerCustomize(ILogger logger, IDalamudPluginInterface dalamudPluginInterface, DalamudUtilService dalamudUtil, MareMediator mareMediator) { _customizePlusApiVersion = dalamudPluginInterface.GetIpcSubscriber<(int, int)>("CustomizePlus.General.GetApiVersion"); - _customizePlusGetActiveProfile = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.GetActiveProfileIdOnCharacter"); + _customizePlusGetActiveProfile = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.GetActiveProfileIdOnCharacter"); _customizePlusGetProfileById = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.GetByUniqueId"); - _customizePlusRevertCharacter = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.DeleteTemporaryProfileOnCharacter"); - _customizePlusSetBodyScaleToCharacter = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.SetTemporaryProfileOnCharacter"); - _customizePlusOnScaleUpdate = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.OnUpdate"); + _customizePlusRevertCharacter = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.DeleteTemporaryProfileOnCharacter"); + _customizePlusSetBodyScaleToCharacter = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.SetTemporaryProfileOnCharacter"); + _customizePlusOnScaleUpdate = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.OnUpdate"); _customizePlusDeleteByUniqueId = dalamudPluginInterface.GetIpcSubscriber("CustomizePlus.Profile.DeleteTemporaryProfileByUniqueId"); _customizePlusOnScaleUpdate.Subscribe(OnCustomizePlusScaleChange); @@ -49,7 +49,7 @@ public sealed class IpcCallerCustomize : IIpcCaller await _dalamudUtil.RunOnFrameworkThread(() => { var gameObj = _dalamudUtil.CreateGameObject(character); - if (gameObj is Character c) + if (gameObj is ICharacter c) { _logger.LogTrace("CustomizePlus reverting for {chara}", c.Address.ToString("X")); _customizePlusRevertCharacter!.InvokeFunc(c); @@ -63,7 +63,7 @@ public sealed class IpcCallerCustomize : IIpcCaller return await _dalamudUtil.RunOnFrameworkThread(() => { var gameObj = _dalamudUtil.CreateGameObject(character); - if (gameObj is Character c) + if (gameObj is ICharacter c) { string decodedScale = Encoding.UTF8.GetString(Convert.FromBase64String(scale)); _logger.LogTrace("CustomizePlus applying for {chara}", c.Address.ToString("X")); @@ -99,7 +99,7 @@ public sealed class IpcCallerCustomize : IIpcCaller var scale = await _dalamudUtil.RunOnFrameworkThread(() => { var gameObj = _dalamudUtil.CreateGameObject(character); - if (gameObj is Character c) + if (gameObj is ICharacter c) { var res = _customizePlusGetActiveProfile.InvokeFunc(c); _logger.LogTrace("CustomizePlus GetActiveProfile returned {err}", res.Item1); @@ -126,7 +126,7 @@ public sealed class IpcCallerCustomize : IIpcCaller } } - private void OnCustomizePlusScaleChange(Character c, Guid g) + private void OnCustomizePlusScaleChange(ICharacter c, Guid g) { _mareMediator.Publish(new CustomizePlusMessage(c.Name.ToString() ?? string.Empty)); } diff --git a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs index 85e6e8a..50cb8c7 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs @@ -1,8 +1,8 @@ using Dalamud.Game.ClientState.Objects.Types; -using Dalamud.Interface.Internal.Notifications; using Dalamud.Plugin; using Glamourer.Api.Helpers; using Glamourer.Api.IpcSubscribers; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.Services; using MareSynchronos.Services.Mediator; @@ -13,7 +13,7 @@ namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerGlamourer : IIpcCaller { private readonly ILogger _logger; - private readonly DalamudPluginInterface _pi; + private readonly IDalamudPluginInterface _pi; private readonly DalamudUtilService _dalamudUtil; private readonly MareMediator _mareMediator; private readonly RedrawManager _redrawManager; @@ -30,7 +30,7 @@ public sealed class IpcCallerGlamourer : IIpcCaller private bool _shownGlamourerUnavailable = false; private readonly uint LockCode = 0x6D617265; - public IpcCallerGlamourer(ILogger logger, DalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator, + public IpcCallerGlamourer(ILogger logger, IDalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator, RedrawManager redrawManager) { _glamourerApiVersions = new ApiVersion(pi); @@ -134,7 +134,7 @@ public sealed class IpcCallerGlamourer : IIpcCaller return await _dalamudUtil.RunOnFrameworkThread(() => { var gameObj = _dalamudUtil.CreateGameObject(character); - if (gameObj is Character c) + if (gameObj is ICharacter c) { return _glamourerGetAllCustomization!.Invoke(c.ObjectIndex).Item2 ?? string.Empty; } diff --git a/MareSynchronos/Interop/Ipc/IpcCallerHeels.cs b/MareSynchronos/Interop/Ipc/IpcCallerHeels.cs index 633359a..0d9380a 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerHeels.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerHeels.cs @@ -15,18 +15,18 @@ public sealed class IpcCallerHeels : IIpcCaller private readonly ICallGateSubscriber<(int, int)> _heelsGetApiVersion; private readonly ICallGateSubscriber _heelsGetOffset; private readonly ICallGateSubscriber _heelsOffsetUpdate; - private readonly ICallGateSubscriber _heelsRegisterPlayer; - private readonly ICallGateSubscriber _heelsUnregisterPlayer; + private readonly ICallGateSubscriber _heelsRegisterPlayer; + private readonly ICallGateSubscriber _heelsUnregisterPlayer; - public IpcCallerHeels(ILogger logger, DalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator) + public IpcCallerHeels(ILogger logger, IDalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator) { _logger = logger; _mareMediator = mareMediator; _dalamudUtil = dalamudUtil; _heelsGetApiVersion = pi.GetIpcSubscriber<(int, int)>("SimpleHeels.ApiVersion"); _heelsGetOffset = pi.GetIpcSubscriber("SimpleHeels.GetLocalPlayer"); - _heelsRegisterPlayer = pi.GetIpcSubscriber("SimpleHeels.RegisterPlayer"); - _heelsUnregisterPlayer = pi.GetIpcSubscriber("SimpleHeels.UnregisterPlayer"); + _heelsRegisterPlayer = pi.GetIpcSubscriber("SimpleHeels.RegisterPlayer"); + _heelsUnregisterPlayer = pi.GetIpcSubscriber("SimpleHeels.UnregisterPlayer"); _heelsOffsetUpdate = pi.GetIpcSubscriber("SimpleHeels.LocalChanged"); _heelsOffsetUpdate.Subscribe(HeelsOffsetChange); diff --git a/MareSynchronos/Interop/Ipc/IpcCallerHonorific.cs b/MareSynchronos/Interop/Ipc/IpcCallerHonorific.cs index 6dd9f35..c241c5d 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerHonorific.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerHonorific.cs @@ -12,17 +12,17 @@ namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerHonorific : IIpcCaller { private readonly ICallGateSubscriber<(uint major, uint minor)> _honorificApiVersion; - private readonly ICallGateSubscriber _honorificClearCharacterTitle; + private readonly ICallGateSubscriber _honorificClearCharacterTitle; private readonly ICallGateSubscriber _honorificDisposing; private readonly ICallGateSubscriber _honorificGetLocalCharacterTitle; private readonly ICallGateSubscriber _honorificLocalCharacterTitleChanged; private readonly ICallGateSubscriber _honorificReady; - private readonly ICallGateSubscriber _honorificSetCharacterTitle; + private readonly ICallGateSubscriber _honorificSetCharacterTitle; private readonly ILogger _logger; private readonly MareMediator _mareMediator; private readonly DalamudUtilService _dalamudUtil; - public IpcCallerHonorific(ILogger logger, DalamudPluginInterface pi, DalamudUtilService dalamudUtil, + public IpcCallerHonorific(ILogger logger, IDalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator) { _logger = logger; @@ -30,8 +30,8 @@ public sealed class IpcCallerHonorific : IIpcCaller _dalamudUtil = dalamudUtil; _honorificApiVersion = pi.GetIpcSubscriber<(uint, uint)>("Honorific.ApiVersion"); _honorificGetLocalCharacterTitle = pi.GetIpcSubscriber("Honorific.GetLocalCharacterTitle"); - _honorificClearCharacterTitle = pi.GetIpcSubscriber("Honorific.ClearCharacterTitle"); - _honorificSetCharacterTitle = pi.GetIpcSubscriber("Honorific.SetCharacterTitle"); + _honorificClearCharacterTitle = pi.GetIpcSubscriber("Honorific.ClearCharacterTitle"); + _honorificSetCharacterTitle = pi.GetIpcSubscriber("Honorific.SetCharacterTitle"); _honorificLocalCharacterTitleChanged = pi.GetIpcSubscriber("Honorific.LocalCharacterTitleChanged"); _honorificDisposing = pi.GetIpcSubscriber("Honorific.Disposing"); _honorificReady = pi.GetIpcSubscriber("Honorific.Ready"); @@ -70,7 +70,7 @@ public sealed class IpcCallerHonorific : IIpcCaller await _dalamudUtil.RunOnFrameworkThread(() => { var gameObj = _dalamudUtil.CreateGameObject(character); - if (gameObj is PlayerCharacter c) + if (gameObj is IPlayerCharacter c) { _logger.LogTrace("Honorific removing for {addr}", c.Address.ToString("X")); _honorificClearCharacterTitle!.InvokeAction(c); @@ -94,7 +94,7 @@ public sealed class IpcCallerHonorific : IIpcCaller await _dalamudUtil.RunOnFrameworkThread(() => { var gameObj = _dalamudUtil.CreateGameObject(character); - if (gameObj is PlayerCharacter pc) + if (gameObj is IPlayerCharacter pc) { string honorificData = string.IsNullOrEmpty(honorificDataB64) ? string.Empty : Encoding.UTF8.GetString(Convert.FromBase64String(honorificDataB64)); if (string.IsNullOrEmpty(honorificData)) diff --git a/MareSynchronos/Interop/Ipc/IpcCallerMoodles.cs b/MareSynchronos/Interop/Ipc/IpcCallerMoodles.cs index 32ccb70..44b6ce5 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerMoodles.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerMoodles.cs @@ -10,7 +10,7 @@ namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerMoodles : IIpcCaller { private readonly ICallGateSubscriber _moodlesApiVersion; - private readonly ICallGateSubscriber _moodlesOnChange; + private readonly ICallGateSubscriber _moodlesOnChange; private readonly ICallGateSubscriber _moodlesGetStatus; private readonly ICallGateSubscriber _moodlesSetStatus; private readonly ICallGateSubscriber _moodlesRevertStatus; @@ -18,7 +18,7 @@ public sealed class IpcCallerMoodles : IIpcCaller private readonly DalamudUtilService _dalamudUtil; private readonly MareMediator _mareMediator; - public IpcCallerMoodles(ILogger logger, DalamudPluginInterface pi, DalamudUtilService dalamudUtil, + public IpcCallerMoodles(ILogger logger, IDalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator) { _logger = logger; @@ -26,7 +26,7 @@ public sealed class IpcCallerMoodles : IIpcCaller _mareMediator = mareMediator; _moodlesApiVersion = pi.GetIpcSubscriber("Moodles.Version"); - _moodlesOnChange = pi.GetIpcSubscriber("Moodles.StatusManagerModified"); + _moodlesOnChange = pi.GetIpcSubscriber("Moodles.StatusManagerModified"); _moodlesGetStatus = pi.GetIpcSubscriber("Moodles.GetStatusManagerByPtr"); _moodlesSetStatus = pi.GetIpcSubscriber("Moodles.SetStatusManagerByPtr"); _moodlesRevertStatus = pi.GetIpcSubscriber("Moodles.ClearStatusManagerByPtr"); @@ -36,7 +36,7 @@ public sealed class IpcCallerMoodles : IIpcCaller CheckAPI(); } - private void OnMoodlesChange(PlayerCharacter character) + private void OnMoodlesChange(IPlayerCharacter character) { _mareMediator.Publish(new MoodlesMessage(character.Address)); } diff --git a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs index a47badb..1277c18 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs @@ -1,5 +1,5 @@ -using Dalamud.Interface.Internal.Notifications; -using Dalamud.Plugin; +using Dalamud.Plugin; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.Services; using MareSynchronos.Services.Mediator; @@ -13,7 +13,7 @@ namespace MareSynchronos.Interop.Ipc; public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCaller { - private readonly DalamudPluginInterface _pi; + private readonly IDalamudPluginInterface _pi; private readonly DalamudUtilService _dalamudUtil; private readonly MareMediator _mareMediator; private readonly RedrawManager _redrawManager; @@ -53,7 +53,7 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa private readonly ResolvePlayerPathsAsync _penumbraResolvePaths; private readonly GetGameObjectResourcePaths _penumbraResourcePaths; - public IpcCallerPenumbra(ILogger logger, DalamudPluginInterface pi, DalamudUtilService dalamudUtil, + public IpcCallerPenumbra(ILogger logger, IDalamudPluginInterface pi, DalamudUtilService dalamudUtil, MareMediator mareMediator, RedrawManager redrawManager) : base(logger, mareMediator) { _pi = pi; diff --git a/MareSynchronos/Interop/Ipc/IpcProvider.cs b/MareSynchronos/Interop/Ipc/IpcProvider.cs index fd0515e..369ae02 100644 --- a/MareSynchronos/Interop/Ipc/IpcProvider.cs +++ b/MareSynchronos/Interop/Ipc/IpcProvider.cs @@ -13,17 +13,17 @@ namespace MareSynchronos.Interop.Ipc; public class IpcProvider : IHostedService, IMediatorSubscriber { private readonly ILogger _logger; - private readonly DalamudPluginInterface _pi; + private readonly IDalamudPluginInterface _pi; private readonly MareCharaFileManager _mareCharaFileManager; private readonly DalamudUtilService _dalamudUtil; - private ICallGateProvider? _loadFileProvider; - private ICallGateProvider>? _loadFileAsyncProvider; + private ICallGateProvider? _loadFileProvider; + private ICallGateProvider>? _loadFileAsyncProvider; private ICallGateProvider>? _handledGameAddresses; private readonly List _activeGameObjectHandlers = []; public MareMediator Mediator { get; init; } - public IpcProvider(ILogger logger, DalamudPluginInterface pi, + public IpcProvider(ILogger logger, IDalamudPluginInterface pi, MareCharaFileManager mareCharaFileManager, DalamudUtilService dalamudUtil, MareMediator mareMediator) { @@ -48,9 +48,9 @@ public class IpcProvider : IHostedService, IMediatorSubscriber public Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("Starting IpcProviderService"); - _loadFileProvider = _pi.GetIpcProvider("MareSynchronos.LoadMcdf"); + _loadFileProvider = _pi.GetIpcProvider("MareSynchronos.LoadMcdf"); _loadFileProvider.RegisterFunc(LoadMcdf); - _loadFileAsyncProvider = _pi.GetIpcProvider>("MareSynchronos.LoadMcdfAsync"); + _loadFileAsyncProvider = _pi.GetIpcProvider>("MareSynchronos.LoadMcdfAsync"); _loadFileAsyncProvider.RegisterFunc(LoadMcdfAsync); _handledGameAddresses = _pi.GetIpcProvider>("MareSynchronos.GetHandledAddresses"); _handledGameAddresses.RegisterFunc(GetHandledAddresses); @@ -68,7 +68,7 @@ public class IpcProvider : IHostedService, IMediatorSubscriber return Task.CompletedTask; } - private async Task LoadMcdfAsync(string path, GameObject target) + private async Task LoadMcdfAsync(string path, IGameObject target) { if (_mareCharaFileManager.CurrentlyWorking || !_dalamudUtil.IsInGpose) return false; @@ -78,7 +78,7 @@ public class IpcProvider : IHostedService, IMediatorSubscriber return true; } - private bool LoadMcdf(string path, GameObject target) + private bool LoadMcdf(string path, IGameObject target) { if (_mareCharaFileManager.CurrentlyWorking || !_dalamudUtil.IsInGpose) return false; @@ -88,7 +88,7 @@ public class IpcProvider : IHostedService, IMediatorSubscriber return true; } - private async Task ApplyFileAsync(string path, GameObject target) + private async Task ApplyFileAsync(string path, IGameObject target) { try { diff --git a/MareSynchronos/Interop/Ipc/RedrawManager.cs b/MareSynchronos/Interop/Ipc/RedrawManager.cs index fd3b445..153a44a 100644 --- a/MareSynchronos/Interop/Ipc/RedrawManager.cs +++ b/MareSynchronos/Interop/Ipc/RedrawManager.cs @@ -22,7 +22,7 @@ public class RedrawManager _dalamudUtil = dalamudUtil; } - public async Task PenumbraRedrawInternalAsync(ILogger logger, GameObjectHandler handler, Guid applicationId, Action action) + public async Task PenumbraRedrawInternalAsync(ILogger logger, GameObjectHandler handler, Guid applicationId, Action action) { _mareMediator.Publish(new PenumbraStartRedrawMessage(handler.Address)); diff --git a/MareSynchronos/MareConfiguration/ConfigurationMigrator.cs b/MareSynchronos/MareConfiguration/ConfigurationMigrator.cs index 4720fa8..57e6fe7 100644 --- a/MareSynchronos/MareConfiguration/ConfigurationMigrator.cs +++ b/MareSynchronos/MareConfiguration/ConfigurationMigrator.cs @@ -6,7 +6,7 @@ using Newtonsoft.Json; namespace MareSynchronos.MareConfiguration; -public class ConfigurationMigrator(ILogger logger, DalamudPluginInterface pi) : IHostedService +public class ConfigurationMigrator(ILogger logger, IDalamudPluginInterface pi) : IHostedService { public void Migrate() { diff --git a/MareSynchronos/MareConfiguration/Models/NotificationLocation.cs b/MareSynchronos/MareConfiguration/Models/NotificationLocation.cs index 36d1d61..51cd2d1 100644 --- a/MareSynchronos/MareConfiguration/Models/NotificationLocation.cs +++ b/MareSynchronos/MareConfiguration/Models/NotificationLocation.cs @@ -6,4 +6,11 @@ public enum NotificationLocation Chat, Toast, Both +} + +public enum NotificationType +{ + Info, + Warning, + Error } \ No newline at end of file diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 9a07482..1e7cd45 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -30,25 +30,25 @@ - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/MareSynchronos/PlayerData/Export/MareCharaFileManager.cs b/MareSynchronos/PlayerData/Export/MareCharaFileManager.cs index 82c5a25..fa710ad 100644 --- a/MareSynchronos/PlayerData/Export/MareCharaFileManager.cs +++ b/MareSynchronos/PlayerData/Export/MareCharaFileManager.cs @@ -73,7 +73,7 @@ public class MareCharaFileManager : DisposableMediatorSubscriberBase public bool CurrentlyWorking { get; private set; } = false; public MareCharaFileHeader? LoadedCharaFile { get; private set; } - public async Task ApplyMareCharaFile(GameObject? charaTarget, long expectedLength) + public async Task ApplyMareCharaFile(IGameObject? charaTarget, long expectedLength) { if (charaTarget == null) return; Dictionary extractedFiles = new(StringComparer.Ordinal); diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index 9cdf19f..f347b2f 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -2,6 +2,7 @@ using MareSynchronos.API.Data.Enum; using MareSynchronos.FileCache; using MareSynchronos.Interop.Ipc; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.PlayerData.Data; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.Services; @@ -309,7 +310,7 @@ public class PlayerDataFactory _mareMediator.Publish(new NotificationMessage("Invalid Skeleton Setup", $"Your client is attempting to send {noValidationFailed} animation files with invalid bone data. Those animation files have been removed from your sent data. " + $"Verify that you are using the correct skeleton for those animation files (Check /xllog for more information).", - Dalamud.Interface.Internal.Notifications.NotificationType.Warning, TimeSpan.FromSeconds(10))); + NotificationType.Warning, TimeSpan.FromSeconds(10))); } } diff --git a/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs b/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs index 15804b1..03d29b5 100644 --- a/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/GameObjectHandler.cs @@ -5,6 +5,7 @@ using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.Utils; using Microsoft.Extensions.Logging; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using static FFXIVClientStructs.FFXIV.Client.Game.Character.DrawDataContainer; using ObjectKind = MareSynchronos.API.Data.Enum.ObjectKind; @@ -113,13 +114,13 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase private ushort[] MainHandData { get; set; } = new ushort[3]; private ushort[] OffHandData { get; set; } = new ushort[3]; - public async Task ActOnFrameworkAfterEnsureNoDrawAsync(Action act, CancellationToken token) + public async Task ActOnFrameworkAfterEnsureNoDrawAsync(Action act, CancellationToken token) { while (await _dalamudUtil.RunOnFrameworkThread(() => { if (IsBeingDrawn()) return true; var gameObj = _dalamudUtil.CreateGameObject(Address); - if (gameObj is Dalamud.Game.ClientState.Objects.Types.Character chara) + if (gameObj is Dalamud.Game.ClientState.Objects.Types.ICharacter chara) { act.Invoke(chara); } @@ -148,7 +149,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase return _getAddress.Invoke(); } - public Dalamud.Game.ClientState.Objects.Types.GameObject? GetGameObject() + public Dalamud.Game.ClientState.Objects.Types.IGameObject? GetGameObject() { return _dalamudUtil.CreateGameObject(Address); } @@ -209,7 +210,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase _clearCts = null; } var chara = (Character*)Address; - MemoryHelper.ReadStringNullTerminated((nint)chara->GameObject.Name, out var name); + var name = chara->GameObject.NameString; bool nameChange = !string.Equals(name, Name, StringComparison.Ordinal); if (nameChange) { @@ -240,7 +241,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase } else { - equipDiff = CompareAndUpdateEquipByteData((byte*)&chara->DrawData.Head); + equipDiff = CompareAndUpdateEquipByteData((byte*)Unsafe.AsPointer(ref chara->DrawData.EquipmentModelIds[0])); if (equipDiff) Logger.LogTrace("Checking [{this}] equip data from game obj, result: {diff}", this, equipDiff); } @@ -259,7 +260,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase { var gender = ((Human*)DrawObjectAddress)->Customize.Sex; var raceId = ((Human*)DrawObjectAddress)->Customize.Race; - var tribeId = ((Human*)DrawObjectAddress)->Customize.Clan; + var tribeId = ((Human*)DrawObjectAddress)->Customize.Tribe; if (_isOwnedObject && ObjectKind == ObjectKind.Player && (gender != Gender || raceId != RaceId || tribeId != TribeId)) @@ -309,13 +310,13 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase _clearCts = null; } - private unsafe bool CompareAndUpdateCustomizeData(byte* customizeData) + private unsafe bool CompareAndUpdateCustomizeData(Span customizeData) { bool hasChanges = false; - for (int i = 0; i < CustomizeData.Length; i++) + for (int i = 0; i < customizeData.Length; i++) { - var data = Marshal.ReadByte((IntPtr)customizeData, i); + var data = customizeData[i]; if (CustomizeData[i] != data) { CustomizeData[i] = data; @@ -331,7 +332,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase bool hasChanges = false; for (int i = 0; i < EquipSlotData.Length; i++) { - var data = Marshal.ReadByte((IntPtr)equipSlotData, i); + var data = equipSlotData[i]; if (EquipSlotData[i] != data) { EquipSlotData[i] = data; diff --git a/MareSynchronos/PlayerData/Handlers/PairHandler.cs b/MareSynchronos/PlayerData/Handlers/PairHandler.cs index dfee048..b817b3f 100644 --- a/MareSynchronos/PlayerData/Handlers/PairHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/PairHandler.cs @@ -127,7 +127,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase public nint PlayerCharacter => _charaHandler?.Address ?? nint.Zero; public unsafe uint PlayerCharacterId => (_charaHandler?.Address ?? nint.Zero) == nint.Zero ? uint.MaxValue - : ((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)_charaHandler!.Address)->ObjectID; + : ((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)_charaHandler!.Address)->EntityId; public string? PlayerName { get; private set; } public string PlayerNameHash => OnlineUser.Ident; diff --git a/MareSynchronos/PlayerData/Pairs/PairManager.cs b/MareSynchronos/PlayerData/Pairs/PairManager.cs index 2b99b0c..3ad1c66 100644 --- a/MareSynchronos/PlayerData/Pairs/PairManager.cs +++ b/MareSynchronos/PlayerData/Pairs/PairManager.cs @@ -1,11 +1,11 @@ using Dalamud.ContextMenu; -using Dalamud.Interface.Internal.Notifications; using MareSynchronos.API.Data; using MareSynchronos.API.Data.Comparer; using MareSynchronos.API.Data.Extensions; using MareSynchronos.API.Dto.Group; using MareSynchronos.API.Dto.User; using MareSynchronos.MareConfiguration; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.PlayerData.Factories; using MareSynchronos.Services.Events; using MareSynchronos.Services.Mediator; @@ -19,26 +19,27 @@ public sealed class PairManager : DisposableMediatorSubscriberBase private readonly ConcurrentDictionary _allClientPairs = new(UserDataComparer.Instance); private readonly ConcurrentDictionary _allGroups = new(GroupDataComparer.Instance); private readonly MareConfigService _configurationService; - private readonly DalamudContextMenu _dalamudContextMenu; + //private readonly DalamudContextMenu _dalamudContextMenu; private readonly PairFactory _pairFactory; private Lazy> _directPairsInternal; private Lazy>> _groupPairsInternal; private Lazy>> _pairsWithGroupsInternal; public PairManager(ILogger logger, PairFactory pairFactory, - MareConfigService configurationService, MareMediator mediator, - DalamudContextMenu dalamudContextMenu) : base(logger, mediator) + MareConfigService configurationService, MareMediator mediator + //DalamudContextMenu dalamudContextMenu) : base(logger, mediator) + ) : base(logger, mediator) { _pairFactory = pairFactory; _configurationService = configurationService; - _dalamudContextMenu = dalamudContextMenu; + //_dalamudContextMenu = dalamudContextMenu; Mediator.Subscribe(this, (_) => ClearPairs()); Mediator.Subscribe(this, (_) => ReapplyPairData()); _directPairsInternal = DirectPairsLazy(); _groupPairsInternal = GroupPairsLazy(); _pairsWithGroupsInternal = PairsWithGroupsLazy(); - _dalamudContextMenu.OnOpenGameObjectContextMenu += DalamudContextMenuOnOnOpenGameObjectContextMenu; + //_dalamudContextMenu.OnOpenGameObjectContextMenu += DalamudContextMenuOnOnOpenGameObjectContextMenu; } public List DirectPairs => _directPairsInternal.Value; @@ -319,7 +320,7 @@ public sealed class PairManager : DisposableMediatorSubscriberBase { base.Dispose(disposing); - _dalamudContextMenu.OnOpenGameObjectContextMenu -= DalamudContextMenuOnOnOpenGameObjectContextMenu; + //_dalamudContextMenu.OnOpenGameObjectContextMenu -= DalamudContextMenuOnOnOpenGameObjectContextMenu; DisposePairs(); } diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 5954a70..eb3702a 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -33,9 +33,10 @@ public sealed class Plugin : IDalamudPlugin { private readonly IHost _host; - public Plugin(DalamudPluginInterface pluginInterface, ICommandManager commandManager, IDataManager gameData, + public Plugin(IDalamudPluginInterface pluginInterface, ICommandManager commandManager, IDataManager gameData, IFramework framework, IObjectTable objectTable, IClientState clientState, ICondition condition, IChatGui chatGui, - IGameGui gameGui, IDtrBar dtrBar, IPluginLog pluginLog, ITargetManager targetManager, INotificationManager notificationManager) + IGameGui gameGui, IDtrBar dtrBar, IPluginLog pluginLog, ITargetManager targetManager, INotificationManager notificationManager, + ITextureProvider textureProvider) { _host = new HostBuilder() .UseContentRoot(pluginInterface.ConfigDirectory.FullName) @@ -83,7 +84,7 @@ public sealed class Plugin : IDalamudPlugin collection.AddSingleton(); collection.AddSingleton((s) => new EventAggregator(pluginInterface.ConfigDirectory.FullName, s.GetRequiredService>(), s.GetRequiredService())); - collection.AddSingleton((s) => new DalamudContextMenu(pluginInterface)); + //collection.AddSingleton((s) => new DalamudContextMenu(pluginInterface)); collection.AddSingleton((s) => new DalamudUtilService(s.GetRequiredService>(), clientState, objectTable, framework, gameGui, condition, gameData, targetManager, s.GetRequiredService(), s.GetRequiredService())); @@ -134,8 +135,8 @@ public sealed class Plugin : IDalamudPlugin collection.AddScoped(); collection.AddScoped((s) => new EditProfileUi(s.GetRequiredService>(), - s.GetRequiredService(), s.GetRequiredService(), pluginInterface.UiBuilder, s.GetRequiredService(), - s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); + s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), + s.GetRequiredService(), s.GetRequiredService())); collection.AddScoped(); collection.AddScoped(); collection.AddScoped(); @@ -155,7 +156,7 @@ public sealed class Plugin : IDalamudPlugin s.GetRequiredService(), notificationManager, chatGui, s.GetRequiredService())); collection.AddScoped((s) => new UiSharedService(s.GetRequiredService>(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService(), - pluginInterface, s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); + pluginInterface, textureProvider, s.GetRequiredService(), s.GetRequiredService(), s.GetRequiredService())); collection.AddHostedService(p => p.GetRequiredService()); collection.AddHostedService(p => p.GetRequiredService()); diff --git a/MareSynchronos/Services/CommandManagerService.cs b/MareSynchronos/Services/CommandManagerService.cs index 2095ead..eac2aa0 100644 --- a/MareSynchronos/Services/CommandManagerService.cs +++ b/MareSynchronos/Services/CommandManagerService.cs @@ -2,6 +2,7 @@ using Dalamud.Plugin.Services; using MareSynchronos.FileCache; using MareSynchronos.MareConfiguration; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Services.Mediator; using MareSynchronos.Services.ServerConfiguration; using MareSynchronos.UI; @@ -63,7 +64,7 @@ public sealed class CommandManagerService : IDisposable if (_apiController.ServerState == WebAPI.SignalR.Utils.ServerState.Disconnecting) { _mediator.Publish(new NotificationMessage("Mare disconnecting", "Cannot use /toggle while Mare Synchronos is still disconnecting", - Dalamud.Interface.Internal.Notifications.NotificationType.Error)); + NotificationType.Error)); } if (_serverConfigurationManager.CurrentServer == null) return; diff --git a/MareSynchronos/Services/DalamudUtilService.cs b/MareSynchronos/Services/DalamudUtilService.cs index 9ae003a..085011a 100644 --- a/MareSynchronos/Services/DalamudUtilService.cs +++ b/MareSynchronos/Services/DalamudUtilService.cs @@ -53,7 +53,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber _performanceCollector = performanceCollector; WorldData = new(() => { - return gameData.GetExcelSheet(Dalamud.ClientLanguage.English)! + return gameData.GetExcelSheet(Dalamud.Game.ClientLanguage.English)! .Where(w => !w.Name.RawData.IsEmpty && w.DataCenter.Row != 0 && (w.IsPublic || char.IsUpper((char)w.Name.RawData[0]))) .ToDictionary(w => (ushort)w.RowId, w => w.Name.ToString()); }); @@ -74,7 +74,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber public bool IsWine { get; init; } public unsafe GameObject* GposeTarget => TargetSystem.Instance()->GPoseTarget; - public unsafe Dalamud.Game.ClientState.Objects.Types.GameObject? GposeTargetGameObject => GposeTarget == null ? null : _objectTable[GposeTarget->ObjectIndex]; + public unsafe Dalamud.Game.ClientState.Objects.Types.IGameObject? GposeTargetGameObject => GposeTarget == null ? null : _objectTable[GposeTarget->ObjectIndex]; public bool IsAnythingDrawing { get; private set; } = false; public bool IsInCutscene { get; private set; } = false; public bool IsInGpose { get; private set; } = false; @@ -88,13 +88,13 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber public MareMediator Mediator { get; } - public Dalamud.Game.ClientState.Objects.Types.GameObject? CreateGameObject(IntPtr reference) + public Dalamud.Game.ClientState.Objects.Types.IGameObject? CreateGameObject(IntPtr reference) { EnsureIsOnFramework(); return _objectTable.CreateObjectReference(reference); } - public async Task CreateGameObjectAsync(IntPtr reference) + public async Task CreateGameObjectAsync(IntPtr reference) { return await RunOnFrameworkThread(() => _objectTable.CreateObjectReference(reference)).ConfigureAwait(false); } @@ -104,12 +104,12 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber if (!_framework.IsInFrameworkUpdateThread) throw new InvalidOperationException("Can only be run on Framework"); } - public Dalamud.Game.ClientState.Objects.Types.Character? GetCharacterFromObjectTableByIndex(int index) + public Dalamud.Game.ClientState.Objects.Types.ICharacter? GetCharacterFromObjectTableByIndex(int index) { EnsureIsOnFramework(); var objTableObj = _objectTable[index]; if (objTableObj!.ObjectKind != Dalamud.Game.ClientState.Objects.Enums.ObjectKind.Player) return null; - return (Dalamud.Game.ClientState.Objects.Types.Character)objTableObj; + return (Dalamud.Game.ClientState.Objects.Types.ICharacter)objTableObj; } public unsafe IntPtr GetCompanion(IntPtr? playerPointer = null) @@ -126,10 +126,10 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber return await RunOnFrameworkThread(() => GetCompanion(playerPointer)).ConfigureAwait(false); } - public Dalamud.Game.ClientState.Objects.Types.Character? GetGposeCharacterFromObjectTableByName(string name, bool onlyGposeCharacters = false) + public Dalamud.Game.ClientState.Objects.Types.ICharacter? GetGposeCharacterFromObjectTableByName(string name, bool onlyGposeCharacters = false) { EnsureIsOnFramework(); - return (Dalamud.Game.ClientState.Objects.Types.Character?)_objectTable + return (Dalamud.Game.ClientState.Objects.Types.ICharacter?)_objectTable .FirstOrDefault(i => (!onlyGposeCharacters || i.ObjectIndex >= 200) && string.Equals(i.Name.ToString(), name, StringComparison.Ordinal)); } @@ -172,7 +172,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber return await RunOnFrameworkThread(() => GetPet(playerPointer)).ConfigureAwait(false); } - public PlayerCharacter GetPlayerCharacter() + public IPlayerCharacter GetPlayerCharacter() { EnsureIsOnFramework(); return _clientState.LocalPlayer!; @@ -238,13 +238,13 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber return _objectTable.Any(f => f.Address == key); } - public bool IsObjectPresent(Dalamud.Game.ClientState.Objects.Types.GameObject? obj) + public bool IsObjectPresent(Dalamud.Game.ClientState.Objects.Types.IGameObject? obj) { EnsureIsOnFramework(); return obj != null && obj.IsValid(); } - public async Task IsObjectPresentAsync(Dalamud.Game.ClientState.Objects.Types.GameObject? obj) + public async Task IsObjectPresentAsync(Dalamud.Game.ClientState.Objects.Types.IGameObject? obj) { return await RunOnFrameworkThread(() => IsObjectPresent(obj)).ConfigureAwait(false); } @@ -358,7 +358,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber Thread.Sleep(tick * 2); } - public Vector2 WorldToScreen(Dalamud.Game.ClientState.Objects.Types.GameObject? obj) + public Vector2 WorldToScreen(Dalamud.Game.ClientState.Objects.Types.IGameObject? obj) { if (obj == null) return Vector2.Zero; return _gameGui.WorldToScreen(obj.Position, out var screenPos) ? screenPos : Vector2.Zero; @@ -452,7 +452,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber if (chara == null || chara.ObjectKind != Dalamud.Game.ClientState.Objects.Enums.ObjectKind.Player) continue; - MemoryHelper.ReadStringNullTerminated((nint)((GameObject*)chara.Address)->Name, out string charaName); + var charaName = ((GameObject*)chara.Address)->NameString; var hash = (charaName, ((BattleChara*)chara.Address)->Character.HomeWorld).GetHash256(); if (!IsAnythingDrawing) CheckCharacterForDrawing(chara.Address, charaName); diff --git a/MareSynchronos/Services/Mediator/Messages.cs b/MareSynchronos/Services/Mediator/Messages.cs index 6bd9633..202db1c 100644 --- a/MareSynchronos/Services/Mediator/Messages.cs +++ b/MareSynchronos/Services/Mediator/Messages.cs @@ -1,8 +1,8 @@ using Dalamud.Game.ClientState.Objects.Types; -using Dalamud.Interface.Internal.Notifications; using MareSynchronos.API.Data; using MareSynchronos.API.Dto; using MareSynchronos.API.Dto.Group; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.PlayerData.Pairs; using MareSynchronos.Services.Events; @@ -83,7 +83,7 @@ public record CombatOrPerformanceStartMessage : MessageBase; public record CombatOrPerformanceEndMessage : MessageBase; public record EventMessage(Event Event) : MessageBase; public record PenumbraDirectoryChangedMessage(string? ModDirectory) : MessageBase; -public record PenumbraRedrawCharacterMessage(Character Character) : SameThreadMessage; +public record PenumbraRedrawCharacterMessage(ICharacter Character) : SameThreadMessage; public record GameObjectHandlerCreatedMessage(GameObjectHandler GameObjectHandler, bool OwnedObject) : MessageBase; public record GameObjectHandlerDestroyedMessage(GameObjectHandler GameObjectHandler, bool OwnedObject) : MessageBase; #pragma warning restore S2094 diff --git a/MareSynchronos/Services/NotificationService.cs b/MareSynchronos/Services/NotificationService.cs index c8f58e0..0e16930 100644 --- a/MareSynchronos/Services/NotificationService.cs +++ b/MareSynchronos/Services/NotificationService.cs @@ -1,11 +1,11 @@ using Dalamud.Game.Text.SeStringHandling; -using Dalamud.Interface; -using Dalamud.Interface.Internal.Notifications; +using Dalamud.Interface.ImGuiNotification; using Dalamud.Plugin.Services; using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Services.Mediator; using Microsoft.Extensions.Logging; +using NotificationType = MareSynchronos.MareConfiguration.Models.NotificationType; namespace MareSynchronos.Services; @@ -15,7 +15,8 @@ public class NotificationService : DisposableMediatorSubscriberBase private readonly IChatGui _chatGui; private readonly MareConfigService _configurationService; - public NotificationService(ILogger logger, MareMediator mediator, INotificationManager notificationManager, IChatGui chatGui, MareConfigService configurationService) : base(logger, mediator) + public NotificationService(ILogger logger, MareMediator mediator, INotificationManager notificationManager, + IChatGui chatGui, MareConfigService configurationService) : base(logger, mediator) { _notificationManager = notificationManager; _chatGui = chatGui; @@ -47,8 +48,6 @@ public class NotificationService : DisposableMediatorSubscriberBase switch (msg.Type) { case NotificationType.Info: - case NotificationType.Success: - case NotificationType.None: PrintInfoChat(msg.Message); break; @@ -69,8 +68,6 @@ public class NotificationService : DisposableMediatorSubscriberBase switch (msg.Type) { case NotificationType.Info: - case NotificationType.Success: - case NotificationType.None: ShowNotificationLocationBased(msg, _configurationService.Current.InfoNotification); break; @@ -108,11 +105,19 @@ public class NotificationService : DisposableMediatorSubscriberBase private void ShowToast(NotificationMessage msg) { - _notificationManager.AddNotification(new Dalamud.Interface.ImGuiNotification.Notification() + Dalamud.Interface.ImGuiNotification.NotificationType dalamudType = msg.Type switch + { + MareConfiguration.Models.NotificationType.Error => Dalamud.Interface.ImGuiNotification.NotificationType.Error, + MareConfiguration.Models.NotificationType.Warning => Dalamud.Interface.ImGuiNotification.NotificationType.Warning, + MareConfiguration.Models.NotificationType.Info => Dalamud.Interface.ImGuiNotification.NotificationType.Info, + _ => Dalamud.Interface.ImGuiNotification.NotificationType.Info + }; + + _notificationManager.AddNotification(new Notification() { Content = msg.Message ?? string.Empty, Title = msg.Title, - Type = msg.Type, + Type = dalamudType, Minimized = false, InitialDuration = msg.TimeShownOnScreen ?? TimeSpan.FromSeconds(3) }); diff --git a/MareSynchronos/Services/PluginWarningNotificationService.cs b/MareSynchronos/Services/PluginWarningNotificationService.cs index 3b341cd..4885832 100644 --- a/MareSynchronos/Services/PluginWarningNotificationService.cs +++ b/MareSynchronos/Services/PluginWarningNotificationService.cs @@ -1,8 +1,8 @@ -using Dalamud.Interface.Internal.Notifications; -using MareSynchronos.API.Data; +using MareSynchronos.API.Data; using MareSynchronos.API.Data.Comparer; using MareSynchronos.Interop.Ipc; using MareSynchronos.MareConfiguration; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Services.Mediator; using System.Collections.Concurrent; diff --git a/MareSynchronos/Services/UiService.cs b/MareSynchronos/Services/UiService.cs index 54a8053..6bf08ac 100644 --- a/MareSynchronos/Services/UiService.cs +++ b/MareSynchronos/Services/UiService.cs @@ -12,14 +12,14 @@ namespace MareSynchronos.Services; public sealed class UiService : DisposableMediatorSubscriberBase { private readonly List _createdWindows = []; - private readonly UiBuilder _uiBuilder; + private readonly IUiBuilder _uiBuilder; private readonly FileDialogManager _fileDialogManager; private readonly ILogger _logger; private readonly MareConfigService _mareConfigService; private readonly WindowSystem _windowSystem; private readonly UiFactory _uiFactory; - public UiService(ILogger logger, UiBuilder uiBuilder, + public UiService(ILogger logger, IUiBuilder uiBuilder, MareConfigService mareConfigService, WindowSystem windowSystem, IEnumerable windows, UiFactory uiFactory, FileDialogManager fileDialogManager, diff --git a/MareSynchronos/Services/XivDataAnalyzer.cs b/MareSynchronos/Services/XivDataAnalyzer.cs index 056c32b..14ff8ae 100644 --- a/MareSynchronos/Services/XivDataAnalyzer.cs +++ b/MareSynchronos/Services/XivDataAnalyzer.cs @@ -1,7 +1,9 @@ using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; -using FFXIVClientStructs.Havok; +using FFXIVClientStructs.Havok.Animation; +using FFXIVClientStructs.Havok.Common.Base.Types; +using FFXIVClientStructs.Havok.Common.Serialize.Util; using Lumina; using Lumina.Data.Files; using MareSynchronos.FileCache; diff --git a/MareSynchronos/UI/DtrEntry.cs b/MareSynchronos/UI/DtrEntry.cs index a3c9def..a53c398 100644 --- a/MareSynchronos/UI/DtrEntry.cs +++ b/MareSynchronos/UI/DtrEntry.cs @@ -16,7 +16,7 @@ public sealed class DtrEntry : IDisposable, IHostedService private readonly CancellationTokenSource _cancellationTokenSource = new(); private readonly ConfigurationServiceBase _configService; private readonly IDtrBar _dtrBar; - private readonly Lazy _entry; + private readonly Lazy _entry; private readonly ILogger _logger; private readonly MareMediator _mareMediator; private readonly PairManager _pairManager; @@ -40,7 +40,7 @@ public sealed class DtrEntry : IDisposable, IHostedService { _logger.LogDebug("Disposing DtrEntry"); Clear(); - _entry.Value.Dispose(); + _entry.Value.Remove(); } } @@ -78,7 +78,7 @@ public sealed class DtrEntry : IDisposable, IHostedService _entry.Value.Shown = false; } - private DtrBarEntry CreateEntry() + private IDtrBarEntry CreateEntry() { _logger.LogTrace("Creating new DtrBar entry"); var entry = _dtrBar.Get("Mare Synchronos"); diff --git a/MareSynchronos/UI/EditProfileUi.cs b/MareSynchronos/UI/EditProfileUi.cs index 70d4507..d6f845e 100644 --- a/MareSynchronos/UI/EditProfileUi.cs +++ b/MareSynchronos/UI/EditProfileUi.cs @@ -2,6 +2,7 @@ using Dalamud.Interface.Colors; using Dalamud.Interface.ImGuiFileDialog; using Dalamud.Interface.Internal; +using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Utility; using ImGuiNET; using MareSynchronos.API.Data; @@ -20,7 +21,6 @@ public class EditProfileUi : WindowMediatorSubscriberBase private readonly ApiController _apiController; private readonly FileDialogManager _fileDialogManager; private readonly MareProfileManager _mareProfileManager; - private readonly UiBuilder _uiBuilder; private readonly UiSharedService _uiSharedService; private bool _adjustedForScollBarsLocalProfile = false; private bool _adjustedForScollBarsOnlineProfile = false; @@ -32,9 +32,8 @@ public class EditProfileUi : WindowMediatorSubscriberBase private bool _wasOpen; public EditProfileUi(ILogger logger, MareMediator mediator, - ApiController apiController, UiBuilder uiBuilder, UiSharedService uiSharedService, - FileDialogManager fileDialogManager, MareProfileManager mareProfileManager, - PerformanceCollectorService performanceCollectorService) + ApiController apiController, UiSharedService uiSharedService, FileDialogManager fileDialogManager, + MareProfileManager mareProfileManager, PerformanceCollectorService performanceCollectorService) : base(logger, mediator, "Mare Synchronos Edit Profile###MareSynchronosEditProfileUI", performanceCollectorService) { IsOpen = false; @@ -44,7 +43,6 @@ public class EditProfileUi : WindowMediatorSubscriberBase MaximumSize = new(768, 2000) }; _apiController = apiController; - _uiBuilder = uiBuilder; _uiSharedService = uiSharedService; _fileDialogManager = fileDialogManager; _mareProfileManager = mareProfileManager; @@ -78,7 +76,7 @@ public class EditProfileUi : WindowMediatorSubscriberBase { _profileImage = profile.ImageData.Value; _pfpTextureWrap?.Dispose(); - _pfpTextureWrap = _uiBuilder.LoadImage(_profileImage); + _pfpTextureWrap = _uiSharedService.LoadImage(_profileImage); } if (!string.Equals(_profileDescription, profile.Description, StringComparison.OrdinalIgnoreCase)) diff --git a/MareSynchronos/UI/PopoutProfileUi.cs b/MareSynchronos/UI/PopoutProfileUi.cs index b856831..fd7889a 100644 --- a/MareSynchronos/UI/PopoutProfileUi.cs +++ b/MareSynchronos/UI/PopoutProfileUi.cs @@ -1,6 +1,6 @@ using Dalamud.Interface.Colors; using Dalamud.Interface.Internal; - +using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Utility; using ImGuiNET; using MareSynchronos.API.Data.Extensions; diff --git a/MareSynchronos/UI/StandaloneProfileUi.cs b/MareSynchronos/UI/StandaloneProfileUi.cs index 429d0b8..df31228 100644 --- a/MareSynchronos/UI/StandaloneProfileUi.cs +++ b/MareSynchronos/UI/StandaloneProfileUi.cs @@ -1,6 +1,6 @@ using Dalamud.Interface.Colors; using Dalamud.Interface.Internal; - +using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Utility; using ImGuiNET; using MareSynchronos.API.Data.Extensions; diff --git a/MareSynchronos/UI/UISharedService.cs b/MareSynchronos/UI/UISharedService.cs index a7bc5c3..7006c5c 100644 --- a/MareSynchronos/UI/UISharedService.cs +++ b/MareSynchronos/UI/UISharedService.cs @@ -5,9 +5,12 @@ using Dalamud.Interface.GameFonts; using Dalamud.Interface.ImGuiFileDialog; using Dalamud.Interface.Internal; using Dalamud.Interface.ManagedFontAtlas; +using Dalamud.Interface.Textures; +using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; using Dalamud.Plugin; +using Dalamud.Plugin.Services; using Dalamud.Utility; using ImGuiNET; using MareSynchronos.FileCache; @@ -51,7 +54,8 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase private readonly DalamudUtilService _dalamudUtil; private readonly IpcManager _ipcManager; private readonly Dalamud.Localization _localization; - private readonly DalamudPluginInterface _pluginInterface; + private readonly IDalamudPluginInterface _pluginInterface; + private readonly ITextureProvider _textureProvider; private readonly Dictionary _selectedComboItems = new(StringComparer.Ordinal); private readonly ServerConfigurationManager _serverConfigurationManager; private bool _cacheDirectoryHasOtherFilesThanCache = false; @@ -79,7 +83,9 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase public UiSharedService(ILogger logger, IpcManager ipcManager, ApiController apiController, CacheMonitor cacheMonitor, FileDialogManager fileDialogManager, - MareConfigService configService, DalamudUtilService dalamudUtil, DalamudPluginInterface pluginInterface, Dalamud.Localization localization, + MareConfigService configService, DalamudUtilService dalamudUtil, IDalamudPluginInterface pluginInterface, + ITextureProvider textureProvider, + Dalamud.Localization localization, ServerConfigurationManager serverManager, MareMediator mediator) : base(logger, mediator) { _ipcManager = ipcManager; @@ -89,6 +95,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase _configService = configService; _dalamudUtil = dalamudUtil; _pluginInterface = pluginInterface; + _textureProvider = textureProvider; _localization = localization; _serverConfigurationManager = serverManager; _localization.SetupWithLangCode("en"); @@ -800,7 +807,7 @@ public partial class UiSharedService : DisposableMediatorSubscriberBase public IDalamudTextureWrap LoadImage(byte[] imageData) { - return _pluginInterface.UiBuilder.LoadImage(imageData); + return _textureProvider.CreateFromImageAsync(imageData).Result; } public void LoadLocalization(string languageCode) diff --git a/MareSynchronos/Utils/VariousExtensions.cs b/MareSynchronos/Utils/VariousExtensions.cs index eafc4d3..766acf3 100644 --- a/MareSynchronos/Utils/VariousExtensions.cs +++ b/MareSynchronos/Utils/VariousExtensions.cs @@ -206,7 +206,7 @@ public static class VariousExtensions return JsonSerializer.Deserialize(JsonSerializer.Serialize(obj))!; } - public static unsafe int? ObjectTableIndex(this GameObject? gameObject) + public static unsafe int? ObjectTableIndex(this IGameObject? gameObject) { if (gameObject == null || gameObject.Address == IntPtr.Zero) { diff --git a/MareSynchronos/WebAPI/SignalR/ApiController.Functions.Callbacks.cs b/MareSynchronos/WebAPI/SignalR/ApiController.Functions.Callbacks.cs index 0252521..960d3ae 100644 --- a/MareSynchronos/WebAPI/SignalR/ApiController.Functions.Callbacks.cs +++ b/MareSynchronos/WebAPI/SignalR/ApiController.Functions.Callbacks.cs @@ -1,8 +1,8 @@ -using Dalamud.Interface.Internal.Notifications; -using MareSynchronos.API.Data.Enum; +using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Dto; using MareSynchronos.API.Dto.Group; using MareSynchronos.API.Dto.User; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Services.Mediator; using Microsoft.AspNetCore.SignalR.Client; using Microsoft.Extensions.Logging; diff --git a/MareSynchronos/WebAPI/SignalR/ApiController.cs b/MareSynchronos/WebAPI/SignalR/ApiController.cs index 66fd4c1..da7a55d 100644 --- a/MareSynchronos/WebAPI/SignalR/ApiController.cs +++ b/MareSynchronos/WebAPI/SignalR/ApiController.cs @@ -5,6 +5,7 @@ using MareSynchronos.API.Dto; using MareSynchronos.API.Dto.User; using MareSynchronos.API.SignalR; using MareSynchronos.MareConfiguration; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.PlayerData.Pairs; using MareSynchronos.Services; using MareSynchronos.Services.Mediator; @@ -193,7 +194,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM $"Your client is outdated ({currentClientVer.Major}.{currentClientVer.Minor}.{currentClientVer.Build}), current is: " + $"{_connectionDto.CurrentClientVersion.Major}.{_connectionDto.CurrentClientVersion.Minor}.{_connectionDto.CurrentClientVersion.Build}. " + $"This client version is incompatible and will not be able to connect. Please update your Mare Synchronos client.", - Dalamud.Interface.Internal.Notifications.NotificationType.Error)); + NotificationType.Error)); } await StopConnection(ServerState.VersionMisMatch).ConfigureAwait(false); return; @@ -205,7 +206,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM $"Your client is outdated ({currentClientVer.Major}.{currentClientVer.Minor}.{currentClientVer.Build}), current is: " + $"{_connectionDto.CurrentClientVersion.Major}.{_connectionDto.CurrentClientVersion.Minor}.{_connectionDto.CurrentClientVersion.Build}. " + $"Please keep your Mare Synchronos client up-to-date.", - Dalamud.Interface.Internal.Notifications.NotificationType.Warning)); + NotificationType.Warning)); } if (_dalamudUtil.HasModifiedGameFiles) @@ -215,7 +216,7 @@ public sealed partial class ApiController : DisposableMediatorSubscriberBase, IM Mediator.Publish(new NotificationMessage("Modified Game Files detected", "Mare has detected modified game files in your FFXIV installation. You will be able to connect, but the synchronization functionality might be (partially) broken. " + "Exit the game and repair it through XIVLauncher to get rid of this message.", - Dalamud.Interface.Internal.Notifications.NotificationType.Error, TimeSpan.FromSeconds(15))); + NotificationType.Error, TimeSpan.FromSeconds(15))); } await LoadIninitialPairs().ConfigureAwait(false); diff --git a/MareSynchronos/WebAPI/SignalR/TokenProvider.cs b/MareSynchronos/WebAPI/SignalR/TokenProvider.cs index 7b0cc60..4eaa178 100644 --- a/MareSynchronos/WebAPI/SignalR/TokenProvider.cs +++ b/MareSynchronos/WebAPI/SignalR/TokenProvider.cs @@ -1,4 +1,5 @@ using MareSynchronos.API.Routes; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.Services.ServerConfiguration; @@ -99,10 +100,10 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber { if (isRenewal) Mediator.Publish(new NotificationMessage("Error refreshing token", "Your authentication token could not be renewed. Try reconnecting to Mare manually.", - Dalamud.Interface.Internal.Notifications.NotificationType.Error)); + NotificationType.Error)); else Mediator.Publish(new NotificationMessage("Error generating token", "Your authentication token could not be generated. Check Mares main UI to see the error message.", - Dalamud.Interface.Internal.Notifications.NotificationType.Error)); + NotificationType.Error)); Mediator.Publish(new DisconnectedMessage()); throw new MareAuthFailureException(response); } @@ -124,7 +125,7 @@ public sealed class TokenProvider : IDisposable, IMediatorSubscriber Mediator.Publish(new NotificationMessage("Invalid system clock", "The clock of your computer is invalid. " + "Mare will not function properly if the time zone is not set correctly. " + "Please set your computers time zone correctly and keep your clock synchronized with the internet.", - Dalamud.Interface.Internal.Notifications.NotificationType.Error)); + NotificationType.Error)); throw new InvalidOperationException($"JwtToken is behind DateTime.UtcNow, DateTime.UtcNow is possibly wrong. DateTime.UtcNow is {DateTime.UtcNow}, JwtToken.ValidTo is {jwtToken.ValidTo}"); } return response; diff --git a/MareSynchronos/WebAPI/SignalR/Utils/ForeverRetryPolicy.cs b/MareSynchronos/WebAPI/SignalR/Utils/ForeverRetryPolicy.cs index 80b2343..835b048 100644 --- a/MareSynchronos/WebAPI/SignalR/Utils/ForeverRetryPolicy.cs +++ b/MareSynchronos/WebAPI/SignalR/Utils/ForeverRetryPolicy.cs @@ -1,4 +1,4 @@ -using Dalamud.Interface.Internal.Notifications; +using MareSynchronos.MareConfiguration.Models; using MareSynchronos.Services.Mediator; using Microsoft.AspNetCore.SignalR.Client;