diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index 3727469cd2..07ad3e4b0c 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -119,10 +119,12 @@ public class WidgetID static class WorldMap { - static final int OPTION = 42; - static final int TOOLTIP = 35; static final int MAPVIEW = 3; + static final int OVERVIEW_MAP = 6; static final int SEARCH = 21; + static final int SURFACE_SELECTOR = 29; + static final int TOOLTIP = 35; + static final int OPTION = 42; } static class SlayerRewards diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index 144fda4077..dbcaec49c0 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -48,10 +48,12 @@ public enum WidgetInfo CLAN_CHAT(WidgetID.CLAN_CHAT_GROUP_ID, 0), RAIDING_PARTY(WidgetID.RAIDING_PARTY_GROUP_ID, 0), - WORLD_MAP_OPTION(WidgetID.WORLD_MAP_MENU_GROUP_ID, WidgetID.WorldMap.OPTION), - WORLD_MAP_TOOLTIP(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.TOOLTIP), WORLD_MAP_VIEW(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.MAPVIEW), + WORLD_MAP_OVERVIEW_MAP(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.OVERVIEW_MAP), WORLD_MAP_SEARCH(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.SEARCH), + WORLD_MAP_SURFACE_SELECTOR(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.SURFACE_SELECTOR), + WORLD_MAP_TOOLTIP(WidgetID.WORLD_MAP_GROUP_ID, WidgetID.WorldMap.TOOLTIP), + WORLD_MAP_OPTION(WidgetID.WORLD_MAP_MENU_GROUP_ID, WidgetID.WorldMap.OPTION), CLUE_SCROLL_TEXT(WidgetID.CLUE_SCROLL_GROUP_ID, WidgetID.Cluescroll.CLUE_TEXT), diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java index c95130014e..39623e5fa0 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java @@ -24,12 +24,12 @@ */ package net.runelite.client.ui.overlay.worldmap; -import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.geom.Area; import java.awt.image.BufferedImage; import java.util.List; import javax.inject.Inject; @@ -70,7 +70,7 @@ public class WorldMapOverlay extends Overlay this.worldMapPointManager = worldMapPointManager; setPosition(OverlayPosition.DYNAMIC); setPriority(OverlayPriority.HIGHEST); - setLayer(OverlayLayer.ALWAYS_ON_TOP); + setLayer(OverlayLayer.ABOVE_WIDGETS); mouseManager.registerMouseListener(worldMapOverlayMouseListener); } @@ -91,6 +91,8 @@ public class WorldMapOverlay extends Overlay } final Rectangle worldMapRectangle = widget.getBounds(); + final Area mapViewArea = getWorldMapClipArea(worldMapRectangle); + final Area canvasViewArea = getWorldMapClipArea(client.getCanvas().getBounds()); WorldMapPoint tooltipPoint = null; for (WorldMapPoint worldPoint : points) @@ -110,8 +112,7 @@ public class WorldMapOverlay extends Overlay if (worldPoint.isSnapToEdge()) { - Canvas canvas = client.getCanvas(); - graphics.setClip(0, 0, canvas.getWidth(), canvas.getHeight()); + graphics.setClip(canvasViewArea); if (worldMapRectangle.contains(drawPoint.getX(), drawPoint.getY())) { @@ -133,7 +134,7 @@ public class WorldMapOverlay extends Overlay } else { - graphics.setClip(worldMapRectangle); + graphics.setClip(mapViewArea); } int drawX = drawPoint.getX(); @@ -216,6 +217,33 @@ public class WorldMapOverlay extends Overlay return null; } + /** + * Gets a clip area which excludes the area of widgets which overlay the world map. + * + * @param baseRectangle The base area to clip from + * @return An {@link Area} representing baseRectangle, with the area + * of visible widgets overlaying the world map clipped from it. + */ + private Area getWorldMapClipArea(Rectangle baseRectangle) + { + final Widget overview = client.getWidget(WidgetInfo.WORLD_MAP_OVERVIEW_MAP); + final Widget surfaceSelector = client.getWidget(WidgetInfo.WORLD_MAP_SURFACE_SELECTOR); + + Area clipArea = new Area(baseRectangle); + + if (overview != null && !overview.isHidden()) + { + clipArea.subtract(new Area(overview.getBounds())); + } + + if (surfaceSelector != null && !surfaceSelector.isHidden()) + { + clipArea.subtract(new Area(surfaceSelector.getBounds())); + } + + return clipArea; + } + private void drawTooltip(Graphics2D graphics, WorldMapPoint worldPoint) { String tooltip = worldPoint.getTooltip(); @@ -227,7 +255,7 @@ public class WorldMapOverlay extends Overlay drawPoint = new Point(drawPoint.getX() + TOOLTIP_OFFSET_WIDTH, drawPoint.getY() + TOOLTIP_OFFSET_HEIGHT); - graphics.setClip(0, 0, client.getCanvas().getWidth(), client.getCanvas().getHeight()); + graphics.setClip(client.getCanvas().getBounds()); graphics.setColor(TOOLTIP_BACKGROUND); graphics.setFont(FontManager.getRunescapeFont()); FontMetrics fm = graphics.getFontMetrics();