diff --git a/LightlessSync/LightlessConfiguration/Configurations/PlayerPerformanceConfig.cs b/LightlessSync/LightlessConfiguration/Configurations/PlayerPerformanceConfig.cs index d87f3c3..ca12006 100644 --- a/LightlessSync/LightlessConfiguration/Configurations/PlayerPerformanceConfig.cs +++ b/LightlessSync/LightlessConfiguration/Configurations/PlayerPerformanceConfig.cs @@ -14,4 +14,6 @@ public class PlayerPerformanceConfig : ILightlessConfiguration public int TrisAutoPauseThresholdThousands { get; set; } = 250; public List UIDsToIgnore { get; set; } = new(); public bool PauseInInstanceDuty { get; set; } = false; + public bool PauseWhilePerforming { get; set; } = true; + public bool PauseInCombat { get; set; } = true; } \ No newline at end of file diff --git a/LightlessSync/PlayerData/Handlers/PairHandler.cs b/LightlessSync/PlayerData/Handlers/PairHandler.cs index edde269..5947f80 100644 --- a/LightlessSync/PlayerData/Handlers/PairHandler.cs +++ b/LightlessSync/PlayerData/Handlers/PairHandler.cs @@ -137,11 +137,21 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase public void ApplyCharacterData(Guid applicationBase, CharacterData characterData, bool forceApplyCustomization = false) { - if (_dalamudUtil.IsInCombatOrPerforming) + if (_dalamudUtil.IsInCombat) { 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"))); - Logger.LogDebug("[BASE-{appBase}] Received data but player is in combat or performing", applicationBase); + "Cannot apply character data: you are in combat, deferring application"))); + Logger.LogDebug("[BASE-{appBase}] Received data but player is in combat", applicationBase); + _dataReceivedInDowntime = new(applicationBase, characterData, forceApplyCustomization); + SetUploading(isUploading: false); + return; + } + + if (_dalamudUtil.IsPerforming) + { + Mediator.Publish(new EventMessage(new Event(PlayerName, Pair.UserData, nameof(PairHandler), EventSeverity.Warning, + "Cannot apply character data: you are performing music, deferring application"))); + Logger.LogDebug("[BASE-{appBase}] Received data but player is performing", applicationBase); _dataReceivedInDowntime = new(applicationBase, characterData, forceApplyCustomization); SetUploading(isUploading: false); return; diff --git a/LightlessSync/Services/DalamudUtilService.cs b/LightlessSync/Services/DalamudUtilService.cs index 4c2bdd8..88b0ee1 100644 --- a/LightlessSync/Services/DalamudUtilService.cs +++ b/LightlessSync/Services/DalamudUtilService.cs @@ -162,7 +162,8 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber public bool IsLoggedIn { get; private set; } public bool IsOnFrameworkThread => _framework.IsInFrameworkUpdateThread; public bool IsZoning => _condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51]; - public bool IsInCombatOrPerforming { get; private set; } = false; + public bool IsInCombat { get; private set; } = false; + public bool IsPerforming { get; private set; } = false; public bool IsInInstance { get; private set; } = false; public bool HasModifiedGameFiles => _gameData.HasModifiedGameDataFiles; public uint ClassJobId => _classJobId!.Value; @@ -670,19 +671,33 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber Mediator.Publish(new GposeEndMessage()); } - if ((_condition[ConditionFlag.Performing] || _condition[ConditionFlag.InCombat]) && !IsInCombatOrPerforming && (_condition[ConditionFlag.BoundByDuty] && !_playerPerformanceConfigService.Current.PauseInInstanceDuty)) - { - _logger.LogDebug("Combat/Performance start"); - IsInCombatOrPerforming = true; - Mediator.Publish(new CombatOrPerformanceStartMessage()); - Mediator.Publish(new HaltScanMessage(nameof(IsInCombatOrPerforming))); + if ((_condition[ConditionFlag.InCombat]) && !IsInCombat && !IsInInstance && _playerPerformanceConfigService.Current.PauseInCombat) + { + _logger.LogDebug("Combat start"); + IsInCombat = true; + Mediator.Publish(new CombatStartMessage()); + Mediator.Publish(new HaltScanMessage(nameof(IsInCombat))); } - else if ((!_condition[ConditionFlag.Performing] && !_condition[ConditionFlag.InCombat]) && IsInCombatOrPerforming && (_condition[ConditionFlag.BoundByDuty] && !_playerPerformanceConfigService.Current.PauseInInstanceDuty)) + else if ((!_condition[ConditionFlag.InCombat]) && IsInCombat && !IsInInstance && _playerPerformanceConfigService.Current.PauseInCombat) { - _logger.LogDebug("Combat/Performance end"); - IsInCombatOrPerforming = false; - Mediator.Publish(new CombatOrPerformanceEndMessage()); - Mediator.Publish(new ResumeScanMessage(nameof(IsInCombatOrPerforming))); + _logger.LogDebug("Combat end"); + IsInCombat = false; + Mediator.Publish(new CombatEndMessage()); + Mediator.Publish(new ResumeScanMessage(nameof(IsInCombat))); + } + if (_condition[ConditionFlag.Performing] && !IsPerforming && _playerPerformanceConfigService.Current.PauseWhilePerforming) + { + _logger.LogDebug("Performance start"); + IsInCombat = true; + Mediator.Publish(new PerformanceStartMessage()); + Mediator.Publish(new HaltScanMessage(nameof(IsPerforming))); + } + else if (!_condition[ConditionFlag.Performing] && IsPerforming && _playerPerformanceConfigService.Current.PauseWhilePerforming) + { + _logger.LogDebug("Performance end"); + IsInCombat = false; + Mediator.Publish(new PerformanceEndMessage()); + Mediator.Publish(new ResumeScanMessage(nameof(IsPerforming))); } if ((_condition[ConditionFlag.BoundByDuty]) && !IsInInstance && _playerPerformanceConfigService.Current.PauseInInstanceDuty) { diff --git a/LightlessSync/Services/Mediator/Messages.cs b/LightlessSync/Services/Mediator/Messages.cs index ea800d2..9018fe2 100644 --- a/LightlessSync/Services/Mediator/Messages.cs +++ b/LightlessSync/Services/Mediator/Messages.cs @@ -79,8 +79,10 @@ public record OpenPermissionWindow(Pair Pair) : MessageBase; public record DownloadLimitChangedMessage() : SameThreadMessage; public record CensusUpdateMessage(byte Gender, byte RaceId, byte TribeId) : MessageBase; public record TargetPairMessage(Pair Pair) : MessageBase; -public record CombatOrPerformanceStartMessage : MessageBase; -public record CombatOrPerformanceEndMessage : MessageBase; +public record CombatStartMessage : MessageBase; +public record CombatEndMessage : MessageBase; +public record PerformanceStartMessage : MessageBase; +public record PerformanceEndMessage : MessageBase; public record InstanceOrDutyStartMessage : MessageBase; public record InstanceOrDutyEndMessage : MessageBase; public record EventMessage(Event Event) : MessageBase; diff --git a/LightlessSync/UI/SettingsUi.cs b/LightlessSync/UI/SettingsUi.cs index 7f42602..80dc521 100644 --- a/LightlessSync/UI/SettingsUi.cs +++ b/LightlessSync/UI/SettingsUi.cs @@ -1387,16 +1387,32 @@ public class SettingsUi : WindowMediatorSubscriberBase bool autoPause = _playerPerformanceConfigService.Current.AutoPausePlayersExceedingThresholds; bool autoPauseEveryone = _playerPerformanceConfigService.Current.AutoPausePlayersWithPreferredPermissionsExceedingThresholds; bool autoPauseInDuty = _playerPerformanceConfigService.Current.PauseInInstanceDuty; + bool autoPauseInCombat = _playerPerformanceConfigService.Current.PauseInCombat; + bool autoPauseWhilePerforming = _playerPerformanceConfigService.Current.PauseWhilePerforming; if (_uiShared.MediumTreeNode("Auto Pause", UIColors.Get("LightlessPurple"))) { + if (ImGui.Checkbox("Auto pause sync while combat", ref autoPauseInCombat)) + { + _playerPerformanceConfigService.Current.PauseInCombat = autoPauseInCombat; + _playerPerformanceConfigService.Save(); + } + _uiShared.DrawHelpText("AUTO-ENABLED: Your risk of crashing during a fight increases when this is disabled. For example: VFX mods Loading mid fight can cause a crash." + Environment.NewLine + + UiSharedService.TooltipSeparator + "WARNING: DISABLE AT YOUR OWN RISK."); + if (ImGui.Checkbox("Auto pause sync while in Perfomance as Bard", ref autoPauseWhilePerforming)) + { + _playerPerformanceConfigService.Current.PauseWhilePerforming = autoPauseWhilePerforming; + _playerPerformanceConfigService.Save(); + } + _uiShared.DrawHelpText("AUTO-ENABLED: Your risk of crashing during a performance increases when this is disabled. For example: Some mods can crash you mid performance" + Environment.NewLine + + UiSharedService.TooltipSeparator + "WARNING: DISABLE AT YOUR OWN RISK."); if (ImGui.Checkbox("Auto pause sync while in instances and duties", ref autoPauseInDuty)) { _playerPerformanceConfigService.Current.PauseInInstanceDuty = autoPauseInDuty; _playerPerformanceConfigService.Save(); } _uiShared.DrawHelpText("When enabled, it will automatically pause all players while you are in an instance, such as a dungeon or raid." + Environment.NewLine - + UiSharedService.TooltipSeparator + "Warning: You many have to leave the dungeon to resync with people again"); + + UiSharedService.TooltipSeparator + "Warning: You may have to leave the dungeon to resync with people again"); if (ImGui.Checkbox("Automatically pause players exceeding thresholds", ref autoPause)) {