From 37ce88eee787dbbe7fd64c0fe3b3d5379c104597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E6=B0=B4?= <53346444+ArchiDog1998@users.noreply.github.com> Date: Thu, 29 Feb 2024 20:57:51 +0800 Subject: [PATCH] fix: fixed timeline. --- Resources/RotationSolverRecord.json | 4 +-- RotationSolver.Basic/Data/TimelineItem.cs | 9 +++-- RotationSolver/Commands/RSCommands_Actions.cs | 4 +-- RotationSolver/Data/UiString.cs | 3 ++ RotationSolver/Localization/Localization.json | 3 +- RotationSolver/UI/RotationConfigWindow.cs | 10 ++++++ RotationSolver/Updaters/ActionUpdater.cs | 1 + RotationSolver/Updaters/RaidTimeUpdater.cs | 8 ++++- RotationSolver/Updaters/TargetUpdater.cs | 1 + RotationSolver/Watcher.cs | 35 +++++++++++++------ 10 files changed, 59 insertions(+), 19 deletions(-) diff --git a/Resources/RotationSolverRecord.json b/Resources/RotationSolverRecord.json index 3385711b8..5d149e2e5 100644 --- a/Resources/RotationSolverRecord.json +++ b/Resources/RotationSolverRecord.json @@ -1,5 +1,5 @@ { - "ClickingCount": 88321, - "SayingHelloCount": 103, + "ClickingCount": 88632, + "SayingHelloCount": 112, "SaidUsers": [] } \ No newline at end of file diff --git a/RotationSolver.Basic/Data/TimelineItem.cs b/RotationSolver.Basic/Data/TimelineItem.cs index a941fc3b9..375dc439e 100644 --- a/RotationSolver.Basic/Data/TimelineItem.cs +++ b/RotationSolver.Basic/Data/TimelineItem.cs @@ -108,13 +108,18 @@ public void UpdateRaidTimeOffset() { if (Name == "--Reset--") { - DataCenter.RaidTimeRaw = -1; +#if DEBUG Svc.Log.Debug($"Reset the {nameof(DataCenter.RaidTimeRaw)}."); +#endif + DataCenter.RaidTimeRaw = -1; } else { +#if DEBUG + var timeOffset = Time - DataCenter.RaidTimeRaw; + Svc.Log.Debug($"Set the {nameof(DataCenter.RaidTimeRaw)} to {Time}, added {timeOffset}s"); +#endif DataCenter.RaidTimeRaw = Time; - Svc.Log.Debug($"Reset the {nameof(DataCenter.RaidTimeRaw)} to {DataCenter.RaidTimeRaw}."); } } diff --git a/RotationSolver/Commands/RSCommands_Actions.cs b/RotationSolver/Commands/RSCommands_Actions.cs index f99ed22ec..87ef5b290 100644 --- a/RotationSolver/Commands/RSCommands_Actions.cs +++ b/RotationSolver/Commands/RSCommands_Actions.cs @@ -67,8 +67,8 @@ public static void DoAction() } #if DEBUG - if (nextAction is BaseAction acti) - Svc.Log.Debug($"Will Do {acti}"); + //if (nextAction is BaseAction acti) + // Svc.Log.Debug($"Will Do {acti}"); #endif if (Service.Config.KeyBoardNoise) diff --git a/RotationSolver/Data/UiString.cs b/RotationSolver/Data/UiString.cs index d6534c457..6865fcf38 100644 --- a/RotationSolver/Data/UiString.cs +++ b/RotationSolver/Data/UiString.cs @@ -219,6 +219,9 @@ internal enum UiString [Description("From Clipboard")] ActionSequencer_FromClipboard, + [Description("Open the timeline link.")] + Timeline_OpenLink, + [Description("Add Status")] ConfigWindow_List_AddStatus, diff --git a/RotationSolver/Localization/Localization.json b/RotationSolver/Localization/Localization.json index 9f91acd64..d443e5431 100644 --- a/RotationSolver/Localization/Localization.json +++ b/RotationSolver/Localization/Localization.json @@ -339,5 +339,6 @@ "RotationSolver.Basic.Data.AutoStatus.Burst": "Burst", "RotationSolver.Basic.Data.AutoStatus.Speed": "Speed", "RotationSolver.Basic.Data.AutoStatus.LimitBreak": "LimitBreak", - "RotationSolver.Data.UiString.ConfigWindow_Condition_DutyName": "Duty Name" + "RotationSolver.Data.UiString.ConfigWindow_Condition_DutyName": "Duty Name", + "RotationSolver.Data.UiString.Timeline_OpenLink": "Open the timeline link." } \ No newline at end of file diff --git a/RotationSolver/UI/RotationConfigWindow.cs b/RotationSolver/UI/RotationConfigWindow.cs index 2c49c8b8d..f37a6d7b7 100644 --- a/RotationSolver/UI/RotationConfigWindow.cs +++ b/RotationSolver/UI/RotationConfigWindow.cs @@ -714,6 +714,16 @@ static string GetName(TerritoryType? territory) } } + var link = RaidTimeUpdater.GetLink(_territoryId); + if (!string.IsNullOrEmpty(link)) + { + ImGui.SameLine(); + if (ImGui.Button(UiString.Timeline_OpenLink.Local())) + { + Util.OpenLink(link); + } + } + _timelineGroup.ClearCollapsingHeader(); foreach (var item in RaidTimeUpdater.GetRaidTime((ushort)_territoryId)) diff --git a/RotationSolver/Updaters/ActionUpdater.cs b/RotationSolver/Updaters/ActionUpdater.cs index 0757dec40..4d770c49f 100644 --- a/RotationSolver/Updaters/ActionUpdater.cs +++ b/RotationSolver/Updaters/ActionUpdater.cs @@ -152,6 +152,7 @@ private static void UpdateCombatTime() { foreach (var item in DataCenter.TimelineItems) { + if (item.IsShown) continue; if (item.Time < DataCenter.RaidTimeRaw) continue; if (item.Type is not TimelineType.InCombat) continue; diff --git a/RotationSolver/Updaters/RaidTimeUpdater.cs b/RotationSolver/Updaters/RaidTimeUpdater.cs index b715690fc..36f3faa6b 100644 --- a/RotationSolver/Updaters/RaidTimeUpdater.cs +++ b/RotationSolver/Updaters/RaidTimeUpdater.cs @@ -12,6 +12,12 @@ internal static partial class RaidTimeUpdater private static readonly Dictionary _savedTimeLines = []; private static readonly Queue<(DateTime, ActionTimelineItem)> _addedItems = new(); + public static string GetLink(uint id) + { + if (!PathForRaids.TryGetValue(id, out var path)) return string.Empty; + return "https://github.com/xpdota/event-trigger/tree/master/timelines/src/main/resources/timeline/" + path; + } + internal static void UpdateTimeline() { if (!Service.Config.Timeline.TryGetValue(Svc.ClientState.TerritoryType, out var timeline)) return; @@ -219,7 +225,7 @@ static async Task DownloadRaidTimeAsync(string path, RaidLangs l Svc.Log.Debug(item.ToString()); } #endif - return [..result]; + return [..result.OrderBy(i => i.Time)]; } [GeneratedRegex(" .*? {")] diff --git a/RotationSolver/Updaters/TargetUpdater.cs b/RotationSolver/Updaters/TargetUpdater.cs index a2f69c1c1..e792f1732 100644 --- a/RotationSolver/Updaters/TargetUpdater.cs +++ b/RotationSolver/Updaters/TargetUpdater.cs @@ -39,6 +39,7 @@ private static void UpdateCastingRefine(IEnumerable allTargets) foreach (var item in DataCenter.TimelineItems) { + if (item.IsShown) continue; if (item.Time < DataCenter.RaidTimeRaw) continue; if (item.Type is not TimelineType.StartsUsing) continue; if (!item.IsIdMatched(b.CastActionId)) continue; diff --git a/RotationSolver/Watcher.cs b/RotationSolver/Watcher.cs index 486b5f1ce..4252b2ce4 100644 --- a/RotationSolver/Watcher.cs +++ b/RotationSolver/Watcher.cs @@ -8,6 +8,7 @@ using FFXIVClientStructs.FFXIV.Client.Game; using Lumina.Excel.GeneratedSheets; using RotationSolver.Basic.Configuration; +using System.Runtime.InteropServices; using System.Text.RegularExpressions; using GameObject = FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject; @@ -74,6 +75,7 @@ private static void Chat_ChatMessage(Dalamud.Game.Text.XivChatType type, uint se #endif foreach (var item in DataCenter.TimelineItems) { + if (item.IsShown) continue; if (item.Time < DataCenter.RaidTimeRaw) continue; if (item.Type is not TimelineType.GameLog) continue; @@ -103,6 +105,26 @@ private static void GameNetwork_NetworkMessage(nint dataPtr, ushort opCode, uint case OpCode.ActorControl: OnActorControl(dataPtr); break; + + case OpCode.Effect: + OnEffect(dataPtr, targetActorId); + break; + } + } + + private static void OnEffect(IntPtr dataPtr, uint targetActorId) + { + var name = Svc.Objects.SearchById(targetActorId)?.Name.TextValue ?? string.Empty; + foreach (var item in DataCenter.TimelineItems) + { + if (item.Time < DataCenter.RaidTimeRaw) continue; + if (item.Type is not TimelineType.Ability) continue; + + if (!item.IsIdMatched(ReadUint(dataPtr, 28))) continue; + if (!new Regex(item["source"]).IsMatch(name) && item.IsShown) continue; //Maybe this is not correct. + + item.UpdateRaidTimeOffset(); + break; } } @@ -110,6 +132,7 @@ private static void OnActorControl(IntPtr dataPtr) { foreach (var item in DataCenter.TimelineItems) { + if (item.IsShown) continue; if (item.Time < DataCenter.RaidTimeRaw) continue; if (item.Type is not TimelineType.ActorControl) continue; @@ -167,6 +190,7 @@ private static void OnSystemLogMessage(IntPtr dataPtr) { foreach (var item in DataCenter.TimelineItems) { + if (item.IsShown) continue; if (item.Time < DataCenter.RaidTimeRaw) continue; if (item.Type is not TimelineType.SystemLogMessage) continue; if (!item.IsIdMatched(ReadUint(dataPtr, 4))) continue; @@ -303,17 +327,6 @@ private static void UpdateRTTDetour(dynamic obj) private static void ActionFromEnemy(ActionEffectSet set) { - foreach (var item in DataCenter.TimelineItems) - { - if (item.Time < DataCenter.RaidTimeRaw) continue; - if (item.Type is not TimelineType.Ability) continue; - if (!item.IsIdMatched(set.Action?.RowId ?? 0)) continue; - //if (!new Regex(item["source"]).IsMatch(set.Source?.Name.TextValue ?? string.Empty)) continue; - - item.UpdateRaidTimeOffset(); - break; - } - //Check Source. var source = set.Source; if (source == null) return;