diff --git a/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs b/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs index 74eb5db..435b8ef 100644 --- a/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs +++ b/MareSynchronos/MareConfiguration/Configurations/MareConfig.cs @@ -30,6 +30,7 @@ public class MareConfig : IMareConfiguration public LogLevel LogLevel { get; set; } = LogLevel.Information; public bool LogPerformance { get; set; } = false; public bool LogEvents { get; set; } = true; + public bool HoldCombatApplication { get; set; } = false; public double MaxLocalCacheInGiB { get; set; } = 20; public bool OpenGposeImportOnGposeStart { get; set; } = false; public bool OpenPopupOnAdd { get; set; } = true; diff --git a/MareSynchronos/PlayerData/Factories/PairHandlerFactory.cs b/MareSynchronos/PlayerData/Factories/PairHandlerFactory.cs index bc5b3d5..d41efc3 100644 --- a/MareSynchronos/PlayerData/Factories/PairHandlerFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PairHandlerFactory.cs @@ -1,5 +1,6 @@ using MareSynchronos.FileCache; using MareSynchronos.Interop.Ipc; +using MareSynchronos.MareConfiguration; using MareSynchronos.PlayerData.Handlers; using MareSynchronos.PlayerData.Pairs; using MareSynchronos.Services; @@ -12,6 +13,7 @@ namespace MareSynchronos.PlayerData.Factories; public class PairHandlerFactory { + private readonly MareConfigService _configService; private readonly DalamudUtilService _dalamudUtilService; private readonly FileCacheManager _fileCacheManager; private readonly FileDownloadManagerFactory _fileDownloadManagerFactory; @@ -29,7 +31,8 @@ public class PairHandlerFactory FileDownloadManagerFactory fileDownloadManagerFactory, DalamudUtilService dalamudUtilService, PluginWarningNotificationService pluginWarningNotificationManager, IHostApplicationLifetime hostApplicationLifetime, FileCacheManager fileCacheManager, MareMediator mareMediator, PlayerPerformanceService playerPerformanceService, - ServerConfigurationManager serverConfigManager, PairAnalyzerFactory pairAnalyzerFactory) + ServerConfigurationManager serverConfigManager, PairAnalyzerFactory pairAnalyzerFactory, + MareConfigService configService) { _loggerFactory = loggerFactory; _gameObjectHandlerFactory = gameObjectHandlerFactory; @@ -43,12 +46,13 @@ public class PairHandlerFactory _playerPerformanceService = playerPerformanceService; _serverConfigManager = serverConfigManager; _pairAnalyzerFactory = pairAnalyzerFactory; + _configService = configService; } public PairHandler Create(Pair pair) { return new PairHandler(_loggerFactory.CreateLogger(), pair, _pairAnalyzerFactory.Create(pair), _gameObjectHandlerFactory, _ipcManager, _fileDownloadManagerFactory.Create(), _pluginWarningNotificationManager, _dalamudUtilService, _hostApplicationLifetime, - _fileCacheManager, _mareMediator, _playerPerformanceService, _serverConfigManager); + _fileCacheManager, _mareMediator, _playerPerformanceService, _serverConfigManager, _configService); } } \ No newline at end of file diff --git a/MareSynchronos/PlayerData/Handlers/PairHandler.cs b/MareSynchronos/PlayerData/Handlers/PairHandler.cs index e277fcf..d4a43da 100644 --- a/MareSynchronos/PlayerData/Handlers/PairHandler.cs +++ b/MareSynchronos/PlayerData/Handlers/PairHandler.cs @@ -1,6 +1,7 @@ using MareSynchronos.API.Data; using MareSynchronos.FileCache; using MareSynchronos.Interop.Ipc; +using MareSynchronos.MareConfiguration; using MareSynchronos.PlayerData.Factories; using MareSynchronos.PlayerData.Pairs; using MareSynchronos.Services; @@ -22,6 +23,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase { private sealed record CombatData(Guid ApplicationId, CharacterData CharacterData, bool Forced); + private readonly MareConfigService _configService; private readonly DalamudUtilService _dalamudUtil; private readonly FileDownloadManager _downloadManager; private readonly FileCacheManager _fileDbManager; @@ -51,7 +53,8 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase DalamudUtilService dalamudUtil, IHostApplicationLifetime lifetime, FileCacheManager fileDbManager, MareMediator mediator, PlayerPerformanceService playerPerformanceService, - ServerConfigurationManager serverConfigManager) : base(logger, mediator) + ServerConfigurationManager serverConfigManager, + MareConfigService configService) : base(logger, mediator) { Pair = pair; PairAnalyzer = pairAnalyzer; @@ -64,6 +67,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase _fileDbManager = fileDbManager; _playerPerformanceService = playerPerformanceService; _serverConfigManager = serverConfigManager; + _configService = configService; Mediator.Subscribe(this, (_) => FrameworkUpdate()); Mediator.Subscribe(this, (_) => @@ -100,9 +104,12 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase }); Mediator.Subscribe(this, _ => { - _dataReceivedInDowntime = null; - _downloadCancellationTokenSource = _downloadCancellationTokenSource?.CancelRecreate(); - _applicationCancellationTokenSource = _applicationCancellationTokenSource?.CancelRecreate(); + if (_configService.Current.HoldCombatApplication) + { + _dataReceivedInDowntime = null; + _downloadCancellationTokenSource = _downloadCancellationTokenSource?.CancelRecreate(); + _applicationCancellationTokenSource = _applicationCancellationTokenSource?.CancelRecreate(); + } }); Mediator.Subscribe(this, (msg) => { @@ -141,7 +148,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase public void ApplyCharacterData(Guid applicationBase, CharacterData characterData, bool forceApplyCustomization = false) { - if (_dalamudUtil.IsInCombatOrPerforming) + if (_configService.Current.HoldCombatApplication && _dalamudUtil.IsInCombatOrPerforming) { Mediator.Publish(new EventMessage(new Event(PlayerName, Pair.UserData, nameof(PairHandler), EventSeverity.Warning, "Cannot apply character data: you are in combat or performing music, deferring application"))); diff --git a/MareSynchronos/UI/SettingsUi.cs b/MareSynchronos/UI/SettingsUi.cs index 45328a3..e645151 100644 --- a/MareSynchronos/UI/SettingsUi.cs +++ b/MareSynchronos/UI/SettingsUi.cs @@ -659,6 +659,15 @@ public class SettingsUi : WindowMediatorSubscriberBase _configService.Save(); } + bool holdCombatApplication = _configService.Current.HoldCombatApplication; + if (ImGui.Checkbox("Hold application during combat", ref holdCombatApplication)) + { + if (!holdCombatApplication) + Mediator.Publish(new CombatOrPerformanceEndMessage()); + _configService.Current.HoldCombatApplication = holdCombatApplication; + _configService.Save(); + } + ImGui.Separator(); _uiShared.BigText("Debug"); #if DEBUG