diff --git a/ActionTimelineEx/Configurations/DrawingSettings.cs b/ActionTimelineEx/Configurations/DrawingSettings.cs index 29f5f3a..70a5afe 100644 --- a/ActionTimelineEx/Configurations/DrawingSettings.cs +++ b/ActionTimelineEx/Configurations/DrawingSettings.cs @@ -18,7 +18,7 @@ public class DrawingSettings public float CenterOffset = 0; public int TimeOffsetSetting = 2; - public int TimeOffset => IsRotation ? 0 : TimeOffsetSetting; + public int TimeOffset => IsRotation ? -TimeOffsetSetting : TimeOffsetSetting; public int GCDIconSize = 40; public bool ShowOGCD = true; @@ -64,7 +64,7 @@ public class DrawingSettings public bool GridSubdivideSeconds = true; public int GridSubdivisionCount = 2; public float GridLineWidth = 1; - public float GridCenterLineWidth = 0.1f; + public float GridCenterLineWidth = 1f; public float GridStartLineWidth = 3; public float GridSubdivisionLineWidth = 1; public Vector4 GridLineColor = new Vector4(0.3f, 0.3f, 0.3f, 1f); diff --git a/ActionTimelineEx/Configurations/Settings.cs b/ActionTimelineEx/Configurations/Settings.cs index 5e96cc6..42f8275 100644 --- a/ActionTimelineEx/Configurations/Settings.cs +++ b/ActionTimelineEx/Configurations/Settings.cs @@ -10,7 +10,7 @@ public class Settings : IPluginConfiguration public bool ShowTimelineOnlyInDuty = false; public bool ShowTimelineOnlyInCombat = false; //public float StatusCheckDelay = 0.1f; - public List TimelineSettings = new() { new DrawingSettings() }; + public List TimelineSettings = new(); public HashSet HideStatusIds = new HashSet(); public bool PrintClipping = false; public int PrintClippingMin = 150; diff --git a/ActionTimelineEx/Plugin.cs b/ActionTimelineEx/Plugin.cs index df147e5..048ae4f 100644 --- a/ActionTimelineEx/Plugin.cs +++ b/ActionTimelineEx/Plugin.cs @@ -3,6 +3,7 @@ using ActionTimeline.Windows; using Dalamud.Game.ClientState.Conditions; using Dalamud.Interface.Windowing; +using Dalamud.Logging; using Dalamud.Plugin; using ECommons; using ECommons.Commands; @@ -138,21 +139,11 @@ private void Draw() if (!ShowTimeline()) return; - ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, new Vector2(0, 0)); - ImGui.PushStyleVar(ImGuiStyleVar.WindowBorderSize, 0); - - HashSet showedName = new HashSet(); + int index = 0; foreach (var setting in Settings.TimelineSettings) { - if (showedName.Contains(setting.Name)) continue; - - TimelineWindow.Draw(setting); - - showedName.Add(setting.Name); + TimelineWindow.Draw(setting, index++); } - - ImGui.PopStyleColor(); - ImGui.PopStyleVar(2); } private bool ShowTimeline() diff --git a/ActionTimelineEx/Timeline/TimelineManager.cs b/ActionTimelineEx/Timeline/TimelineManager.cs index 290b5eb..29d7a83 100644 --- a/ActionTimelineEx/Timeline/TimelineManager.cs +++ b/ActionTimelineEx/Timeline/TimelineManager.cs @@ -81,7 +81,7 @@ protected void Dispose(bool disposing) public static SortedSet ShowedStatusId { get; } = new SortedSet(); public DateTime EndTime { get; private set; } = DateTime.Now; - private static int kMaxItemCount = 128; + private static int kMaxItemCount = 2048; private readonly Queue _items = new Queue(kMaxItemCount); private TimelineItem? _lastItem = null; @@ -109,7 +109,7 @@ public List GetItems(DateTime time, out DateTime lastEndTime) return GetItems(_items, time, out lastEndTime); } - private static int kMaxStatusCount = 16; + private static int kMaxStatusCount = 256; private readonly Queue _statusItems = new Queue(kMaxStatusCount); private void AddItem(StatusLineItem item) { @@ -156,7 +156,6 @@ public unsafe float GCD private static TimelineItemType GetActionType(uint actionId, ActionType type) { - switch (type) { case ActionType.Spell: @@ -316,46 +315,6 @@ private void ActionFromSelf(ActionEffectSet set) UpdateEndTime(effectItem.EndTime); - - //int statusDelay = 0; - //if (Plugin.Settings.StatusCheckDelay is > 0 and < 0.5f) - //{ - // statusDelay = (int)(Plugin.Settings.StatusCheckDelay * 1000); - // var previousStatus = Player.Object.StatusList - // .Where(s => s.SourceId == Player.Object.ObjectId && (s.RemainingTime > Plugin.Settings.StatusCheckDelay || s.RemainingTime <= 0)) - // .Select(s => (s.StatusId, s.StackCount)) - // .ToArray(); - - // await Task.Delay(statusDelay); - - // var nowStatus = Player.Object.StatusList - // .Where(s => s.SourceId == Player.Object.ObjectId) - // .Select(s => (s.StatusId, s.StackCount)) - // .ToArray(); - - // foreach (var pre in previousStatus) - // { - // var status = Svc.Data.GetExcelSheet()?.GetRow(pre.StatusId); - // if (status == null) continue; - // var now = nowStatus.FirstOrDefault(i => i.StatusId == pre.StatusId); - // if (now.StatusId == 0 || now.StackCount < pre.StackCount) - // { - // effectItem?.StatusLoseIcon.Add(status.Icon + (uint)Math.Max(0, pre.StackCount - 1)); - // } - // } - - // foreach (var now in nowStatus) - // { - // var status = Svc.Data.GetExcelSheet()?.GetRow(now.StatusId); - // if (status == null) continue; - // var pre = previousStatus.FirstOrDefault(i => i.StatusId == now.StatusId); - // if (pre.StatusId == 0) - // { - // effectItem?.StatusGainIcon.Add(status.Icon + (uint)Math.Max(0, now.StackCount - 1)); - // } - // } - //} - AddStatusLine(effectItem, set.TargetEffects[0].TargetID); } @@ -413,12 +372,12 @@ private async void OnActorControl(uint entityId, ActorControlCategory type, uint _onActorControlHook?.Original(entityId, type, buffID, direct, actionId, sourceId, arg4, arg5, targetId, a10); -//#if DEBUG -// if (buffID == 122) -// { -// Svc.Chat.Print($"Type: {type}, Buff: {buffID}, Direct: {direct}, Action: {actionId}, Source: {sourceId}, Arg4: {arg4}, Arg5: {arg5}, Target: {targetId}, a10: {a10}"); -// } -//#endif + //#if DEBUG + // if (buffID == 122) + // { + // Svc.Chat.Print($"Type: {type}, Buff: {buffID}, Direct: {direct}, Action: {actionId}, Source: {sourceId}, Arg4: {arg4}, Arg5: {arg5}, Target: {targetId}, a10: {a10}"); + // } + //#endif if (entityId != Player.Object?.ObjectId) return; diff --git a/ActionTimelineEx/Windows/SettingsWindow.cs b/ActionTimelineEx/Windows/SettingsWindow.cs index 2c8547c..1865675 100644 --- a/ActionTimelineEx/Windows/SettingsWindow.cs +++ b/ActionTimelineEx/Windows/SettingsWindow.cs @@ -45,14 +45,18 @@ public override void Draw() int index = 0; DrawingSettings? removingSetting = null; + if (!Settings.TimelineSettings.Any()) Settings.TimelineSettings.Add(new DrawingSettings()); + foreach (var setting in Settings.TimelineSettings) { var duplicated = showedName.Contains(setting.Name); - if (duplicated) ImGui.PushStyleColor(ImGuiCol.Text, ImGui.ColorConvertFloat4ToU32(ImGuiColors.DalamudRed)); + if (duplicated) ImGui.PushStyleColor(ImGuiCol.Text, ImGui.ColorConvertFloat4ToU32(ImGuiColors.DPSRed)); + + var showTab = ImGui.BeginTabItem($"TL:{index}"); + if (duplicated) ImGui.PopStyleColor(); - if (ImGui.BeginTabItem($"TL:{setting.Name}")) + if (showTab) { - if(duplicated) ImGui.PopStyleColor(); if (DrawTimelineSetting(setting)) { removingSetting = setting; @@ -114,7 +118,7 @@ private void DrawHelp() private ushort _aboutAdd = 0; private void DrawGeneralSetting() { - if(ImGui.Button("Add One Timeline")) + if (ImGui.Button("Add One Timeline")) { Settings.TimelineSettings.Add(new DrawingSettings() { @@ -284,7 +288,7 @@ private bool RemoveValue(string name) if (isLast) ImGui.PushStyleColor(ImGuiCol.Text, isTime ? ImGuiColors.HealerGreen : ImGuiColors.DPSRed); ImGui.PushFont(UiBuilder.IconFont); - if (ImGui.Button($"{(isLast ? FontAwesomeIcon.Check : FontAwesomeIcon.Undo).ToIconString()}##Remove{name}")) + if (ImGui.Button($"{(isLast ? FontAwesomeIcon.Check : FontAwesomeIcon.Ban).ToIconString()}##Remove{name}")) { if (isLast && isTime) { diff --git a/ActionTimelineEx/Windows/TimelineWindow.cs b/ActionTimelineEx/Windows/TimelineWindow.cs index 356fecd..df55b8e 100644 --- a/ActionTimelineEx/Windows/TimelineWindow.cs +++ b/ActionTimelineEx/Windows/TimelineWindow.cs @@ -15,7 +15,7 @@ internal static class TimelineWindow | ImGuiWindowFlags.NoNav | ImGuiWindowFlags.NoScrollWithMouse; - public static void Draw(DrawingSettings setting) + public static void Draw(DrawingSettings setting, int index) { if (!setting.Enable || string.IsNullOrEmpty(setting.Name)) return; @@ -31,12 +31,17 @@ public static void Draw(DrawingSettings setting) ImGui.SetNextWindowSize(new Vector2(560, 100) * ImGuiHelpers.GlobalScale, ImGuiCond.FirstUseEver); ImGui.SetNextWindowPos(new Vector2(200, 200) * ImGuiHelpers.GlobalScale, ImGuiCond.FirstUseEver); - if (ImGui.Begin($"Timeline: {setting.Name}", flag)) + ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, new Vector2(0, 0)); + ImGui.PushStyleVar(ImGuiStyleVar.WindowBorderSize, 0); + + if (ImGui.Begin($"Timeline: {index}", flag)) { DrawContent(setting); ImGui.End(); } + ImGui.PopStyleVar(2); + ImGui.PopStyleColor(); } @@ -52,7 +57,7 @@ private static void DrawContent(DrawingSettings setting) var pos = ImGui.GetWindowPos(); var size = ImGui.GetWindowSize(); - var now = setting.IsRotation ? (TimelineManager.Instance?.EndTime ?? DateTime.Now - TimeSpan.FromSeconds(setting.TimeOffsetSetting)) : DateTime.Now; + var now = setting.IsRotation ? (TimelineManager.Instance?.EndTime ?? DateTime.Now - TimeSpan.FromSeconds(setting.TimeOffset)) : DateTime.Now; var endTime = now - TimeSpan.FromSeconds(size.X / setting.SizePerSecond - setting.TimeOffset); @@ -115,10 +120,14 @@ private static void DrawContent(DrawingSettings setting) } } - uint lineColor = ImGui.ColorConvertFloat4ToU32(setting.GridStartLineColor); + if (!setting.IsRotation) + { + uint lineColor = ImGui.ColorConvertFloat4ToU32(setting.GridStartLineColor); - var x = pos.X + size.X - setting.TimeOffset * setting.SizePerSecond; - ImGui.GetWindowDrawList().AddLine(new Vector2(x, pos.Y), new Vector2(x, pos.Y + size.Y), lineColor, setting.GridStartLineWidth); + var x = pos.X + size.X - setting.TimeOffset * setting.SizePerSecond; + + ImGui.GetWindowDrawList().AddLine(new Vector2(x, pos.Y), new Vector2(x, pos.Y + size.Y), lineColor, setting.GridStartLineWidth); + } if (!setting.Locked) ImGui.Text(setting.Name); } @@ -153,11 +162,12 @@ private static void DrawGrid(Vector2 pos, Vector2 size, DrawingSettings setting) } var time = -i + setting.TimeOffset; - if (time != 0) + if (time != 0 || setting.IsRotation) { drawList.AddLine(new Vector2(start, pos.Y), new Vector2(start, pos.Y + height), lineColor, setting.GridLineWidth); } + if (setting.IsRotation) time -= setting.TimeOffsetSetting; if (setting.GridShowSecondsText) { drawList.AddText(new Vector2(start + 2, pos.Y), lineColor, $" {time}s");