From a8553ae2bf24e4d4daba15f319847c8056350a62 Mon Sep 17 00:00:00 2001 From: D4VID Date: Sun, 9 Mar 2025 20:17:59 +0100 Subject: [PATCH] Highlight previous and next nodes of a selected node --- .../FancyInput/TriggerMetadata.jecs | 6 ++++ .../languages/English/English_input.jecs | 6 ++++ .../CriticalPathAnalyzer/manifest.jecs | 2 +- .../client/CriticalPathAnalyzerGameState.cs | 3 ++ .../CriticalPathAnalyzerTrigger.cs | 1 + .../client/tool/CriticalPathAnalyzerTool.cs | 32 ++++++++++++++++++ .../src/client/tool/PathHighlighter.cs | 33 +++++++++++++++---- 7 files changed, 76 insertions(+), 7 deletions(-) diff --git a/CriticalPathAnalyzer/CriticalPathAnalyzer/FancyInput/TriggerMetadata.jecs b/CriticalPathAnalyzer/CriticalPathAnalyzer/FancyInput/TriggerMetadata.jecs index 18e78b9..ed08fbb 100644 --- a/CriticalPathAnalyzer/CriticalPathAnalyzer/FancyInput/TriggerMetadata.jecs +++ b/CriticalPathAnalyzer/CriticalPathAnalyzer/FancyInput/TriggerMetadata.jecs @@ -16,3 +16,9 @@ CriticalPathAnalyzer.AnalyzePathEnd: DefaultBinding: Options: - O + +CriticalPathAnalyzer.SelectNode: + Heading: "CriticalPathAnalyzer" + DefaultBinding: + Options: + - T diff --git a/CriticalPathAnalyzer/CriticalPathAnalyzer/languages/English/English_input.jecs b/CriticalPathAnalyzer/CriticalPathAnalyzer/languages/English/English_input.jecs index bcd1c59..f2ea351 100644 --- a/CriticalPathAnalyzer/CriticalPathAnalyzer/languages/English/English_input.jecs +++ b/CriticalPathAnalyzer/CriticalPathAnalyzer/languages/English/English_input.jecs @@ -14,3 +14,9 @@ FancyInput.Trigger.CriticalPathAnalyzer.AnalyzePathEnd: "Select end of path" FancyInput.Trigger.CriticalPathAnalyzer.AnalyzePathEnd.Description: """ Press to select the end of the path to be analyzed. """ + +FancyInput.Trigger.CriticalPathAnalyzer.SelectNode: "Select node to be analyzed" +FancyInput.Trigger.CriticalPathAnalyzer.SelectNode.Description: """ + Press to select a node to be analyzed. + Can only be used after obtaining circuit data from the server by analyzing a path. + """ diff --git a/CriticalPathAnalyzer/CriticalPathAnalyzer/manifest.jecs b/CriticalPathAnalyzer/CriticalPathAnalyzer/manifest.jecs index fda759a..c59f682 100644 --- a/CriticalPathAnalyzer/CriticalPathAnalyzer/manifest.jecs +++ b/CriticalPathAnalyzer/CriticalPathAnalyzer/manifest.jecs @@ -1,7 +1,7 @@ ID: CriticalPathAnalyzer Name: CriticalPathAnalyzer Author: D4VID -Version: 0.2.0 +Version: 0.2.1 Priority: 0 Dependencies: - HarmonyForLogicWorld diff --git a/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/CriticalPathAnalyzerGameState.cs b/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/CriticalPathAnalyzerGameState.cs index a00838f..2e5d53c 100644 --- a/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/CriticalPathAnalyzerGameState.cs +++ b/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/CriticalPathAnalyzerGameState.cs @@ -24,6 +24,7 @@ namespace CriticalPathAnalyzer.Client { UITrigger.Back, CriticalPathAnalyzerTrigger.AnalyzePathStart, CriticalPathAnalyzerTrigger.AnalyzePathEnd, + CriticalPathAnalyzerTrigger.SelectNode, }; /// @@ -43,6 +44,8 @@ namespace CriticalPathAnalyzer.Client { CriticalPathAnalyzerTool.SelectPathStart(); } else if (CustomInput.DownThisFrame(CriticalPathAnalyzerTrigger.AnalyzePathEnd)) { CriticalPathAnalyzerTool.SelectPathEnd(); + } else if (CustomInput.DownThisFrame(CriticalPathAnalyzerTrigger.SelectNode)) { + CriticalPathAnalyzerTool.SelectNodeToAnalyze(); } } diff --git a/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/keybindings/CriticalPathAnalyzerTrigger.cs b/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/keybindings/CriticalPathAnalyzerTrigger.cs index 8c652e5..675f03e 100644 --- a/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/keybindings/CriticalPathAnalyzerTrigger.cs +++ b/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/keybindings/CriticalPathAnalyzerTrigger.cs @@ -5,5 +5,6 @@ namespace CriticalPathAnalyzer.Client.Keybindings { OpenPathAnalyzer, AnalyzePathStart, AnalyzePathEnd, + SelectNode, } } \ No newline at end of file diff --git a/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/tool/CriticalPathAnalyzerTool.cs b/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/tool/CriticalPathAnalyzerTool.cs index d382861..b453eee 100644 --- a/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/tool/CriticalPathAnalyzerTool.cs +++ b/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/tool/CriticalPathAnalyzerTool.cs @@ -18,12 +18,14 @@ namespace CriticalPathAnalyzer.Client.Tool { private static Guid _currentRequestGuid = Guid.NewGuid(); private static AnalyzePathResponse _response; + private static Node _selectedNode; private static readonly OutlineData StartOutline = new OutlineData(new Color24(0x00ff00)); private static readonly OutlineData EndOutline = new OutlineData(new Color24(0x00aaff)); public static void Init(ILogicLogger logger) { _logger = logger; + PathHighlighter.Init(logger); } /// @@ -80,6 +82,35 @@ namespace CriticalPathAnalyzer.Client.Tool { } } } + + /// + /// Try to select the start of the path. + /// + public static void SelectNodeToAnalyze() { + if (_response == null) { + _logger.Info("No circuit data"); + // Cannot do anything without data + return; + } + + PegAddress pegAddress = RayCastPeg(); + if (!pegAddress.IsEmpty()) { + Node node = _response.Nodes.Find(n => n.Pegs.Contains(pegAddress)); + if (node != null) { + PathHighlighter.RemoveHighlighting(); + _logger.Info("Highlighting selected node"); + PathHighlighter.HighlightAnalyzedNode(node); + _selectedNode = node; + } else { + _logger.Info("Peg not found in circuit data"); + } + } else { + // Deselect + _logger.Info("Didn't hit anything"); + PathHighlighter.RemoveHighlighting(); + _selectedNode = null; + } + } /// /// Try to select the end of the path. @@ -129,6 +160,7 @@ namespace CriticalPathAnalyzer.Client.Tool { _response = response; PathHighlighter.RemoveHighlighting(); + PathHighlighter.SetNodes(_response.Nodes); if (_response.LoopingNodes.Count > 0) { PathHighlighter.HighlightClusterNodes(_response.LoopingNodes); diff --git a/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/tool/PathHighlighter.cs b/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/tool/PathHighlighter.cs index 2785db2..db52bdd 100644 --- a/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/tool/PathHighlighter.cs +++ b/CriticalPathAnalyzer/CriticalPathAnalyzer/src/client/tool/PathHighlighter.cs @@ -4,29 +4,51 @@ using CriticalPathAnalyzer.Shared.Packets.S2C; using JimmysUnityUtilities; using LogicAPI.Data; using LogicAPI.Services; +using LogicLog; using LogicWorld.Interfaces; using LogicWorld.Outlines; namespace CriticalPathAnalyzer.Client.Tool { public class PathHighlighter { + private static ILogicLogger _logger; + private static List _nodes = new List(); private static List _highlightedWires = new List(); + + public static void Init(ILogicLogger logger) { + _logger = logger; + } + + public static void SetNodes(List nodes) { + _nodes = nodes; + } public static void HighlightClusterNodes(List nodes) { - _nodes = nodes; + foreach (Node node in nodes) { + HighlightNode(node, HsvToRgb(node.Time * 20, 1.0f, 1.0f)); + } + } - foreach (Node node in _nodes) { - HighlightNode(node); + public static void HighlightAnalyzedNode(Node node) { + _logger.Info($"Selected node: {node}"); + HighlightNode(node, 0x00ff00); + foreach (int prevNodeIndex in node.PrevNodeIndexes) { + _logger.Info($"Highlighting prev node index {prevNodeIndex}"); + HighlightNode(_nodes[prevNodeIndex], 0xff0000); + } + foreach ((int nextNodeIndex, int delay) in node.NextNodes) { + _logger.Info($"Highlighting next node index {nextNodeIndex}"); + HighlightNode(_nodes[nextNodeIndex], 0x0000ff); } } /// /// Highlight all pegs and wires of the given cluster. /// - private static void HighlightNode(Node node) { + private static void HighlightNode(Node node, int color) { IWorldData world = Instances.MainWorld.Data; - var outline = new OutlineData(new Color24(HsvToRgb(node.Time * 20, 1.0f, 1.0f))); + var outline = new OutlineData(new Color24(color)); foreach (ComponentAddress address in node.ConnectingComponents) { if (!world.Contains(address)) { @@ -76,7 +98,6 @@ namespace CriticalPathAnalyzer.Client.Tool { Outliner.RemoveOutline(wireAddress); } - _nodes = null; _highlightedWires.Clear(); }