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, 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..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 @@ -18,6 +18,7 @@ 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 @@ -28,13 +29,20 @@ public class LuffOverlay 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); @@ -56,20 +64,31 @@ public Dimension render(Graphics2D g) Boat boat = boatTracker.getBoat(); GameObject sail = boat != null ? boat.getSail() : null; + if (sail == null) { return null; } + // Core behaviour: only show when the luff action is actually available if (!sail.isOpShown(0)) { return null; } - Shape convexHull = sail.getConvexHull(); - if (convexHull != null) + 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) { - OverlayUtil.renderPolygon(g, convexHull, Color.green); + modelOutlineRenderer.drawOutline(sail, 2, Color.GREEN, 250); } return null;