From 3fcf4c4217023807636dd04cdb199bdffa464ec0 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Thu, 12 May 2022 15:33:21 -0600 Subject: [PATCH 1/5] rl-api, groundmarkers: handle instance plane conversion correctly --- .../net/runelite/api/coords/WorldPoint.java | 32 +++++++++++-------- .../groundmarkers/GroundMarkerPlugin.java | 8 ++--- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java index 8b31f7c499..f3414822f4 100644 --- a/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java +++ b/runelite-api/src/main/java/net/runelite/api/coords/WorldPoint.java @@ -234,24 +234,28 @@ public class WorldPoint // find instance chunks using the template point. there might be more than one. List worldPoints = new ArrayList<>(); - final int z = worldPoint.getPlane(); int[][][] instanceTemplateChunks = client.getInstanceTemplateChunks(); - for (int x = 0; x < instanceTemplateChunks[z].length; ++x) + for (int z = 0; z < instanceTemplateChunks.length; z++) { - for (int y = 0; y < instanceTemplateChunks[z][x].length; ++y) + for (int x = 0; x < instanceTemplateChunks[z].length; ++x) { - int chunkData = instanceTemplateChunks[z][x][y]; - int rotation = chunkData >> 1 & 0x3; - int templateChunkY = (chunkData >> 3 & 0x7FF) * CHUNK_SIZE; - int templateChunkX = (chunkData >> 14 & 0x3FF) * CHUNK_SIZE; - if (worldPoint.getX() >= templateChunkX && worldPoint.getX() < templateChunkX + CHUNK_SIZE - && worldPoint.getY() >= templateChunkY && worldPoint.getY() < templateChunkY + CHUNK_SIZE) + for (int y = 0; y < instanceTemplateChunks[z][x].length; ++y) { - WorldPoint p = new WorldPoint(client.getBaseX() + x * CHUNK_SIZE + (worldPoint.getX() & (CHUNK_SIZE - 1)), - client.getBaseY() + y * CHUNK_SIZE + (worldPoint.getY() & (CHUNK_SIZE - 1)), - worldPoint.getPlane()); - p = rotate(p, rotation); - worldPoints.add(p); + int chunkData = instanceTemplateChunks[z][x][y]; + int rotation = chunkData >> 1 & 0x3; + int templateChunkY = (chunkData >> 3 & 0x7FF) * CHUNK_SIZE; + int templateChunkX = (chunkData >> 14 & 0x3FF) * CHUNK_SIZE; + int plane = chunkData >> 24 & 0x3; + if (worldPoint.getX() >= templateChunkX && worldPoint.getX() < templateChunkX + CHUNK_SIZE + && worldPoint.getY() >= templateChunkY && worldPoint.getY() < templateChunkY + CHUNK_SIZE + && plane == worldPoint.getPlane()) + { + WorldPoint p = new WorldPoint(client.getBaseX() + x * CHUNK_SIZE + (worldPoint.getX() & (CHUNK_SIZE - 1)), + client.getBaseY() + y * CHUNK_SIZE + (worldPoint.getY() & (CHUNK_SIZE - 1)), + z); + p = rotate(p, rotation); + worldPoints.add(p); + } } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java index e8de79d73e..53702f8be7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPlugin.java @@ -237,7 +237,7 @@ public class GroundMarkerPlugin extends Plugin final WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, selectedSceneTile.getLocalLocation()); final int regionId = worldPoint.getRegionID(); - final GroundMarkerPoint point = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), null, null); + final GroundMarkerPoint point = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), worldPoint.getPlane(), null, null); final boolean exists = getPoints(regionId).contains(point); client.createMenuEntry(-1) @@ -302,7 +302,7 @@ public class GroundMarkerPlugin extends Plugin WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, localPoint); int regionId = worldPoint.getRegionID(); - GroundMarkerPoint point = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), config.markerColor(), null); + GroundMarkerPoint point = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), worldPoint.getPlane(), config.markerColor(), null); log.debug("Updating point: {} - {}", point, worldPoint); List groundMarkerPoints = new ArrayList<>(getPoints(regionId)); @@ -326,7 +326,7 @@ public class GroundMarkerPlugin extends Plugin WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, localPoint); final int regionId = worldPoint.getRegionID(); - GroundMarkerPoint searchPoint = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), null, null); + GroundMarkerPoint searchPoint = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), worldPoint.getPlane(), null, null); Collection points = getPoints(regionId); GroundMarkerPoint existing = points.stream() .filter(p -> p.equals(searchPoint)) @@ -342,7 +342,7 @@ public class GroundMarkerPlugin extends Plugin { input = Strings.emptyToNull(input); - GroundMarkerPoint newPoint = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), existing.getColor(), input); + GroundMarkerPoint newPoint = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), worldPoint.getPlane(), existing.getColor(), input); points.remove(searchPoint); points.add(newPoint); savePoints(regionId, points); From 570907ea1139ae331b679ac3bdd330a252fc1793 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 13 May 2022 11:16:17 -0400 Subject: [PATCH 2/5] overlay: better handle picking up overlapping overlays findManagedOverlay needs to iterate in roughly the reverse drawing order. Also adjust the moveable tli layers to be by priority in render oder. --- .../client/ui/overlay/OverlayManager.java | 4 +-- .../client/ui/overlay/OverlayRenderer.java | 34 +++++++++++-------- .../client/ui/overlay/WidgetOverlay.java | 10 +++--- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java index ab333a8bcf..5811f98936 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java @@ -24,7 +24,6 @@ */ package net.runelite.client.ui.overlay; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.collect.ArrayListMultimap; import java.awt.Dimension; @@ -64,7 +63,6 @@ public class OverlayManager private static final String OVERLAY_CONFIG_PREFERRED_SIZE = "_preferredSize"; private static final String RUNELITE_CONFIG_GROUP_NAME = RuneLiteConfig.class.getAnnotation(ConfigGroup.class).value(); - @VisibleForTesting static final Comparator OVERLAY_COMPARATOR = (a, b) -> { final OverlayPosition aPos = MoreObjects.firstNonNull(a.getPreferredPosition(), a.getPosition()); @@ -82,7 +80,7 @@ public class OverlayManager // For non-dynamic overlays, higher priority means // draw *earlier* so that they are closer to their // defined position. - return aPos == OverlayPosition.DYNAMIC + return aPos == OverlayPosition.DYNAMIC || aPos == OverlayPosition.DETACHED ? a.getPriority().compareTo(b.getPriority()) : b.getPriority().compareTo(a.getPriority()); }; diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index 0f1476e5d0..9cd09225ee 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -25,6 +25,7 @@ package net.runelite.client.ui.overlay; import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableList; import com.google.common.primitives.Ints; import java.awt.Color; import java.awt.Composite; @@ -40,6 +41,7 @@ import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; @@ -502,22 +504,24 @@ public class OverlayRenderer extends MouseAdapter { synchronized (overlayManager) { - for (Overlay overlay : overlayManager.getOverlays()) - { - if (overlay.getPosition() == OverlayPosition.DYNAMIC || overlay.getPosition() == OverlayPosition.TOOLTIP) - { - // never allow moving dynamic or tooltip overlays - continue; - } - - final Rectangle bounds = overlay.getBounds(); - if (bounds.contains(mousePoint)) - { - return overlay; - } - } + // render order is roughly: under -> manual -> above -> always on top + final List layerOrder = ImmutableList.of(OverlayLayer.UNDER_WIDGETS, OverlayLayer.MANUAL, OverlayLayer.ABOVE_WIDGETS, OverlayLayer.ALWAYS_ON_TOP); + return overlayManager.getOverlays() + .stream() + // ABOVE_SCENE overlays aren't managed + .filter(c -> layerOrder.contains(c.getLayer())) + // never allow moving dynamic or tooltip overlays + .filter(c -> c.getPosition() != OverlayPosition.DYNAMIC && c.getPosition() != OverlayPosition.TOOLTIP) + .sorted( + Comparator.comparingInt(c -> layerOrder.indexOf(c.getLayer())) + .thenComparing(OverlayManager.OVERLAY_COMPARATOR) + // pick order is reversed from render order + .reversed() + ) + .filter(o -> o.getBounds().contains(mousePoint)) + .findFirst() + .orElse(null); } - return null; } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java index fa54590dea..77a00e59ec 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -42,14 +42,16 @@ public class WidgetOverlay extends Overlay public static Collection createOverlays(final OverlayManager overlayManager, final Client client) { return Arrays.asList( - new WidgetOverlay(client, WidgetInfo.RESIZABLE_VIEWPORT_CHATBOX_PARENT, OverlayPosition.DETACHED), + // classic resizable + new WidgetOverlay(client, WidgetInfo.RESIZABLE_VIEWPORT_CHATBOX_PARENT, OverlayPosition.DETACHED, OverlayPriority.HIGH), + new WidgetOverlay(client, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_CHATBOX_PARENT, OverlayPosition.DETACHED, OverlayPriority.HIGH), new WidgetOverlay(client, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_PARENT, OverlayPosition.DETACHED), - new WidgetOverlay(client, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_CHATBOX_PARENT, OverlayPosition.DETACHED), + new WidgetOverlay(client, WidgetInfo.RESIZABLE_MINIMAP_WIDGET, OverlayPosition.DETACHED, OverlayPriority.MED), + // modern resizable new WidgetOverlay(client, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_TABS1, OverlayPosition.DETACHED), new WidgetOverlay(client, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_TABS2, OverlayPosition.DETACHED), new WidgetOverlay(client, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_PARENT, OverlayPosition.DETACHED), - new WidgetOverlay(client, WidgetInfo.RESIZABLE_MINIMAP_WIDGET, OverlayPosition.CANVAS_TOP_RIGHT), - new WidgetOverlay(client, WidgetInfo.RESIZABLE_MINIMAP_STONES_WIDGET, OverlayPosition.CANVAS_TOP_RIGHT), + new WidgetOverlay(client, WidgetInfo.RESIZABLE_MINIMAP_STONES_WIDGET, OverlayPosition.DETACHED, OverlayPriority.MED), // The client forces the oxygen bar below the xp tracker, so set its priority lower new WidgetOverlay(client, WidgetInfo.FOSSIL_ISLAND_OXYGENBAR, OverlayPosition.TOP_CENTER, OverlayPriority.HIGH), new XpTrackerWidgetOverlay(overlayManager, client, WidgetInfo.EXPERIENCE_TRACKER_WIDGET, OverlayPosition.TOP_RIGHT), From 77ccf68739d17dfc9d8670383329f3ebb04e5734 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 14 May 2022 16:29:18 -0400 Subject: [PATCH 3/5] menu swapper: removetags object/npc names --- .../plugins/menuentryswapper/MenuEntrySwapperPlugin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index c91cb7068f..5ed1857d84 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -675,7 +675,7 @@ public class MenuEntrySwapperPlugin extends Plugin .onClick(e -> { final String message = new ChatMessageBuilder() - .append("The default left click option for '").append(composition.getName()).append("' ") + .append("The default left click option for '").append(Text.removeTags(composition.getName())).append("' ") .append("has been set to '").append(actions[menuIdx]).append("'.") .build(); @@ -764,7 +764,7 @@ public class MenuEntrySwapperPlugin extends Plugin .onClick(e -> { final String message = new ChatMessageBuilder() - .append("The default left click option for '").append(composition.getName()).append("' ") + .append("The default left click option for '").append(Text.removeTags(composition.getName())).append("' ") .append("has been set to '").append(actions[menuIdx]).append("'.") .build(); From b8188d27e31e52470d126fcbd9601ce4d9b2a46c Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 14 May 2022 18:32:26 -0400 Subject: [PATCH 4/5] menu swapper: removetags npc name on reset swap --- .../client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 5ed1857d84..75e0e34294 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -789,7 +789,7 @@ public class MenuEntrySwapperPlugin extends Plugin .onClick(e -> { final String message = new ChatMessageBuilder() - .append("The default left click option for '").append(composition.getName()).append("' ") + .append("The default left click option for '").append(Text.removeTags(composition.getName())).append("' ") .append("has been reset.") .build(); From 2cc34b9ece9979a05968c729ba3026463e318413 Mon Sep 17 00:00:00 2001 From: LlemonDuck Date: Thu, 12 May 2022 20:58:06 -0700 Subject: [PATCH 5/5] clientui: setResizable after setVisible Prevents an issue with clients being resizable with toolbar-less means in some environments (e.g. double clicking title bar on macos). Honestly I'm not entirely sure why this is ignored if the window isn't visible, rather than being propagated to the window manager when the window is shown, but I guess Swing isn't that smart (like always). I originally found the information on [this SO answer](https://stackoverflow.com/a/14884056) and it seemed to resolve the issue. Closes #14235 --- .../src/main/java/net/runelite/client/ui/ClientUI.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 20a2f378d1..42de5fc510 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -488,7 +488,7 @@ public class ClientUI } // Update config - updateFrameConfig(true); + updateFrameConfig(false); // Create hide sidebar button @@ -596,6 +596,8 @@ public class ClientUI // Show frame frame.setVisible(true); + // On macos setResizable needs to be called after setVisible + frame.setResizable(!config.lockWindowSize()); frame.toFront(); requestFocus(); log.info("Showing frame {}", frame);