runelite-client: add world map overlay renderer

This commit is contained in:
Morgan Lewis
2018-05-03 20:54:45 -04:00
parent 12104758cc
commit 36114c4fd6
8 changed files with 543 additions and 7 deletions

View File

@@ -77,7 +77,7 @@ public class WidgetID
public static final int PUZZLE_BOX_GROUP_ID = 306; public static final int PUZZLE_BOX_GROUP_ID = 306;
public static final int NIGHTMARE_ZONE_GROUP_ID = 202; public static final int NIGHTMARE_ZONE_GROUP_ID = 202;
public static final int BLAST_FURNACE_GROUP_ID = 474; public static final int BLAST_FURNACE_GROUP_ID = 474;
public static final int WORLD_MAP = 595; public static final int WORLD_MAP_GROUP_ID = 595;
public static final int PYRAMID_PLUNDER_GROUP_ID = 428; public static final int PYRAMID_PLUNDER_GROUP_ID = 428;
public static final int RAIDS_REWARD_GROUP_ID = 539; public static final int RAIDS_REWARD_GROUP_ID = 539;
public static final int EXPERIENCE_TRACKER_GROUP_ID = 122; public static final int EXPERIENCE_TRACKER_GROUP_ID = 122;
@@ -88,6 +88,8 @@ public class WidgetID
static class WorldMap static class WorldMap
{ {
static final int OPTION = 36; static final int OPTION = 36;
static final int TOOLTIP = 35;
static final int MAPVIEW = 3;
} }
static class SlayerRewards static class SlayerRewards

View File

@@ -45,6 +45,8 @@ public enum WidgetInfo
RAIDING_PARTY(WidgetID.RAIDING_PARTY_GROUP_ID, 0), RAIDING_PARTY(WidgetID.RAIDING_PARTY_GROUP_ID, 0),
WORLD_MAP(WidgetID.WORLD_MAP_MENU_GROUP_ID, WidgetID.WorldMap.OPTION), WORLD_MAP(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),
CLUE_SCROLL_TEXT(WidgetID.CLUE_SCROLL_GROUP_ID, WidgetID.Cluescroll.CLUE_TEXT), CLUE_SCROLL_TEXT(WidgetID.CLUE_SCROLL_GROUP_ID, WidgetID.Cluescroll.CLUE_TEXT),

View File

@@ -28,14 +28,14 @@ import com.google.common.eventbus.EventBus;
import com.google.inject.Injector; import com.google.inject.Injector;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelEvent;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.RenderingHints;
import net.runelite.api.Actor; import net.runelite.api.Actor;
import net.runelite.api.ChatMessageType; import net.runelite.api.ChatMessageType;
import net.runelite.api.Client; import net.runelite.api.Client;
@@ -63,7 +63,7 @@ import net.runelite.api.events.PostItemComposition;
import net.runelite.api.events.ProjectileMoved; import net.runelite.api.events.ProjectileMoved;
import net.runelite.api.events.SetMessage; import net.runelite.api.events.SetMessage;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import static net.runelite.api.widgets.WidgetID.WORLD_MAP; import static net.runelite.api.widgets.WidgetInfo.WORLD_MAP;
import net.runelite.client.Notifier; import net.runelite.client.Notifier;
import net.runelite.client.RuneLite; import net.runelite.client.RuneLite;
import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.ChatMessageManager;
@@ -158,7 +158,7 @@ public class Hooks
*/ */
private static void checkWorldMap() private static void checkWorldMap()
{ {
Widget widget = client.getWidget(WORLD_MAP, 0); Widget widget = client.getWidget(WORLD_MAP);
if (widget != null) if (widget != null)
{ {
return; return;

View File

@@ -64,6 +64,7 @@ import net.runelite.client.plugins.PluginManager;
import net.runelite.client.ui.FontManager; import net.runelite.client.ui.FontManager;
import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay; import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay;
import net.runelite.client.ui.overlay.tooltip.TooltipOverlay; import net.runelite.client.ui.overlay.tooltip.TooltipOverlay;
import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay;
@Singleton @Singleton
@Slf4j @Slf4j
@@ -91,6 +92,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener
private final ConfigManager configManager; private final ConfigManager configManager;
private final RuneLiteConfig runeLiteConfig; private final RuneLiteConfig runeLiteConfig;
private final TooltipOverlay tooltipOverlay; private final TooltipOverlay tooltipOverlay;
private final WorldMapOverlay worldMapOverlay;
private final List<Overlay> allOverlays = new CopyOnWriteArrayList<>(); private final List<Overlay> allOverlays = new CopyOnWriteArrayList<>();
private final String runeliteGroupName = RuneLiteConfig.class.getAnnotation(ConfigGroup.class).keyName(); private final String runeliteGroupName = RuneLiteConfig.class.getAnnotation(ConfigGroup.class).keyName();
@@ -117,6 +119,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener
final KeyManager keyManager, final KeyManager keyManager,
final TooltipOverlay tooltipOverlay, final TooltipOverlay tooltipOverlay,
final InfoBoxOverlay infoBoxOverlay, final InfoBoxOverlay infoBoxOverlay,
final WorldMapOverlay worldMapOverlay,
final ConfigManager configManager, final ConfigManager configManager,
final RuneLiteConfig runeLiteConfig) final RuneLiteConfig runeLiteConfig)
{ {
@@ -124,6 +127,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener
this.pluginManager = pluginManager; this.pluginManager = pluginManager;
this.tooltipOverlay = tooltipOverlay; this.tooltipOverlay = tooltipOverlay;
this.infoBoxOverlay = infoBoxOverlay; this.infoBoxOverlay = infoBoxOverlay;
this.worldMapOverlay = worldMapOverlay;
this.configManager = configManager; this.configManager = configManager;
this.runeLiteConfig = runeLiteConfig; this.runeLiteConfig = runeLiteConfig;
keyManager.registerKeyListener(this); keyManager.registerKeyListener(this);
@@ -169,7 +173,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener
.stream() .stream()
.filter(pluginManager::isPluginEnabled) .filter(pluginManager::isPluginEnabled)
.flatMap(plugin -> plugin.getOverlays().stream()), .flatMap(plugin -> plugin.getOverlays().stream()),
Stream.of(infoBoxOverlay, tooltipOverlay)) Stream.of(infoBoxOverlay, tooltipOverlay, worldMapOverlay))
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());

View File

@@ -0,0 +1,244 @@
/*
* Copyright (c) 2018, Morgan Lewis <https://github.com/MESLewis>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
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.image.BufferedImage;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.api.Point;
import net.runelite.api.RenderOverview;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.input.MouseManager;
import net.runelite.client.ui.FontManager;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayPriority;
@Singleton
@Slf4j
public class WorldMapOverlay extends Overlay
{
private static final Color TOOLTIP_BACKGROUND = new Color(255, 255, 160);
private static final int TOOLTIP_OFFSET_HEIGHT = 25;
private static final int TOOLTIP_OFFSET_WIDTH = 5;
private static final int TOOLTIP_PADDING_HEIGHT = 1;
private static final int TOOLTIP_PADDING_WIDTH = 2;
private final WorldMapPointManager worldMapPointManager;
private final Provider<Client> clientProvider;
@Inject
private WorldMapOverlay(Provider<Client> clientProvider, WorldMapPointManager worldMapPointManager,
MouseManager mouseManager, WorldMapOverlayMouseListener worldMapOverlayMouseListener)
{
this.clientProvider = clientProvider;
this.worldMapPointManager = worldMapPointManager;
setPosition(OverlayPosition.DYNAMIC);
setPriority(OverlayPriority.HIGH);
setLayer(OverlayLayer.ALWAYS_ON_TOP);
mouseManager.registerMouseListener(worldMapOverlayMouseListener);
}
@Override
public Dimension render(Graphics2D graphics)
{
final List<WorldMapPoint> points = worldMapPointManager.getWorldMapPoints();
if (points.isEmpty())
{
return null;
}
final Client client = clientProvider.get();
Widget widget = client.getWidget(WidgetInfo.WORLD_MAP_VIEW);
if (widget == null)
{
return null;
}
final Rectangle worldMapRectangle = widget.getBounds();
WorldMapPoint tooltipPoint = null;
for (WorldMapPoint worldPoint : points)
{
BufferedImage image = worldPoint.getImage();
WorldPoint point = worldPoint.getWorldPoint();
if (image != null && point != null)
{
Point drawPoint = mapWorldPointToGraphicsPoint(point);
if (worldPoint.isSnapToEdge())
{
Canvas canvas = client.getCanvas();
graphics.setClip(0, 0, canvas.getWidth(), canvas.getHeight());
if (worldMapRectangle.contains(drawPoint.getX(), drawPoint.getY()))
{
if (worldPoint.isCurrentlyEdgeSnapped())
{
worldPoint.setCurrentlyEdgeSnapped(false);
worldPoint.onEdgeUnsnap();
}
}
else
{
drawPoint = clipToRectangle(drawPoint, worldMapRectangle);
if (!worldPoint.isCurrentlyEdgeSnapped())
{
worldPoint.setCurrentlyEdgeSnapped(true);
worldPoint.onEdgeSnap();
}
}
}
else
{
graphics.setClip(worldMapRectangle);
}
int drawX = drawPoint.getX();
int drawY = drawPoint.getY();
if (worldPoint.getImagePoint() == null)
{
drawX -= image.getWidth() / 2;
drawY -= image.getHeight() / 2;
}
else
{
drawX -= worldPoint.getImagePoint().getX();
drawY -= worldPoint.getImagePoint().getY();
}
graphics.drawImage(image, drawX, drawY, null);
Rectangle clickbox = new Rectangle(drawX, drawY, image.getWidth(), image.getHeight());
worldPoint.setClickbox(clickbox);
if (worldPoint.isTooltipVisible())
{
tooltipPoint = worldPoint;
}
}
}
if (tooltipPoint != null)
{
drawTooltip(graphics, tooltipPoint);
}
return null;
}
private Point mapWorldPointToGraphicsPoint(WorldPoint worldPoint)
{
RenderOverview ro = clientProvider.get().getRenderOverview();
Float pixelsPerTile = ro.getWorldMapZoom();
Point worldMapPosition = ro.getWorldMapPosition();
int xWorldDiff = worldPoint.getX() - worldMapPosition.getX();
int yWorldDiff = worldPoint.getY() - worldMapPosition.getY();
yWorldDiff = -yWorldDiff;
Widget map = clientProvider.get().getWidget(WidgetInfo.WORLD_MAP_VIEW);
if (map != null)
{
Rectangle worldMapRect = map.getBounds();
int xGraphDiff = (int) (xWorldDiff * pixelsPerTile + worldMapRect.getWidth() / 2 + worldMapRect.getX());
int yGraphDiff = (int) (yWorldDiff * pixelsPerTile + worldMapRect.getHeight() / 2 + worldMapRect.getY());
return new Point(xGraphDiff, yGraphDiff);
}
return new Point(0, 0);
}
private void drawTooltip(Graphics2D graphics, WorldMapPoint worldPoint)
{
String tooltip = worldPoint.getTooltip();
if (tooltip == null || tooltip.length() <= 0)
{
return;
}
Point drawPoint = mapWorldPointToGraphicsPoint(worldPoint.getWorldPoint());
drawPoint = new Point(drawPoint.getX() + TOOLTIP_OFFSET_WIDTH, drawPoint.getY() + TOOLTIP_OFFSET_HEIGHT);
graphics.setClip(0, 0, clientProvider.get().getCanvas().getWidth(), clientProvider.get().getCanvas().getHeight());
graphics.setColor(TOOLTIP_BACKGROUND);
graphics.setFont(FontManager.getRunescapeFont());
FontMetrics fm = graphics.getFontMetrics();
int width = fm.stringWidth(tooltip);
int height = fm.getHeight();
Rectangle tooltipRect = new Rectangle(drawPoint.getX() - TOOLTIP_PADDING_WIDTH, drawPoint.getY() - TOOLTIP_PADDING_HEIGHT, width + TOOLTIP_PADDING_WIDTH * 2, height + TOOLTIP_PADDING_HEIGHT * 2);
graphics.fillRect((int) tooltipRect.getX(), (int) tooltipRect.getY(), (int) tooltipRect.getWidth(), (int) tooltipRect.getHeight());
graphics.setColor(Color.black);
graphics.drawRect((int) tooltipRect.getX(), (int) tooltipRect.getY(), (int) tooltipRect.getWidth(), (int) tooltipRect.getHeight());
graphics.drawString(tooltip, drawPoint.getX(), drawPoint.getY() + height);
}
private Point clipToRectangle(Point drawPoint, Rectangle mapDisplayRectangle)
{
int clippedX = drawPoint.getX();
if (drawPoint.getX() < mapDisplayRectangle.getX())
{
clippedX = (int) mapDisplayRectangle.getX();
}
if (drawPoint.getX() > mapDisplayRectangle.getX() + mapDisplayRectangle.getWidth())
{
clippedX = (int) (mapDisplayRectangle.getX() + mapDisplayRectangle.getWidth());
}
int clippedY = drawPoint.getY();
if (drawPoint.getY() < mapDisplayRectangle.getY())
{
clippedY = (int) mapDisplayRectangle.getY();
}
if (drawPoint.getY() > mapDisplayRectangle.getY() + mapDisplayRectangle.getHeight())
{
clippedY = (int) (mapDisplayRectangle.getY() + mapDisplayRectangle.getHeight());
}
return new Point(clippedX, clippedY);
}
}

View File

@@ -0,0 +1,156 @@
/*
* Copyright (c) 2018, Morgan Lewis <https://github.com/MESLewis>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.ui.overlay.worldmap;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.swing.SwingUtilities;
import net.runelite.api.Client;
import net.runelite.api.Point;
import net.runelite.api.RenderOverview;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.input.MouseListener;
@Singleton
public class WorldMapOverlayMouseListener extends MouseListener
{
private final Provider<Client> clientProvider;
private final WorldMapPointManager worldMapPointManager;
private WorldMapPoint tooltipPoint = null;
@Inject
private WorldMapOverlayMouseListener(Provider<Client> clientProvider, WorldMapPointManager worldMapPointManager)
{
this.clientProvider = clientProvider;
this.worldMapPointManager = worldMapPointManager;
}
@Override
public MouseEvent mousePressed(MouseEvent e)
{
List<WorldMapPoint> worldMapPoints = worldMapPointManager.getWorldMapPoints();
if (SwingUtilities.isLeftMouseButton(e) && !worldMapPoints.isEmpty())
{
Point mousePos = clientProvider.get().getMouseCanvasPosition();
for (WorldMapPoint worldMapPoint : worldMapPoints)
{
Rectangle clickbox = worldMapPoint.getClickbox();
if (clickbox != null && clickbox.contains(mousePos.getX(), mousePos.getY()))
{
if (worldMapPoint.isJumpOnClick())
{
// jump map to position of point
WorldPoint target = worldMapPoint.getWorldPoint();
Client client = clientProvider.get();
RenderOverview renderOverview = client.getRenderOverview();
renderOverview.setWorldMapPositionTarget(target);
}
return worldMapPoint.onClick(e);
}
}
}
return e;
}
@Override
public MouseEvent mouseMoved(MouseEvent mouseEvent)
{
List<WorldMapPoint> worldMapPoints = worldMapPointManager.getWorldMapPoints();
if (worldMapPoints.isEmpty())
{
return mouseEvent;
}
final Client client = clientProvider.get();
final Point mousePos = client.getMouseCanvasPosition();
final Widget view = client.getWidget(WidgetInfo.WORLD_MAP_VIEW);
if (view == null)
{
return mouseEvent;
}
final Rectangle worldMapDisplay = view.getBounds();
if (worldMapDisplay == null || !worldMapDisplay.contains(mousePos.getX(), mousePos.getY()))
{
if (tooltipPoint != null)
{
tooltipPoint.setTooltipVisible(false);
tooltipPoint = null;
final Widget rsTooltip = client.getWidget(WidgetInfo.WORLD_MAP_TOOLTIP);
if (rsTooltip != null)
{
rsTooltip.setHidden(false);
}
}
return mouseEvent;
}
if (tooltipPoint != null)
{
if (tooltipPoint.getClickbox() != null
&& tooltipPoint.getClickbox().contains(mousePos.getX(), mousePos.getY()))
{
return mouseEvent;
}
else
{
tooltipPoint.setTooltipVisible(false);
tooltipPoint = null;
final Widget rsTooltip = client.getWidget(WidgetInfo.WORLD_MAP_TOOLTIP);
if (rsTooltip != null)
{
rsTooltip.setHidden(false);
}
}
}
for (WorldMapPoint worldMapPoint : worldMapPointManager.getWorldMapPoints())
{
if (worldMapPoint.getClickbox() != null
&& worldMapPoint.getClickbox().contains(mousePos.getX(), mousePos.getY())
&& worldMapPoint.getTooltip() != null)
{
worldMapPoint.setTooltipVisible(true);
tooltipPoint = worldMapPoint;
final Widget rsTooltip = client.getWidget(WidgetInfo.WORLD_MAP_TOOLTIP);
if (rsTooltip != null)
{
rsTooltip.setHidden(true);
}
return mouseEvent;
}
}
return mouseEvent;
}
}

View File

@@ -0,0 +1,80 @@
/*
* Copyright (c) 2018, Morgan Lewis <https://github.com/MESLewis>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.ui.overlay.worldmap;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import lombok.Data;
import net.runelite.api.Point;
import net.runelite.api.coords.WorldPoint;
@Data
public class WorldMapPoint
{
private BufferedImage image;
private WorldPoint worldPoint;
/**
* The point on the image that will be drawn at WorldPoint
* WorldMapPointManager will center the image if imagePoint is null
*/
private Point imagePoint;
private Rectangle clickbox;
private boolean snapToEdge;
private boolean currentlyEdgeSnapped;
/**
* Whether or not the map jumps to worldPoint when the overlay is clicked
*/
private boolean jumpOnClick;
private boolean tooltipVisible;
private String tooltip;
public WorldMapPoint(WorldPoint worldPoint, BufferedImage image)
{
this.worldPoint = worldPoint;
this.image = image;
}
public MouseEvent onClick(MouseEvent e)
{
return e;
}
public void onEdgeSnap()
{
}
public void onEdgeUnsnap()
{
}
}

View File

@@ -0,0 +1,48 @@
/*
* Copyright (c) 2018, Morgan Lewis <https://github.com/MESLewis>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.ui.overlay.worldmap;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Singleton;
import lombok.AccessLevel;
import lombok.Getter;
@Singleton
public class WorldMapPointManager
{
@Getter(AccessLevel.PACKAGE)
private final List<WorldMapPoint> worldMapPoints = new ArrayList<>();
public void add(WorldMapPoint worldMapPoint)
{
worldMapPoints.add(worldMapPoint);
}
public void remove(WorldMapPoint worldMapPoint)
{
worldMapPoints.remove(worldMapPoint);
}
}