From d9b3ba0c5813e1b602cedd5caebfed4eee939ced Mon Sep 17 00:00:00 2001 From: ARTARNA Date: Fri, 12 Dec 2025 12:16:15 +0000 Subject: [PATCH 1/3] fix: update LuffOverlay to support SailHighlightMode --- .../features/facilities/LuffOverlay.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/duckblade/osrs/sailing/features/facilities/LuffOverlay.java b/src/main/java/com/duckblade/osrs/sailing/features/facilities/LuffOverlay.java index bf300a64..b7bd7172 100644 --- a/src/main/java/com/duckblade/osrs/sailing/features/facilities/LuffOverlay.java +++ b/src/main/java/com/duckblade/osrs/sailing/features/facilities/LuffOverlay.java @@ -18,58 +18,64 @@ import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.outline.ModelOutlineRenderer; @Slf4j @Singleton -public class LuffOverlay - extends Overlay - implements PluginLifecycleComponent -{ +public class LuffOverlay extends Overlay implements PluginLifecycleComponent { private final Client client; private final SailingConfig config; private final BoatTracker boatTracker; + private final ModelOutlineRenderer modelOutlineRenderer; @Inject - public LuffOverlay(Client client, SailingConfig config, BoatTracker boatTracker) - { + public LuffOverlay( + Client client, + SailingConfig config, + BoatTracker boatTracker, + ModelOutlineRenderer modelOutlineRenderer + ) { this.client = client; this.config = config; this.boatTracker = boatTracker; + this.modelOutlineRenderer = modelOutlineRenderer; setLayer(OverlayLayer.ABOVE_SCENE); setPosition(OverlayPosition.DYNAMIC); } @Override - public boolean isEnabled(SailingConfig config) - { + public boolean isEnabled(SailingConfig config) { return config.highlightTrimmableSails(); } @Override - public Dimension render(Graphics2D g) - { - if (!SailingUtil.isSailing(client) || !config.highlightTrimmableSails()) - { + public Dimension render(Graphics2D g) { + if (!SailingUtil.isSailing(client) || !config.highlightTrimmableSails()) { return null; } Boat boat = boatTracker.getBoat(); GameObject sail = boat != null ? boat.getSail() : null; - if (sail == null) - { + + if (sail == null) { return null; } - if (!sail.isOpShown(0)) - { + // Core behaviour: only show when the luff action is actually available + if (!sail.isOpShown(0)) { return null; } - Shape convexHull = sail.getConvexHull(); - if (convexHull != null) - { - OverlayUtil.renderPolygon(g, convexHull, Color.green); + SailingConfig.SailHighlightMode mode = config.sailHighlightMode(); + + if (mode == SailingConfig.SailHighlightMode.AREA) { + Shape hull = sail.getConvexHull(); + if (hull != null) { + OverlayUtil.renderPolygon(g, hull, Color.GREEN); + } + } else if (mode == SailingConfig.SailHighlightMode.SAIL) { + modelOutlineRenderer.drawOutline(sail, 2, Color.GREEN, 250); } return null; From 4f2f6d20903571454c14548f91ca8faf451c91d2 Mon Sep 17 00:00:00 2001 From: ARTARNA Date: Fri, 12 Dec 2025 12:18:21 +0000 Subject: [PATCH 2/3] add config --- .../duckblade/osrs/sailing/SailingConfig.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/com/duckblade/osrs/sailing/SailingConfig.java b/src/main/java/com/duckblade/osrs/sailing/SailingConfig.java index d47a9ebb..e919c7a3 100644 --- a/src/main/java/com/duckblade/osrs/sailing/SailingConfig.java +++ b/src/main/java/com/duckblade/osrs/sailing/SailingConfig.java @@ -355,6 +355,25 @@ default Color highlightCrystalExtractorInactiveColour() return Color.YELLOW; } + enum SailHighlightMode + { + AREA, + SAIL, + ; + } + + @ConfigItem( + keyName = "sailHighlightMode", + name = "Highlight Sails Mode", + description = "How to highlight trimmable sails. Area highlights the full clickable area, Sail highlights the sail outline.", + section = SECTION_FACILITIES, + position = 8 + ) + default SailHighlightMode sailHighlightMode() + { + return SailHighlightMode.AREA; + } + enum CrewmateMuteMode { NONE, From 01c7b0b1e27d2487fd08e9ee6ccb9ee80b5f1673 Mon Sep 17 00:00:00 2001 From: ARTARNA Date: Fri, 12 Dec 2025 12:21:30 +0000 Subject: [PATCH 3/3] checkstyle stuff --- .../features/facilities/LuffOverlay.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/duckblade/osrs/sailing/features/facilities/LuffOverlay.java b/src/main/java/com/duckblade/osrs/sailing/features/facilities/LuffOverlay.java index b7bd7172..68246c92 100644 --- a/src/main/java/com/duckblade/osrs/sailing/features/facilities/LuffOverlay.java +++ b/src/main/java/com/duckblade/osrs/sailing/features/facilities/LuffOverlay.java @@ -22,7 +22,10 @@ @Slf4j @Singleton -public class LuffOverlay extends Overlay implements PluginLifecycleComponent { +public class LuffOverlay + extends Overlay + implements PluginLifecycleComponent +{ private final Client client; private final SailingConfig config; private final BoatTracker boatTracker; @@ -34,7 +37,8 @@ public LuffOverlay( SailingConfig config, BoatTracker boatTracker, ModelOutlineRenderer modelOutlineRenderer - ) { + ) + { this.client = client; this.config = config; this.boatTracker = boatTracker; @@ -45,36 +49,45 @@ public LuffOverlay( } @Override - public boolean isEnabled(SailingConfig config) { + public boolean isEnabled(SailingConfig config) + { return config.highlightTrimmableSails(); } @Override - public Dimension render(Graphics2D g) { - if (!SailingUtil.isSailing(client) || !config.highlightTrimmableSails()) { + public Dimension render(Graphics2D g) + { + if (!SailingUtil.isSailing(client) || !config.highlightTrimmableSails()) + { return null; } Boat boat = boatTracker.getBoat(); GameObject sail = boat != null ? boat.getSail() : null; - if (sail == null) { + if (sail == null) + { return null; } // Core behaviour: only show when the luff action is actually available - if (!sail.isOpShown(0)) { + if (!sail.isOpShown(0)) + { return null; } SailingConfig.SailHighlightMode mode = config.sailHighlightMode(); - if (mode == SailingConfig.SailHighlightMode.AREA) { + if (mode == SailingConfig.SailHighlightMode.AREA) + { Shape hull = sail.getConvexHull(); - if (hull != null) { + if (hull != null) + { OverlayUtil.renderPolygon(g, hull, Color.GREEN); } - } else if (mode == SailingConfig.SailHighlightMode.SAIL) { + } + else if (mode == SailingConfig.SailHighlightMode.SAIL) + { modelOutlineRenderer.drawOutline(sail, 2, Color.GREEN, 250); }