Fix distance logic for gathering nodes
authorLiza Carvelli <liza@carvel.li>
Sun, 11 Aug 2024 19:22:19 +0000 (21:22 +0200)
committerLiza Carvelli <liza@carvel.li>
Sun, 11 Aug 2024 19:57:27 +0000 (21:57 +0200)
GatheringPathRenderer/RendererPlugin.cs
GatheringPathRenderer/Windows/EditorWindow.cs
GatheringPaths/4.x - Stormblood/The Ruby Sea/533_The Turquoise Trench_MIN.json
Questionable.Model/GatheringMath.cs

index 636100ad39c73e4619cf366745f5e4783a86dd59..a5cfe4b36c000e666f00891aa2a0e866cb092ff5 100644 (file)
@@ -219,8 +219,8 @@ public sealed class RendererPlugin : IDalamudPlugin
                                     refY = x.Position.Z,
                                     refZ = x.Position.Y,
                                     Filled = true,
-                                    radius = x.CalculateMinimumDistance(),
-                                    Donut = x.CalculateMaximumDistance() - x.CalculateMinimumDistance(),
+                                    radius = locationOverride?.MinimumDistance ?? x.CalculateMinimumDistance(),
+                                    Donut = (locationOverride?.MaximumDistance ?? x.CalculateMaximumDistance()) - (locationOverride?.MinimumDistance ?? x.CalculateMinimumDistance()),
                                     color = _colors[location.Root.Groups.IndexOf(group) % _colors.Count],
                                     Enabled = true,
                                     coneAngleMin = minimumAngle,
index 6d1f2958b631f5ca5c680f903d0686c8112cbc32..7541001f339fe7a98123cd0e815a7e5b90a5cf88 100644 (file)
@@ -89,7 +89,8 @@ internal sealed class EditorWindow : Window
             return;
         }
 
-        _target ??= _objectTable.Where(x => x.ObjectKind == ObjectKind.GatheringPoint && x.DataId == location.Node.DataId)
+        _target ??= _objectTable
+            .Where(x => x.ObjectKind == ObjectKind.GatheringPoint && x.DataId == location.Node.DataId)
             .Select(x => new
             {
                 Object = x,
@@ -129,18 +130,20 @@ internal sealed class EditorWindow : Window
             }
 
             int minAngle = locationOverride.MinimumAngle ?? location.MinimumAngle.GetValueOrDefault();
-            if (ImGui.DragInt("Min Angle", ref minAngle, 5, -360, 360))
+            int maxAngle = locationOverride.MaximumAngle ?? location.MaximumAngle.GetValueOrDefault();
+            if (ImGui.DragIntRange2("Angle", ref minAngle, ref maxAngle, 5, -360, 360))
             {
                 locationOverride.MinimumAngle = minAngle;
-                locationOverride.MaximumAngle ??= location.MaximumAngle.GetValueOrDefault();
+                locationOverride.MaximumAngle = maxAngle;
                 _plugin.Redraw();
             }
 
-            int maxAngle = locationOverride.MaximumAngle ?? location.MaximumAngle.GetValueOrDefault();
-            if (ImGui.DragInt("Max Angle", ref maxAngle, 5, -360, 360))
+            float minDistance = locationOverride.MinimumDistance ?? location.CalculateMinimumDistance();
+            float maxDistance = locationOverride.MaximumDistance ?? location.CalculateMaximumDistance();
+            if (ImGui.DragFloatRange2("Distance", ref minDistance, ref maxDistance, 0.1f, 1f, 3f))
             {
-                locationOverride.MinimumAngle ??= location.MinimumAngle.GetValueOrDefault();
-                locationOverride.MaximumAngle = maxAngle;
+                locationOverride.MinimumDistance = minDistance;
+                locationOverride.MaximumDistance = maxDistance;
                 _plugin.Redraw();
             }
 
@@ -150,8 +153,18 @@ internal sealed class EditorWindow : Window
                 ImGui.PushStyleColor(ImGuiCol.Button, ImGuiColors.DalamudRed);
             if (ImGui.Button("Save"))
             {
-                location.MinimumAngle = locationOverride.MinimumAngle;
-                location.MaximumAngle = locationOverride.MaximumAngle;
+                if (locationOverride is { MinimumAngle: not null, MaximumAngle: not null })
+                {
+                    location.MinimumAngle = locationOverride.MinimumAngle ?? location.MinimumAngle;
+                    location.MaximumAngle = locationOverride.MaximumAngle ?? location.MaximumAngle;
+                }
+
+                if (locationOverride is { MinimumDistance: not null, MaximumDistance: not null })
+                {
+                    location.MinimumDistance = locationOverride.MinimumDistance;
+                    location.MaximumDistance = locationOverride.MaximumDistance;
+                }
+
                 _plugin.Save(context.File, context.Root);
             }
 
@@ -243,6 +256,6 @@ internal sealed class LocationOverride
 
     public bool NeedsSave()
     {
-        return MinimumAngle != null && MaximumAngle != null;
+        return (MinimumAngle != null && MaximumAngle != null) || (MinimumDistance != null && MaximumDistance != null);
     }
 }
index 7134c24b5c8dd0925c5d74540c26fb844fda1d63..f886de4f87da682eee3d05ac8423832f6465e0b7 100644 (file)
@@ -7,6 +7,7 @@
     "[Kugane] Aetheryte Plaza",
     "[Kugane] The Ruby Price"
   ],
+  "FlyBetweenNodes": true,
   "Groups": [
     {
       "Nodes": [
                 "Y": 0.503479,
                 "Z": 634.821
               },
-              "MinimumAngle": 60,
-              "MaximumAngle": 150
+              "MinimumAngle": 45,
+              "MaximumAngle": 90,
+              "MinimumDistance": 1.6,
+              "MaximumDistance": 3
             },
             {
               "Position": {
       ]
     }
   ]
-}
+}
\ No newline at end of file
index 86fca78545036588237b430d37350080e59bd967..e7674a4941e273998769d7d3d074bae0d09c868b 100644 (file)
@@ -19,8 +19,9 @@ public static class GatheringMath
             degrees = Rng.Next(0, 360);
 
         float range = Rng.Next(
-            (int)(location.CalculateMinimumDistance() * 100),
-            (int)((location.CalculateMaximumDistance() - location.CalculateMinimumDistance()) * 100)) / 100f;
+                          (int)(location.CalculateMinimumDistance() * 100),
+                          (int)(location.CalculateMaximumDistance() * 100))
+                      / 100f;
         return (CalculateLandingLocation(location.Position, degrees, range), degrees, range);
     }