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;