fully switch to mediator from events

This commit is contained in:
rootdarkarchon
2023-01-31 01:35:11 +01:00
parent 5e7beb8518
commit 41465c2d49
24 changed files with 166 additions and 239 deletions

View File

@@ -4,6 +4,7 @@ using MareSynchronos.API.Data;
using MareSynchronos.API.Data.Enum;
using MareSynchronos.API.Dto.User;
using MareSynchronos.FileCache;
using MareSynchronos.Mediator;
using MareSynchronos.Models;
using MareSynchronos.Utils;
using MareSynchronos.WebAPI;
@@ -16,6 +17,7 @@ public class CachedPlayer : IDisposable
private readonly DalamudUtil _dalamudUtil;
private readonly IpcManager _ipcManager;
private readonly FileCacheManager _fileDbManager;
private readonly MareMediator _mediator;
private API.Data.CharacterData _cachedData = new();
private PlayerRelatedObject? _currentCharacterEquipment;
private CancellationTokenSource? _downloadCancellationTokenSource = new();
@@ -27,13 +29,14 @@ public class CachedPlayer : IDisposable
private Task? _penumbraRedrawEventTask;
public CachedPlayer(OnlineUserIdentDto onlineUser, IpcManager ipcManager, ApiController apiController, DalamudUtil dalamudUtil, FileCacheManager fileDbManager)
public CachedPlayer(OnlineUserIdentDto onlineUser, IpcManager ipcManager, ApiController apiController, DalamudUtil dalamudUtil, FileCacheManager fileDbManager, MareMediator mediator)
{
OnlineUser = onlineUser;
_ipcManager = ipcManager;
_apiController = apiController;
_dalamudUtil = dalamudUtil;
_fileDbManager = fileDbManager;
_mediator = mediator;
}
public bool IsVisible
@@ -197,7 +200,6 @@ public class CachedPlayer : IDisposable
try
{
Logger.Verbose("Restoring state for " + PlayerName);
_ipcManager.PenumbraRedrawEvent -= IpcManagerOnPenumbraRedrawEvent;
_ipcManager.PenumbraRemoveTemporaryCollection(PlayerName);
_downloadCancellationTokenSource?.Cancel();
_downloadCancellationTokenSource?.Dispose();
@@ -216,6 +218,7 @@ public class CachedPlayer : IDisposable
}
finally
{
_mediator.UnsubscribeAll(this);
_cachedData = new();
var tempPlayerName = PlayerName;
PlayerName = string.Empty;
@@ -232,7 +235,7 @@ public class CachedPlayer : IDisposable
PlayerCharacter = character;
Logger.Debug("Initializing Player " + this);
_ipcManager.PenumbraRedrawEvent += IpcManagerOnPenumbraRedrawEvent;
_mediator.Subscribe<PenumbraRedrawMessage>(this, (msg) => IpcManagerOnPenumbraRedrawEvent(((PenumbraRedrawMessage)msg)));
_originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter);
_currentCharacterEquipment = new PlayerRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero,
() => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero);
@@ -414,15 +417,15 @@ public class CachedPlayer : IDisposable
});
}
private void IpcManagerOnPenumbraRedrawEvent(IntPtr address, int idx)
private void IpcManagerOnPenumbraRedrawEvent(PenumbraRedrawMessage msg)
{
var player = _dalamudUtil.GetCharacterFromObjectTableByIndex(idx);
var player = _dalamudUtil.GetCharacterFromObjectTableByIndex(msg.ObjTblIdx);
if (player == null || !string.Equals(player.Name.ToString(), PlayerName, StringComparison.OrdinalIgnoreCase)) return;
if (!_penumbraRedrawEventTask?.IsCompleted ?? false) return;
_penumbraRedrawEventTask = Task.Run(() =>
{
PlayerCharacter = address;
PlayerCharacter = msg.Address;
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5));
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, 10000, cts.Token);

View File

@@ -7,7 +7,6 @@ using System.Collections.Concurrent;
using System.Text;
using Penumbra.Api.Enums;
using Penumbra.Api.Helpers;
using MareSynchronos.Delegates;
using MareSynchronos.Mediator;
namespace MareSynchronos.Managers;
@@ -68,6 +67,8 @@ public class IpcManager : IDisposable
{
Logger.Verbose("Creating " + nameof(IpcManager));
_mediator = mediator;
_penumbraInit = Penumbra.Api.Ipc.Initialized.Subscriber(pi, () => PenumbraInit());
_penumbraDispose = Penumbra.Api.Ipc.Disposed.Subscriber(pi, () => PenumbraDispose());
_penumbraResolvePlayer = Penumbra.Api.Ipc.ResolvePlayerPath.Subscriber(pi);
@@ -120,11 +121,10 @@ public class IpcManager : IDisposable
if (Initialized)
{
PenumbraInitialized?.Invoke();
_mediator.Publish(new PenumbraInitializedMessage());
}
_dalamudUtil = dalamudUtil;
_mediator = mediator;
_mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => HandleActionQueue());
_mediator.Subscribe<GposeFrameworkUpdateMessage>(this, (_) => HandleGposeActionQueue());
_mediator.Subscribe<ZoneSwitchEndMessage>(this, (_) => ClearActionQueue());
@@ -147,7 +147,7 @@ public class IpcManager : IDisposable
private void PenumbraModSettingChangedHandler()
{
PenumbraModSettingChanged?.Invoke();
_mediator.Publish(new PenumbraModSettingChangedMessage());
}
private void ClearActionQueue()
@@ -162,7 +162,7 @@ public class IpcManager : IDisposable
{
if (ptr != IntPtr.Zero && string.Compare(arg1, arg2, ignoreCase: true, System.Globalization.CultureInfo.InvariantCulture) != 0)
{
PenumbraResourceLoadEvent?.Invoke(ptr, arg1, arg2);
_mediator.Publish(new PenumbraResourceLoadMessage(ptr, arg1, arg2));
}
});
}
@@ -177,15 +177,6 @@ public class IpcManager : IDisposable
}
}
public event VoidDelegate? PenumbraModSettingChanged;
public event VoidDelegate? PenumbraInitialized;
public event VoidDelegate? PenumbraDisposed;
public event DrawObjectDelegate? PenumbraRedrawEvent;
public event FloatDelegate? HeelsOffsetChangeEvent;
public event PenumbraFileResourceDelegate? PenumbraResourceLoadEvent;
public event StringDelegate? CustomizePlusScaleChange;
public event StringDelegate? PalettePlusPaletteChange;
public bool Initialized => CheckPenumbraApi();
public bool CheckGlamourerApi()
{
@@ -509,31 +500,31 @@ public class IpcManager : IDisposable
private void RedrawEvent(IntPtr objectAddress, int objectTableIndex)
{
PenumbraRedrawEvent?.Invoke(objectAddress, objectTableIndex);
_mediator.Publish(new PenumbraRedrawMessage(objectAddress, objectTableIndex));
}
private void PenumbraInit()
{
PenumbraInitialized?.Invoke();
_mediator.Publish(new PenumbraInitializedMessage());
_penumbraRedraw!.Invoke("self", RedrawType.Redraw);
}
private void HeelsOffsetChange(float offset)
{
HeelsOffsetChangeEvent?.Invoke(offset);
_mediator.Publish(new HeelsOffsetMessage(offset));
}
private void OnCustomizePlusScaleChange(string? scale)
{
if (scale != null) scale = Convert.ToBase64String(Encoding.UTF8.GetBytes(scale));
CustomizePlusScaleChange?.Invoke(scale);
_mediator.Publish(new CustomizePlusMessage(scale));
}
private void OnPalettePlusPaletteChange(Character character, string palette)
{
if (character.Address == 0 || character.Address != _dalamudUtil.PlayerPointer) return;
if (palette != null) palette = Convert.ToBase64String(Encoding.UTF8.GetBytes(palette));
PalettePlusPaletteChange?.Invoke(palette);
_mediator.Publish(new PalettePlusMessage(palette));
}
public void PalettePlusSetPalette(IntPtr character, string palette)
@@ -584,7 +575,7 @@ public class IpcManager : IDisposable
private void PenumbraDispose()
{
PenumbraDisposed?.Invoke();
_mediator.Publish(new PenumbraDisposedMessage());
ActionQueue.Clear();
}
}

View File

@@ -7,16 +7,15 @@ using MareSynchronos.WebAPI;
namespace MareSynchronos.Managers;
public class OnlinePlayerManager : IDisposable
public class OnlinePlayerManager : MediatorSubscriberBase, IDisposable
{
private readonly ApiController _apiController;
private readonly DalamudUtil _dalamudUtil;
private readonly PlayerManager _playerManager;
private readonly FileCacheManager _fileDbManager;
private readonly PairManager _pairManager;
private readonly MareMediator _mediator;
public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, PlayerManager playerManager, FileCacheManager fileDbManager, PairManager pairManager, MareMediator mediator)
public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, PlayerManager playerManager, FileCacheManager fileDbManager, PairManager pairManager, MareMediator mediator) : base(mediator)
{
Logger.Verbose("Creating " + nameof(OnlinePlayerManager));
@@ -25,41 +24,32 @@ public class OnlinePlayerManager : IDisposable
_playerManager = playerManager;
_fileDbManager = fileDbManager;
_pairManager = pairManager;
_mediator = mediator;
_playerManager.PlayerHasChanged += PlayerManagerOnPlayerHasChanged;
_mediator.Subscribe<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
_mediator.Subscribe<DalamudLogoutMessage>(this, (_) => DalamudUtilOnLogOut());
if (_dalamudUtil.IsLoggedIn)
{
DalamudUtilOnLogIn();
}
Mediator.Subscribe<PlayerChangedMessage>(this, (msg) => PlayerManagerOnPlayerHasChanged((PlayerChangedMessage)msg));
Mediator.Subscribe<DalamudLoginMessage>(this, (_) => DalamudUtilOnLogIn());
Mediator.Subscribe<DalamudLogoutMessage>(this, (_) => DalamudUtilOnLogOut());
Mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => FrameworkOnUpdate());
}
private void PlayerManagerOnPlayerHasChanged(CharacterData characterCache)
private void PlayerManagerOnPlayerHasChanged(PlayerChangedMessage msg)
{
PushCharacterData(_pairManager.VisibleUsers);
}
private void DalamudUtilOnLogIn()
{
_mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => FrameworkOnUpdate());
Mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => FrameworkOnUpdate());
}
private void DalamudUtilOnLogOut()
{
_mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
Mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
}
public void Dispose()
public override void Dispose()
{
Logger.Verbose("Disposing " + nameof(OnlinePlayerManager));
_playerManager.PlayerHasChanged -= PlayerManagerOnPlayerHasChanged;
_mediator.Unsubscribe<DalamudLoginMessage>(this);
_mediator.Unsubscribe<DalamudLogoutMessage>(this);
_mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
base.Dispose();
}
private void FrameworkOnUpdate()

View File

@@ -3,10 +3,8 @@ using MareSynchronos.Utils;
using MareSynchronos.WebAPI;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using MareSynchronos.Models;
using MareSynchronos.FileCache;
using MareSynchronos.UI;
using MareSynchronos.API.Data.Enum;
using MareSynchronos.Delegates;
using MareSynchronos.Mediator;
#if DEBUG
#endif
@@ -14,17 +12,12 @@ using MareSynchronos.Mediator;
namespace MareSynchronos.Managers;
public class PlayerManager : IDisposable
public class PlayerManager : MediatorSubscriberBase, IDisposable
{
private readonly ApiController _apiController;
private readonly CharacterDataFactory _characterDataFactory;
private readonly DalamudUtil _dalamudUtil;
private readonly TransientResourceManager _transientResourceManager;
private readonly PeriodicFileScanner _periodicFileScanner;
private readonly SettingsUi _settingsUi;
private readonly MareMediator _mediator;
private readonly IpcManager _ipcManager;
public event CharacterDataDelegate? PlayerHasChanged;
public API.Data.CharacterData? LastCreatedCharacterData { get; private set; }
public Models.CharacterData PermanentDataCache { get; private set; } = new();
private readonly Dictionary<ObjectKind, Func<bool>> _objectKindsToUpdate = new();
@@ -35,8 +28,8 @@ public class PlayerManager : IDisposable
private readonly List<PlayerRelatedObject> _playerRelatedObjects = new();
public unsafe PlayerManager(ApiController apiController, IpcManager ipcManager,
CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil, TransientResourceManager transientResourceManager,
PeriodicFileScanner periodicFileScanner, SettingsUi settingsUi, MareMediator mediator)
CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil,
MareMediator mediator) : base(mediator)
{
Logger.Verbose("Creating " + nameof(PlayerManager));
@@ -44,19 +37,15 @@ public class PlayerManager : IDisposable
_ipcManager = ipcManager;
_characterDataFactory = characterDataFactory;
_dalamudUtil = dalamudUtil;
_transientResourceManager = transientResourceManager;
_periodicFileScanner = periodicFileScanner;
_settingsUi = settingsUi;
_mediator = mediator;
_apiController.Connected += ApiControllerOnConnected;
_apiController.Disconnected += ApiController_Disconnected;
_transientResourceManager.TransientResourceLoaded += HandleTransientResourceLoad;
_ipcManager.HeelsOffsetChangeEvent += HeelsOffsetChanged;
_ipcManager.CustomizePlusScaleChange += CustomizePlusChanged;
_ipcManager.PalettePlusPaletteChange += PalettePlusChanged;
_mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => DalamudUtilOnDelayedFrameworkUpdate());
_mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => DalamudUtilOnFrameworkUpdate());
Mediator.Subscribe<CustomizePlusMessage>(this, (msg) => CustomizePlusChanged((CustomizePlusMessage)msg));
Mediator.Subscribe<HeelsOffsetMessage>(this, (msg) => HeelsOffsetChanged((HeelsOffsetMessage)msg));
Mediator.Subscribe<HeelsOffsetMessage>(this, (msg) => PalettePlusChanged((PalettePlusMessage)msg));
Mediator.Subscribe<ConnectedMessage>(this, (_) => ApiControllerOnConnected());
Mediator.Subscribe<DisconnectedMessage>(this, (_) => ApiController_Disconnected());
Mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => DalamudUtilOnDelayedFrameworkUpdate());
Mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => DalamudUtilOnFrameworkUpdate());
Mediator.Subscribe<TransientResourceChangedMessage>(this, (msg) => HandleTransientResourceLoad((TransientResourceChangedMessage)msg));
Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected);
if (_apiController.IsConnected)
@@ -75,14 +64,14 @@ public class PlayerManager : IDisposable
private void DalamudUtilOnFrameworkUpdate()
{
_transientResourceManager.PlayerRelatedPointers = _playerRelatedObjects.Select(f => f.CurrentAddress).ToArray();
Mediator.Publish(new PlayerRelatedObjectPointerUpdateMessage(_playerRelatedObjects.Select(f => f.CurrentAddress).ToArray()));
}
public void HandleTransientResourceLoad(IntPtr gameObj, int idx)
public void HandleTransientResourceLoad(TransientResourceChangedMessage msg)
{
foreach (var obj in _playerRelatedObjects)
{
if (obj.Address == gameObj && !obj.HasUnprocessedUpdate)
if (obj.Address == msg.Address && !obj.HasUnprocessedUpdate)
{
_transientUpdateCts.Cancel();
_transientUpdateCts = new CancellationTokenSource();
@@ -101,19 +90,19 @@ public class PlayerManager : IDisposable
}
}
private void HeelsOffsetChanged(float change)
private void HeelsOffsetChanged(HeelsOffsetMessage change)
{
var player = _playerRelatedObjects.First(f => f.ObjectKind == ObjectKind.Player);
if (LastCreatedCharacterData != null && LastCreatedCharacterData.HeelsOffset != change && !player.IsProcessing)
if (LastCreatedCharacterData != null && LastCreatedCharacterData.HeelsOffset != change.Offset && !player.IsProcessing)
{
Logger.Debug("Heels offset changed to " + change);
Logger.Debug("Heels offset changed to " + change.Offset);
player.HasTransientsUpdate = true;
}
}
private void CustomizePlusChanged(string? change)
private void CustomizePlusChanged(CustomizePlusMessage msg)
{
change ??= string.Empty;
var change = msg.Data ?? string.Empty;
var player = _playerRelatedObjects.First(f => f.ObjectKind == ObjectKind.Player);
if (LastCreatedCharacterData != null && !string.Equals(LastCreatedCharacterData.CustomizePlusData, change, StringComparison.Ordinal) && !player.IsProcessing)
{
@@ -122,9 +111,9 @@ public class PlayerManager : IDisposable
}
}
private void PalettePlusChanged(string? change)
private void PalettePlusChanged(PalettePlusMessage msg)
{
change ??= string.Empty;
var change = msg.Data ?? string.Empty;
var player = _playerRelatedObjects.First(f => f.ObjectKind == ObjectKind.Player);
if (LastCreatedCharacterData != null && !string.Equals(LastCreatedCharacterData.PalettePlusData, change, StringComparison.Ordinal) && !player.IsProcessing)
{
@@ -133,24 +122,13 @@ public class PlayerManager : IDisposable
}
}
public void Dispose()
public override void Dispose()
{
Logger.Verbose("Disposing " + nameof(PlayerManager));
_mediator.Unsubscribe<DelayedFrameworkUpdateMessage>(this);
_mediator.Unsubscribe<FrameworkUpdateMessage>(this);
_apiController.Connected -= ApiControllerOnConnected;
_apiController.Disconnected -= ApiController_Disconnected;
_ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent;
_transientResourceManager.TransientResourceLoaded -= HandleTransientResourceLoad;
base.Dispose();
_playerChangedCts?.Cancel();
_ipcManager.HeelsOffsetChangeEvent -= HeelsOffsetChanged;
_ipcManager.CustomizePlusScaleChange -= CustomizePlusChanged;
_ipcManager.PalettePlusPaletteChange -= PalettePlusChanged;
}
private unsafe void DalamudUtilOnDelayedFrameworkUpdate()
@@ -168,14 +146,14 @@ public class PlayerManager : IDisposable
{
Logger.Debug("ApiController Connected");
_ipcManager.PenumbraRedrawEvent += IpcManager_PenumbraRedrawEvent;
Mediator.Subscribe<PenumbraRedrawMessage>(this, (msg) => IpcManager_PenumbraRedrawEvent((PenumbraRedrawMessage)msg));
}
private void ApiController_Disconnected()
{
Logger.Debug(nameof(ApiController_Disconnected));
_ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent;
Mediator.Unsubscribe<PenumbraRedrawMessage>(this);
}
private async Task<API.Data.CharacterData?> CreateFullCharacterCacheDto(CancellationToken token)
@@ -210,13 +188,13 @@ public class PlayerManager : IDisposable
return cache;
}
private void IpcManager_PenumbraRedrawEvent(IntPtr address, int idx)
private void IpcManager_PenumbraRedrawEvent(PenumbraRedrawMessage msg)
{
Logger.Verbose("RedrawEvent for addr " + address);
Logger.Verbose("RedrawEvent for addr " + msg.Address);
foreach (var item in _playerRelatedObjects)
{
if (address == item.Address)
if (msg.Address == item.Address)
{
Logger.Debug("Penumbra redraw Event for " + item.ObjectKind);
item.HasUnprocessedUpdate = true;
@@ -264,43 +242,41 @@ public class PlayerManager : IDisposable
Task.Run(async () =>
{
API.Data.CharacterData? cacheDto = null;
API.Data.CharacterData? cacheData = null;
try
{
_periodicFileScanner.HaltScan("Character creation");
Mediator.Publish(new HaltScanMessage("Character creation"));
foreach (var item in unprocessedObjects)
{
_dalamudUtil.WaitWhileCharacterIsDrawing("self " + item.ObjectKind.ToString(), item.Address, item.ObjectKind == ObjectKind.MinionOrMount ? 1000 : 10000, token);
}
cacheDto = (await CreateFullCharacterCacheDto(token).ConfigureAwait(false));
cacheData = (await CreateFullCharacterCacheDto(token).ConfigureAwait(false));
}
catch { }
finally
{
_periodicFileScanner.ResumeScan("Character creation");
Mediator.Publish(new ResumeScanMessage("Character creation"));
}
if (cacheDto == null || token.IsCancellationRequested) return;
_settingsUi.LastCreatedCharacterData = cacheDto;
if (cacheData == null || token.IsCancellationRequested) return;
#if DEBUG
//var json = JsonConvert.SerializeObject(cacheDto, Formatting.Indented);
//Logger.Verbose(json);
#endif
if (string.Equals(LastCreatedCharacterData?.DataHash.Value ?? string.Empty, cacheDto.DataHash.Value, StringComparison.Ordinal))
if (string.Equals(LastCreatedCharacterData?.DataHash.Value ?? string.Empty, cacheData.DataHash.Value, StringComparison.Ordinal))
{
Logger.Debug("Not sending data, already sent");
return;
}
LastCreatedCharacterData = cacheDto;
LastCreatedCharacterData = cacheData;
if (_apiController.IsConnected && !token.IsCancellationRequested && !doNotSendUpdate)
{
Logger.Verbose("Invoking PlayerHasChanged");
PlayerHasChanged?.Invoke(cacheDto);
Mediator.Publish(new PlayerChangedMessage(cacheData));
}
}, token);
}

View File

@@ -1,5 +1,4 @@
using MareSynchronos.API.Data.Enum;
using MareSynchronos.Delegates;
using MareSynchronos.Factories;
using MareSynchronos.MareConfiguration;
using MareSynchronos.Mediator;
@@ -10,14 +9,11 @@ using System.Collections.Concurrent;
namespace MareSynchronos.Managers;
public class TransientResourceManager : IDisposable
public class TransientResourceManager : MediatorSubscriberBase, IDisposable
{
private readonly IpcManager _ipcManager;
private readonly ConfigurationService _configurationService;
private readonly DalamudUtil _dalamudUtil;
private readonly MareMediator _mediator;
public event DrawObjectDelegate? TransientResourceLoaded;
public IntPtr[] PlayerRelatedPointers = Array.Empty<IntPtr>();
private readonly string[] _fileTypesToHandle = new[] { "tmb", "pap", "avfx", "atex", "sklb", "eid", "phyb", "scd", "skp", "shpk" };
[Obsolete]
@@ -26,16 +22,16 @@ public class TransientResourceManager : IDisposable
private ConcurrentDictionary<IntPtr, HashSet<string>> TransientResources { get; } = new();
private ConcurrentDictionary<ObjectKind, HashSet<FileReplacement>> SemiTransientResources { get; } = new();
public TransientResourceManager(IpcManager manager, ConfigurationService configurationService, DalamudUtil dalamudUtil, FileReplacementFactory fileReplacementFactory, MareMediator mediator)
public TransientResourceManager(ConfigurationService configurationService, DalamudUtil dalamudUtil, FileReplacementFactory fileReplacementFactory, MareMediator mediator) : base(mediator)
{
manager.PenumbraResourceLoadEvent += Manager_PenumbraResourceLoadEvent;
manager.PenumbraModSettingChanged += Manager_PenumbraModSettingChanged;
_ipcManager = manager;
_configurationService = configurationService;
_dalamudUtil = dalamudUtil;
_mediator = mediator;
_mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => DalamudUtil_FrameworkUpdate());
_mediator.Subscribe<ClassJobChangedMessage>(this, (_) => DalamudUtil_ClassJobChanged());
mediator.Subscribe<PenumbraResourceLoadMessage>(this, (msg) => Manager_PenumbraResourceLoadEvent((PenumbraResourceLoadMessage)msg));
Mediator.Subscribe<PenumbraModSettingChangedMessage>(this, (_) => Manager_PenumbraModSettingChanged());
Mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => DalamudUtil_FrameworkUpdate());
Mediator.Subscribe<ClassJobChangedMessage>(this, (_) => DalamudUtil_ClassJobChanged());
Mediator.Subscribe<PlayerRelatedObjectPointerUpdateMessage>(this, (msg) => PlayerRelatedPointers = ((PlayerRelatedObjectPointerUpdateMessage)msg).RelatedObjects);
// migrate obsolete data to new format
if (File.Exists(PersistentDataCache))
{
@@ -87,7 +83,7 @@ public class TransientResourceManager : IDisposable
return !verified;
});
if (!successfulValidation)
TransientResourceLoaded?.Invoke(_dalamudUtil.PlayerPointer, -1);
Mediator.Publish(new TransientResourceChangedMessage(_dalamudUtil.PlayerPointer));
}
});
}
@@ -140,8 +136,11 @@ public class TransientResourceManager : IDisposable
return new List<FileReplacement>();
}
private void Manager_PenumbraResourceLoadEvent(IntPtr gameObject, string gamePath, string filePath)
private void Manager_PenumbraResourceLoadEvent(PenumbraResourceLoadMessage msg)
{
var gamePath = msg.GamePath;
var gameObject = msg.GameObject;
var filePath = msg.FilePath;
if (!_fileTypesToHandle.Any(type => gamePath.EndsWith(type, StringComparison.OrdinalIgnoreCase)))
{
return;
@@ -180,7 +179,7 @@ public class TransientResourceManager : IDisposable
{
TransientResources[gameObject].Add(replacedGamePath);
Logger.Debug($"Adding {replacedGamePath} for {gameObject} ({filePath})");
TransientResourceLoaded?.Invoke(gameObject, -1);
Mediator.Publish(new TransientResourceChangedMessage(gameObject));
}
}
@@ -250,12 +249,9 @@ public class TransientResourceManager : IDisposable
TransientResources[gameObject].Clear();
}
public void Dispose()
public override void Dispose()
{
_mediator.Unsubscribe<FrameworkUpdateMessage>(this);
_mediator.Unsubscribe<ClassJobChangedMessage>(this);
_ipcManager.PenumbraResourceLoadEvent -= Manager_PenumbraResourceLoadEvent;
_ipcManager.PenumbraModSettingChanged -= Manager_PenumbraModSettingChanged;
base.Dispose();
TransientResources.Clear();
SemiTransientResources.Clear();
if (SemiTransientResources.ContainsKey(ObjectKind.Player))