From c5fbbca506cc9a6b06e5fd37cbfcc210b621945b Mon Sep 17 00:00:00 2001 From: ShaunDreclin Date: Mon, 12 Feb 2018 21:43:08 -0500 Subject: [PATCH] Add Rogues' Den plugin --- .../client/plugins/roguesden/Obstacles.java | 52 +++++ .../plugins/roguesden/RoguesDenConfig.java | 47 +++++ .../plugins/roguesden/RoguesDenOverlay.java | 101 ++++++++++ .../plugins/roguesden/RoguesDenPlugin.java | 178 ++++++++++++++++++ 4 files changed, 378 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenConfig.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java new file mode 100644 index 0000000000..89a64740f5 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/Obstacles.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018, Shaun Dreclin + * 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.plugins.roguesden; + +import com.google.common.collect.Sets; +import java.util.Set; +import static net.runelite.api.ObjectID.*; + +class Obstacles +{ + public static final Set OBSTACLE_IDS_HULL = Sets.newHashSet( + SPINNING_BLADES_7224, + CONTORTION_BARS, + PENDULUM, + WALL_7249, /*Wall crushers*/ + WALL_7248, /*Wall blade*/ + LEDGE_7240, /*Ledge climb*/ + NULL_7235 /*Wall safe*/ + ); + + public static final Set OBSTACLE_IDS_TILE = Sets.newHashSet( + FLOOR, /*Floor spikes*/ + WALL_7228, /*Wall spikes*/ + WALL_7229, /*Wall spears*/ + FLOOR_7245, /*Pressure pad a*/ + FLOOR_7230, /*Pressure pad b*/ + BLADE_7252, /*Floor blade*/ + 7239 /*Bridge [Ground object]*/ + ); +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenConfig.java new file mode 100644 index 0000000000..d6f819d3d2 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenConfig.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018, Shaun Dreclin + * 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.plugins.roguesden; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup( + keyName = "roguesden", + name = "Rogues' Den", + description = "Configuration for the Rogues' Den plugin" +) +public interface RoguesDenConfig extends Config +{ + @ConfigItem( + keyName = "enabled", + name = "Enable overlay", + description = "Configures whether the overlay is enabled" + ) + default boolean enabled() + { + return true; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java new file mode 100644 index 0000000000..1e6aab7b3c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenOverlay.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2018, Shaun Dreclin + * 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.plugins.roguesden; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Polygon; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; + +@Slf4j +public class RoguesDenOverlay extends Overlay +{ + private static final int MAX_DISTANCE = 2350; + + private final Client client; + private final RoguesDenPlugin plugin; + private final RoguesDenConfig config; + + @Inject + public RoguesDenOverlay(Client client, RoguesDenPlugin plugin, RoguesDenConfig config) + { + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_SCENE); + this.client = client; + this.plugin = plugin; + this.config = config; + } + + @Override + public Dimension render(Graphics2D graphics, java.awt.Point parent) + { + if (!config.enabled()) + { + return null; + } + + if (!plugin.isHasGem()) + { + return null; + } + + Point playerLocation = client.getLocalPlayer().getLocalLocation(); + + plugin.getObstaclesHull().forEach((obstacle, tile) -> + { + if (tile.getPlane() == client.getPlane() && obstacle.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE) + { + Polygon p = tile.getGameObjects()[0].getConvexHull(); + if (p != null) + { + graphics.setColor(Color.CYAN); + graphics.drawPolygon(p); + } + } + }); + + plugin.getObstaclesTile().forEach((obstacle, tile) -> + { + if (tile.getPlane() == client.getPlane() && obstacle.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE) + { + Polygon p = obstacle.getCanvasTilePoly(); + if (p != null) + { + graphics.setColor(Color.CYAN); + graphics.drawPolygon(p); + } + } + }); + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java new file mode 100644 index 0000000000..bf25a3e88e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2018, Shaun Dreclin + * 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.plugins.roguesden; + +import com.google.common.eventbus.Subscribe; +import com.google.inject.Binder; +import com.google.inject.Provides; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import javax.inject.Inject; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import static net.runelite.api.ItemID.MYSTIC_JEWEL; +import net.runelite.api.Tile; +import net.runelite.api.TileObject; +import net.runelite.api.events.GameObjectChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GroundObjectChanged; +import net.runelite.api.events.GroundObjectDespawned; +import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.task.Schedule; + +@PluginDescriptor( + name = "Rogues' Den plugin" +) +@Slf4j +public class RoguesDenPlugin extends Plugin +{ + @Getter(AccessLevel.PACKAGE) + private final HashMap obstaclesHull = new HashMap<>(); + + @Getter(AccessLevel.PACKAGE) + private final HashMap obstaclesTile = new HashMap<>(); + + @Getter(AccessLevel.PACKAGE) + private boolean hasGem; + + @Inject + private Client client; + + @Inject + @Getter + private RoguesDenOverlay overlay; + + @Inject + private RoguesDenConfig config; + + @Provides + RoguesDenConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(RoguesDenConfig.class); + } + + @Override + public void configure(Binder binder) + { + binder.bind(RoguesDenOverlay.class); + } + + @Schedule(period = 600, unit = ChronoUnit.MILLIS) + public void checkGem() + { + hasGem = hasGem(); + } + + private boolean hasGem() + { + ItemContainer container = client.getItemContainer(InventoryID.INVENTORY); + if (container == null) + { + return false; + } + + for (Item item : container.getItems()) + { + if (item.getId() == MYSTIC_JEWEL) + { + return true; + } + } + + return false; + } + + @Subscribe + public void GameObjectSpawned(GameObjectSpawned event) + { + onTileObject(event.getTile(), null, event.getGameObject()); + } + + @Subscribe + public void GameObjectChanged(GameObjectChanged event) + { + onTileObject(event.getTile(), event.getPrevious(), event.getGameObject()); + } + + @Subscribe + public void GameObjectDespawned(GameObjectDespawned event) + { + onTileObject(event.getTile(), event.getGameObject(), null); + } + + @Subscribe + public void GroundObjectSpawned(GroundObjectSpawned event) + { + onTileObject(event.getTile(), null, event.getGroundObject()); + } + + @Subscribe + public void GroundObjectChanged(GroundObjectChanged event) + { + onTileObject(event.getTile(), event.getPrevious(), event.getGroundObject()); + } + + @Subscribe + public void GroundObjectDespawned(GroundObjectDespawned event) + { + onTileObject(event.getTile(), event.getGroundObject(), null); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + if (event.getGameState() == GameState.LOADING) + { + obstaclesHull.clear(); + obstaclesTile.clear(); + } + } + + private void onTileObject(Tile tile, TileObject oldObject, TileObject newObject) + { + obstaclesHull.remove(oldObject); + if (newObject != null && Obstacles.OBSTACLE_IDS_HULL.contains(newObject.getId())) + { + obstaclesHull.put(newObject, tile); + } + + obstaclesTile.remove(oldObject); + if (newObject != null && Obstacles.OBSTACLE_IDS_TILE.contains(newObject.getId())) + { + obstaclesTile.put(newObject, tile); + } + } +}