diff --git a/BossMod/Autorotation/AutorotationConfig.cs b/BossMod/Autorotation/AutorotationConfig.cs index 4f1cfedd45..78694c7033 100644 --- a/BossMod/Autorotation/AutorotationConfig.cs +++ b/BossMod/Autorotation/AutorotationConfig.cs @@ -5,6 +5,12 @@ public sealed class AutorotationConfig : ConfigNode { [PropertyDisplay("Show in-game UI")] public bool ShowUI = false; + [PropertyDisplay("Disable Timers inside Autorotation window")] + public bool DisableTimers = false; + [PropertyDisplay("Show explicitly which GCD & OGCD is being queued next as well as last action used inside Autorotation window")] + public bool EnableGCDs = false; + [PropertyDisplay("Show if ability is a GCD or an OGCD when queuing actions inside Autorotation window")] + public bool ShowGCDs = false; public enum DtrStatus { diff --git a/BossMod/Autorotation/UIRotationWindow.cs b/BossMod/Autorotation/UIRotationWindow.cs index e4eadd5d8d..28eb5b37c9 100644 --- a/BossMod/Autorotation/UIRotationWindow.cs +++ b/BossMod/Autorotation/UIRotationWindow.cs @@ -51,12 +51,17 @@ public override void Draw() if (player == null) return; + #region Presets DrawRotationSelector(_mgr); + ImGui.Spacing(); + #endregion + #region Cooldown Plans var activeModule = _mgr.Bossmods.ActiveModule; if (activeModule != null) { - ImGui.TextUnformatted($"CD Plan:"); + ImGui.AlignTextToFramePadding(); + ImGui.TextUnformatted($"Current CD Plan:"); if (activeModule.Info?.PlanLevel > 0) { @@ -89,8 +94,11 @@ public override void Draw() } } } + ImGui.Spacing(); + #endregion - ImGui.TextUnformatted("Modules: "); + #region Modules + ImGui.TextUnformatted("Modules Active:"); var dups = _mgr.DuplicateModules.ToList(); if (dups.Count > 0) @@ -124,27 +132,119 @@ public override void Draw() } } } - ImGui.SameLine(); ImGui.TextUnformatted(_mgr.ToString()); + ImGui.Spacing(); + ImGui.Separator(); + ImGui.Spacing(); + #endregion + + #region Timers + if (!_config.DisableTimers) + { + ImGui.TextUnformatted($"GCD={_mgr.WorldState.Client.Cooldowns[ActionDefinitions.GCDGroup].Remaining:f3}, AnimLock={_amex.EffectiveAnimationLock:f3}+{_amex.AnimationLockDelayEstimate:f3}, Combo={_amex.ComboTimeLeft:f3}, RBIn={_mgr.Bossmods.RaidCooldowns.NextDamageBuffIn():f3}"); + ImGui.Spacing(); + ImGui.Separator(); + ImGui.Spacing(); + } + #endregion + + if (_config.EnableGCDs) + { + #region Next GCD + var isGCD = _mgr.Hints.ActionsToExecute.Entries.FirstOrDefault(a => a.Action.IsGCD); + if (isGCD.Action) + { + ImGui.TextUnformatted("Next GCD: "); + ImGui.SameLine(0f, 0f); + ImGui.TextColored(new Vector4(1.0f, 0.7f, 0.2f, 1f), isGCD.Action.Name()); + ImGui.SameLine(0f, 0f); + ImGui.TextUnformatted($" [{isGCD.Action.ID}] ({isGCD.Priority:F2}) @ ({isGCD.Target?.Name ?? ""})"); + } + else + { + ImGui.TextUnformatted("Next GCD: "); + } + #endregion + + #region Next OGCD + var isOGCD = _mgr.Hints.ActionsToExecute.Entries.FirstOrDefault(a => !a.Action.IsGCD); + if (isOGCD.Action) + { + ImGui.TextUnformatted("Next OGCD: "); + ImGui.SameLine(0f, 0f); + ImGui.TextColored(new Vector4(0.2f, 0.9f, 0.9f, 1f), isOGCD.Action.Name()); + ImGui.SameLine(0f, 0f); + ImGui.TextUnformatted($" [{isOGCD.Action.ID}] ({isOGCD.Priority:F2}) @ ({isOGCD.Target?.Name ?? ""})"); + } + else + { + ImGui.TextUnformatted("Next OGCD: "); + } + #endregion + + #region Last Action Used + var lastCast = _mgr.LastCast; + var action = lastCast.Data!.Action; + if (action) + { + ImGui.TextUnformatted("Last Action Used: "); + ImGui.SameLine(0f, 0f); + ImGui.TextColored(new Vector4(0.6f, 0.6f, 1.0f, 1f), action.Name()); + ImGui.SameLine(0f, 0f); + ImGui.TextUnformatted($" [{action.ID}]"); + } + else + { + ImGui.TextUnformatted("Last Action Used: "); + } + #endregion - ImGui.TextUnformatted($"GCD={_mgr.WorldState.Client.Cooldowns[ActionDefinitions.GCDGroup].Remaining:f3}, AnimLock={_amex.EffectiveAnimationLock:f3}+{_amex.AnimationLockDelayEstimate:f3}, Combo={_amex.ComboTimeLeft:f3}, RBIn={_mgr.Bossmods.RaidCooldowns.NextDamageBuffIn():f3}"); - foreach (var a in _mgr.Hints.ActionsToExecute.Entries) + ImGui.Spacing(); + ImGui.Separator(); + ImGui.Spacing(); + } + + #region Action Queue + ImGui.TextUnformatted("Actions in Queue:"); + + var queue = _mgr.Hints.ActionsToExecute.Entries; + if (queue == null || queue.Count == 0) + { + ImGui.TextUnformatted("> "); + } + else { - ImGui.TextUnformatted($"> {a.Action} ({a.Priority:f2}) @ ({a.Target?.Name ?? ""})"); + foreach (var e in queue) + { + if (_config.ShowGCDs) + { + ImGui.TextUnformatted("> ["); + ImGui.SameLine(0f, 0f); + ImGui.TextUnformatted(e.Action.CDType); + ImGui.SameLine(0f, 0f); + ImGui.TextUnformatted("] "); + ImGui.SameLine(0f, 0f); + } + if (!_config.ShowGCDs) + ImGui.TextUnformatted("> "); + ImGui.SameLine(0f, 0f); + ImGui.TextColored(new Vector4(1.0f, 0.843f, 0.0f, 1.0f), e.Action.Name()); + ImGui.SameLine(0f, 0f); + ImGui.TextUnformatted($" [{e.Action.ID}] ({e.Priority:F2}) @ ({e.Target?.Name ?? ""})"); + } } + #endregion } public override void OnClose() => SetVisible(false); - public static bool DrawRotationSelector(RotationModuleManager mgr) { var modified = false; if (mgr.Player == null) return modified; - + ImGui.AlignTextToFramePadding(); ImGui.TextUnformatted("Presets:"); - ImGui.SameLine(); using (ImRaii.PushColor(ImGuiCol.Button, 0xff000080, mgr.IsForceDisabled)) diff --git a/BossMod/Data/ActionID.cs b/BossMod/Data/ActionID.cs index 50f47b03c9..47b37ded37 100644 --- a/BossMod/Data/ActionID.cs +++ b/BossMod/Data/ActionID.cs @@ -66,6 +66,11 @@ public ActionID(ActionType type, uint id) : this(((uint)type << 24) | id) { } _ => 0 }; + public readonly bool CDGroupCheck() => Service.LuminaRow(ID)?.CooldownGroup == ActionDefinitions.GCDGroup + 1; + public readonly bool AdditionalCDGroupCheck() => Service.LuminaRow(ID)?.AdditionalCooldownGroup == ActionDefinitions.GCDGroup + 1; + public readonly bool IsGCD => CDGroupCheck() || AdditionalCDGroupCheck(); + public readonly string? CDType => IsGCD ? "GCD" : "OGCD"; + public readonly float CastTime() => Type switch { ActionType.Spell => (Service.LuminaRow(ID)?.Cast100ms ?? 0) * 0.1f,