diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/ColorTileMarker.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/ColorTileMarker.java index 6a6a30a065..1b5891d138 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/ColorTileMarker.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/ColorTileMarker.java @@ -25,6 +25,7 @@ package net.runelite.client.plugins.groundmarkers; import java.awt.Color; +import javax.annotation.Nullable; import lombok.Value; import net.runelite.api.coords.WorldPoint; @@ -36,5 +37,8 @@ import net.runelite.api.coords.WorldPoint; class ColorTileMarker { private WorldPoint worldPoint; + @Nullable private Color color; + @Nullable + private String label; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java index 768d90b51b..31d3e1bf08 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerOverlay.java @@ -25,14 +25,17 @@ */ package net.runelite.client.plugins.groundmarkers; +import com.google.common.base.Strings; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import java.util.Collection; +import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.Perspective; +import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; @@ -79,13 +82,13 @@ public class GroundMarkerOverlay extends Overlay tileColor = config.markerColor(); } - drawTile(graphics, worldPoint, tileColor); + drawTile(graphics, worldPoint, tileColor, point.getLabel()); } return null; } - private void drawTile(Graphics2D graphics, WorldPoint point, Color color) + private void drawTile(Graphics2D graphics, WorldPoint point, Color color, @Nullable String label) { WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); @@ -101,11 +104,18 @@ public class GroundMarkerOverlay extends Overlay } Polygon poly = Perspective.getCanvasTilePoly(client, lp); - if (poly == null) + if (poly != null) { - return; + OverlayUtil.renderPolygon(graphics, poly, color); } - OverlayUtil.renderPolygon(graphics, poly, color); + if (!Strings.isNullOrEmpty(label)) + { + Point canvasTextLocation = Perspective.getCanvasTextLocation(client, graphics, lp, label, 0); + if (canvasTextLocation != null) + { + OverlayUtil.renderTextLocation(graphics, canvasTextLocation, label, color); + } + } } } 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 e0f37dbb4a..f4b17c6358 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 @@ -52,6 +52,7 @@ import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuOptionClicked; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.chatbox.ChatboxPanelManager; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -68,6 +69,7 @@ public class GroundMarkerPlugin extends Plugin private static final String CONFIG_GROUP = "groundMarker"; private static final String MARK = "Mark tile"; private static final String UNMARK = "Unmark tile"; + private static final String LABEL = "Label tile"; private static final String WALK_HERE = "Walk here"; private static final String REGION_PREFIX = "region_"; @@ -97,6 +99,9 @@ public class GroundMarkerPlugin extends Plugin @Inject private KeyManager keyManager; + @Inject + private ChatboxPanelManager chatboxPanelManager; + private void savePoints(int regionId, Collection points) { if (points == null || points.isEmpty()) @@ -166,15 +171,31 @@ public class GroundMarkerPlugin extends Plugin return points.stream() .map(point -> new ColorTileMarker( WorldPoint.fromRegion(point.getRegionId(), point.getRegionX(), point.getRegionY(), point.getZ()), - point.getColor())) + point.getColor(), point.getLabel())) .flatMap(colorTile -> { final Collection localWorldPoints = WorldPoint.toLocalInstance(client, colorTile.getWorldPoint()); - return localWorldPoints.stream().map(wp -> new ColorTileMarker(wp, colorTile.getColor())); + return localWorldPoints.stream().map(wp -> new ColorTileMarker(wp, colorTile.getColor(), colorTile.getLabel())); }) .collect(Collectors.toList()); } + @Override + public void startUp() + { + overlayManager.add(overlay); + overlayManager.add(minimapOverlay); + loadPoints(); + } + + @Override + public void shutDown() + { + overlayManager.remove(overlay); + overlayManager.remove(minimapOverlay); + points.clear(); + } + @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged) { @@ -200,17 +221,26 @@ public class GroundMarkerPlugin extends Plugin return; } - MenuEntry[] menuEntries = client.getMenuEntries(); - menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1); - MenuEntry menuEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); - 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(), config.markerColor()); + final GroundMarkerPoint point = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), null, null); + final boolean exists = getPoints(regionId).contains(point); - menuEntry.setOption(getPoints(regionId).contains(point) ? UNMARK : MARK); - menuEntry.setTarget(event.getTarget()); - menuEntry.setType(MenuAction.RUNELITE.getId()); + MenuEntry[] menuEntries = client.getMenuEntries(); + menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + (exists ? 2 : 1)); + + MenuEntry mark = menuEntries[menuEntries.length - 1] = new MenuEntry(); + mark.setOption(exists ? UNMARK : MARK); + mark.setTarget(event.getTarget()); + mark.setType(MenuAction.RUNELITE.getId()); + + if (exists) + { + MenuEntry label = menuEntries[menuEntries.length - 2] = new MenuEntry(); + label.setOption(LABEL); + label.setTarget(event.getTarget()); + label.setType(MenuAction.RUNELITE.getId()); + } client.setMenuEntries(menuEntries); } @@ -219,8 +249,7 @@ public class GroundMarkerPlugin extends Plugin @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (event.getMenuAction().getId() != MenuAction.RUNELITE.getId() || - !(event.getMenuOption().equals(MARK) || event.getMenuOption().equals(UNMARK))) + if (event.getMenuAction().getId() != MenuAction.RUNELITE.getId()) { return; } @@ -230,23 +259,16 @@ public class GroundMarkerPlugin extends Plugin { return; } - markTile(target.getLocalLocation()); - } - @Override - protected void startUp() - { - overlayManager.add(overlay); - overlayManager.add(minimapOverlay); - loadPoints(); - } - - @Override - protected void shutDown() - { - overlayManager.remove(overlay); - overlayManager.remove(minimapOverlay); - points.clear(); + final String option = event.getMenuOption(); + if (option.equals(MARK) || option.equals(UNMARK)) + { + markTile(target.getLocalLocation()); + } + else if (option.equals(LABEL)) + { + labelTile(target); + } } private void markTile(LocalPoint localPoint) @@ -259,7 +281,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()); + GroundMarkerPoint point = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), config.markerColor(), null); log.debug("Updating point: {} - {}", point, worldPoint); List groundMarkerPoints = new ArrayList<>(getPoints(regionId)); @@ -276,4 +298,35 @@ public class GroundMarkerPlugin extends Plugin loadPoints(); } + + private void labelTile(Tile tile) + { + LocalPoint localPoint = tile.getLocalLocation(); + WorldPoint worldPoint = WorldPoint.fromLocalInstance(client, localPoint); + final int regionId = worldPoint.getRegionID(); + + chatboxPanelManager.openTextInput("Tile label") + .onDone((input) -> + { + input = Strings.emptyToNull(input); + + GroundMarkerPoint searchPoint = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), null, null); + Collection points = getPoints(regionId); + GroundMarkerPoint existing = points.stream() + .filter(p -> p.equals(searchPoint)) + .findFirst().orElse(null); + if (existing == null) + { + return; + } + + GroundMarkerPoint newPoint = new GroundMarkerPoint(regionId, worldPoint.getRegionX(), worldPoint.getRegionY(), client.getPlane(), existing.getColor(), input); + points.remove(searchPoint); + points.add(newPoint); + savePoints(regionId, points); + + loadPoints(); + }) + .build(); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPoint.java index 3e10a654c0..29d7d6f92c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/groundmarkers/GroundMarkerPoint.java @@ -26,6 +26,7 @@ package net.runelite.client.plugins.groundmarkers; import java.awt.Color; +import javax.annotation.Nullable; import lombok.EqualsAndHashCode; import lombok.Value; @@ -33,12 +34,15 @@ import lombok.Value; * Used for serialization of ground marker points. */ @Value -@EqualsAndHashCode(exclude = { "color" }) +@EqualsAndHashCode(exclude = { "color", "label" }) class GroundMarkerPoint { private int regionId; private int regionX; private int regionY; private int z; + @Nullable private Color color; + @Nullable + private String label; }