From dae803018051492355c944312c270bba1d567737 Mon Sep 17 00:00:00 2001 From: LTS <127939494+LTS-FFXIV@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:28:14 -0600 Subject: [PATCH 1/2] Update AutoStatusOrder.json From aa427f224b89d075e7b204157062f15e8f04c068 Mon Sep 17 00:00:00 2001 From: LTS-FFXIV <127939494+LTS-FFXIV@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:30:52 -0600 Subject: [PATCH 2/2] Refactor configurations and update UI handling Updated .gitignore to include Resources/AutoStatusOrder.json. Moved AutoStatusOrder to OtherConfiguration as HashSet. Added new config options _autoOffWhenDeadPvP and _changelogPopup. Modified OtherConfiguration to handle AutoStatusOrder. Added methods ResetAutoStatusOrder and SaveAutoStatusOrder. Added partial method ModifyShirkPvE in CustomRotation_Actions.cs. Updated RSCommands_Actions.cs for _autoOffWhenDeadPvP check. Refactored RotationConfigWindow to use OtherConfiguration. Updated WelcomeWindow to show changelog popup conditionally. Adjusted StateUpdater to handle AutoStatusOrder as uint. Updated assembly version in WelcomeWindow.cs to 7.1.5.24. Added using directive for RotationSolver.Basic.Configuration. --- .gitignore | 1 + RotationSolver.Basic/Configuration/Configs.cs | 13 +++++--- .../Configuration/OtherConfiguration.cs | 16 +++++++++- .../Rotations/CustomRotation_Actions.cs | 5 +++ RotationSolver/Commands/RSCommands_Actions.cs | 6 ++++ RotationSolver/UI/RotationConfigWindow.cs | 16 +++++----- RotationSolver/UI/WelcomeWindow.cs | 4 +-- RotationSolver/Updaters/StateUpdater.cs | 31 ++++++++++--------- 8 files changed, 60 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 4d9f035df..6e162095f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ obj/ lib/ .idea/ RotationSolver/Localization/Localization.json +/Resources/AutoStatusOrder.json diff --git a/RotationSolver.Basic/Configuration/Configs.cs b/RotationSolver.Basic/Configuration/Configs.cs index df897a6be..69f98dc6f 100644 --- a/RotationSolver.Basic/Configuration/Configs.cs +++ b/RotationSolver.Basic/Configuration/Configs.cs @@ -25,11 +25,6 @@ public const string List2 = "List2", Debug = "Debug"; - public List AutoStatusOrder { get; set; } = Enum.GetValues(typeof(AutoStatus)) - .Cast() - .Where(status => status != AutoStatus.None) - .ToList(); - public const int CurrentVersion = 12; public int Version { get; set; } = CurrentVersion; @@ -64,6 +59,10 @@ public const string Filter = BasicAutoSwitch)] private static readonly bool _autoOffWhenDead = true; + [ConditionBool, UI("Auto turn off when dead in PvP.", + Filter = BasicAutoSwitch)] + private static readonly bool _autoOffWhenDeadPvP = true; + [ConditionBool, UI("Auto turn off when duty completed.", Filter = BasicAutoSwitch)] private static readonly bool _autoOffWhenDutyCompleted = true; @@ -77,6 +76,10 @@ public const string Filter = UiInformation)] private static readonly bool _sayOutStateChanged = false; + [ConditionBool, UI("Enable changelog window popup on update", + Filter = UiInformation)] + private static readonly bool _changelogPopup = true; + [ConditionBool, UI("Show plugin status in server info bar.", Filter = UiInformation)] private static readonly bool _showInfoOnDtr = true; diff --git a/RotationSolver.Basic/Configuration/OtherConfiguration.cs b/RotationSolver.Basic/Configuration/OtherConfiguration.cs index 4533aa532..d37c0bc52 100644 --- a/RotationSolver.Basic/Configuration/OtherConfiguration.cs +++ b/RotationSolver.Basic/Configuration/OtherConfiguration.cs @@ -19,6 +19,7 @@ internal class OtherConfiguration public static HashSet InvincibleStatus = []; public static HashSet NoCastingStatus = []; public static HashSet PrioTargetId = []; + public static HashSet AutoStatusOrder = []; public static RotationSolverRecord RotationSolverRecord = new(); @@ -33,6 +34,7 @@ public static void Init() Task.Run(() => InitOne(ref PriorityStatus, nameof(PriorityStatus))); Task.Run(() => InitOne(ref InvincibleStatus, nameof(InvincibleStatus))); Task.Run(() => InitOne(ref PrioTargetId, nameof(PrioTargetId))); + Task.Run(() => InitOne(ref AutoStatusOrder, nameof(AutoStatusOrder))); Task.Run(() => InitOne(ref NoHostileNames, nameof(NoHostileNames))); Task.Run(() => InitOne(ref NoProvokeNames, nameof(NoProvokeNames))); Task.Run(() => InitOne(ref AnimationLockTime, nameof(AnimationLockTime))); @@ -52,6 +54,7 @@ public static Task Save() await SaveDangerousStatus(); await SaveInvincibleStatus(); await SavePrioTargetId(); + await SaveAutoStatusOrder(); await SaveNoHostileNames(); await SaveAnimationLockTime(); await SaveHostileCastingArea(); @@ -162,7 +165,7 @@ public static Task SaveBeneficialPositions() public static void ResetPrioTargetId() { InitOne(ref PrioTargetId, nameof(PrioTargetId), true, true); - SaveHostileCastingKnockback().Wait(); + SavePrioTargetId().Wait(); } public static Task SavePrioTargetId() @@ -170,6 +173,17 @@ public static Task SavePrioTargetId() return Task.Run(() => Save(PrioTargetId, nameof(PrioTargetId))); } + public static void ResetAutoStatusOrder() + { + InitOne(ref AutoStatusOrder, nameof(AutoStatusOrder), true, true); + SaveAutoStatusOrder().Wait(); + } + + public static Task SaveAutoStatusOrder() + { + return Task.Run(() => Save(AutoStatusOrder, nameof(AutoStatusOrder))); + } + public static Task SaveNoHostileNames() { return Task.Run(() => Save(NoHostileNames, nameof(NoHostileNames))); diff --git a/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs b/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs index d20a825ba..c8487bb68 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs @@ -30,6 +30,11 @@ static partial void ModifyTrueNorthPvE(ref ActionSetting setting) setting.ActionCheck = () => !IsLastAction(ActionID.TrueNorthPvE); } + static partial void ModifyShirkPvE(ref ActionSetting setting) + { + setting.TargetType = TargetType.Tank; + } + static partial void ModifyAddlePvE(ref ActionSetting setting) { setting.TargetStatusProvide = new[] { StatusID.Addle }; diff --git a/RotationSolver/Commands/RSCommands_Actions.cs b/RotationSolver/Commands/RSCommands_Actions.cs index 18e90bb15..68014f76f 100644 --- a/RotationSolver/Commands/RSCommands_Actions.cs +++ b/RotationSolver/Commands/RSCommands_Actions.cs @@ -187,6 +187,12 @@ internal static void UpdateRotationState() { CancelState(); } + else if (Service.Config.AutoOffWhenDeadPvP && DataCenter.Territory?.IsPvP == true + && Player.Available + && Player.Object.CurrentHp == 0) + { + CancelState(); + } else if (Service.Config.AutoOffCutScene && Svc.Condition[ConditionFlag.OccupiedInCutSceneEvent]) { diff --git a/RotationSolver/UI/RotationConfigWindow.cs b/RotationSolver/UI/RotationConfigWindow.cs index 3f46c8e76..cdc911d98 100644 --- a/RotationSolver/UI/RotationConfigWindow.cs +++ b/RotationSolver/UI/RotationConfigWindow.cs @@ -40,7 +40,7 @@ public partial class RotationConfigWindow : Window private const float JOB_ICON_WIDTH = 50; public RotationConfigWindow() - : base("", ImGuiWindowFlags.NoScrollbar, false) + : base("", ImGuiWindowFlags.NoScrollbar, false) { SizeCondition = ImGuiCond.FirstUseEver; Size = new Vector2(740f, 490f); @@ -765,15 +765,11 @@ private void DrawAutoStatusOrderConfig() if (ImGui.Button("Reset to Default")) { - Service.Config.AutoStatusOrder = Enum.GetValues(typeof(AutoStatus)) - .Cast() - .Where(status => status != AutoStatus.None) - .ToList(); - Service.Config.Save(); + OtherConfiguration.ResetAutoStatusOrder(); } ImGui.Spacing(); - var autoStatusOrder = Service.Config.AutoStatusOrder; + var autoStatusOrder = OtherConfiguration.AutoStatusOrder.ToList(); // Convert HashSet to List bool orderChanged = false; // Begin a child window to contain the list @@ -784,6 +780,7 @@ private void DrawAutoStatusOrderConfig() for (int i = 0; i < itemCount; i++) { var item = autoStatusOrder[i]; + var itemName = Enum.GetName(typeof(AutoStatus), item) ?? item.ToString(); // Retrieve the status name by its enum value // Draw up button if (ImGuiEx.IconButton(FontAwesomeIcon.ArrowUp, $"##Up{i}") && i > 0) @@ -810,7 +807,7 @@ private void DrawAutoStatusOrderConfig() ImGui.SameLine(); // Draw the item - ImGui.Text(item.ToString()); + ImGui.Text(itemName); // Optionally, add tooltips or additional information if (ImGui.IsItemHovered()) @@ -825,7 +822,8 @@ private void DrawAutoStatusOrderConfig() if (orderChanged) { - Service.Config.Save(); + OtherConfiguration.AutoStatusOrder = new HashSet(autoStatusOrder); // Convert List back to HashSet + OtherConfiguration.SaveAutoStatusOrder(); } } diff --git a/RotationSolver/UI/WelcomeWindow.cs b/RotationSolver/UI/WelcomeWindow.cs index 969ab7da6..90f6062f1 100644 --- a/RotationSolver/UI/WelcomeWindow.cs +++ b/RotationSolver/UI/WelcomeWindow.cs @@ -13,7 +13,7 @@ public WelcomeWindow() : base($"Welcome to Rotation Solver Reborn!", BaseFlags) { Size = new Vector2(650, 500); SizeCondition = ImGuiCond.FirstUseEver; - if (_lastSeenChangelog != _assemblyVersion || !Service.Config.FirstTimeSetupDone) + if ((_lastSeenChangelog != _assemblyVersion && Service.Config.ChangelogPopup || !Service.Config.FirstTimeSetupDone) && Service.Config.ChangelogPopup) { PopulateChangelogs(); IsOpen = true; @@ -25,7 +25,7 @@ public WelcomeWindow() : base($"Welcome to Rotation Solver Reborn!", BaseFlags) #if DEBUG private string _assemblyVersion = "6.9.6.9"; //kekw #else - private string _assemblyVersion = typeof(RotationConfigWindow).Assembly.GetName().Version?.ToString() ?? "4.0.5.4"; + private string _assemblyVersion = typeof(RotationConfigWindow).Assembly.GetName().Version?.ToString() ?? "7.1.5.24"; #endif private string _lastSeenChangelog = Service.Config.LastSeenChangelog; diff --git a/RotationSolver/Updaters/StateUpdater.cs b/RotationSolver/Updaters/StateUpdater.cs index 3f61e6482..2ade07b6f 100644 --- a/RotationSolver/Updaters/StateUpdater.cs +++ b/RotationSolver/Updaters/StateUpdater.cs @@ -1,4 +1,5 @@ using ECommons.GameHelpers; +using RotationSolver.Basic.Configuration; using RotationSolver.Basic.Configuration.Conditions; namespace RotationSolver.Updaters; @@ -24,78 +25,78 @@ private static AutoStatus StatusFromAutomatic() AutoStatus status = AutoStatus.None; // Get the user-defined order of AutoStatus flags - var autoStatusOrder = Service.Config.AutoStatusOrder; + var autoStatusOrder = OtherConfiguration.AutoStatusOrder; foreach (var autoStatus in autoStatusOrder) { switch (autoStatus) { - case AutoStatus.Dispel: + case (uint)AutoStatus.Dispel: if (ShouldAddDispel()) status |= AutoStatus.Dispel; break; - case AutoStatus.Interrupt: + case (uint)AutoStatus.Interrupt: if (ShouldAddInterrupt()) status |= AutoStatus.Interrupt; break; - case AutoStatus.AntiKnockback: + case (uint)AutoStatus.AntiKnockback: if (ShouldAddAntiKnockback()) status |= AutoStatus.AntiKnockback; break; - case AutoStatus.Positional: + case (uint)AutoStatus.Positional: if (ShouldAddPositional()) status |= AutoStatus.Positional; break; - case AutoStatus.HealAreaAbility: + case (uint)AutoStatus.HealAreaAbility: if (ShouldAddHealAreaAbility()) status |= AutoStatus.HealAreaAbility; break; - case AutoStatus.HealAreaSpell: + case (uint)AutoStatus.HealAreaSpell: if (ShouldAddHealAreaSpell()) status |= AutoStatus.HealAreaSpell; break; - case AutoStatus.HealSingleAbility: + case (uint)AutoStatus.HealSingleAbility: if (ShouldAddHealSingleAbility()) status |= AutoStatus.HealSingleAbility; break; - case AutoStatus.HealSingleSpell: + case (uint)AutoStatus.HealSingleSpell: if (ShouldAddHealSingleSpell()) status |= AutoStatus.HealSingleSpell; break; - case AutoStatus.DefenseArea: + case (uint)AutoStatus.DefenseArea: if (ShouldAddDefenseArea()) status |= AutoStatus.DefenseArea; break; - case AutoStatus.DefenseSingle: + case (uint)AutoStatus.DefenseSingle: if (ShouldAddDefenseSingle()) status |= AutoStatus.DefenseSingle; break; - case AutoStatus.Raise: + case (uint)AutoStatus.Raise: if (ShouldAddRaise()) status |= AutoStatus.Raise; break; - case AutoStatus.Provoke: + case (uint)AutoStatus.Provoke: if (ShouldAddProvoke()) status |= AutoStatus.Provoke; break; - case AutoStatus.TankStance: + case (uint)AutoStatus.TankStance: if (ShouldAddTankStance()) status |= AutoStatus.TankStance; break; - case AutoStatus.Speed: + case (uint)AutoStatus.Speed: if (ShouldAddSpeed()) status |= AutoStatus.Speed; break;