From 8698de72b13351719ebd078599a3d520782a5dee Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 18 Feb 2018 17:59:28 -0500 Subject: [PATCH] runelite-client: add minimap dot plugin --- .../main/java/net/runelite/api/Client.java | 4 + .../client/plugins/minimap/MinimapConfig.java | 97 ++++++++++++ .../client/plugins/minimap/MinimapDot.java | 78 ++++++++++ .../client/plugins/minimap/MinimapPlugin.java | 142 ++++++++++++++++++ .../java/net/runelite/rs/api/RSClient.java | 7 + 5 files changed, 328 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapConfig.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index aa6368c08f..f95abfa874 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -155,6 +155,8 @@ public interface Client extends GameEngine Area[] getMapAreas(); IndexedSprite[] getMapScene(); + + SpritePixels[] getMapDots(); int getGameCycle(); @@ -166,6 +168,8 @@ public interface Client extends GameEngine IndexedSprite createIndexedSprite(); + SpritePixels createSpritePixels(int[] pixels, int width, int height); + Point getSceneDestinationLocation(); List getProjectiles(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapConfig.java new file mode 100644 index 0000000000..886943f925 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapConfig.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2018, Dreyri + * 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.minimap; + +import java.awt.Color; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup( + keyName = "minimap", + name = "Minimap", + description = "Configuration for the minimap") +public interface MinimapConfig extends Config +{ + @ConfigItem( + keyName = "item", + name = "Item color", + description = "Set the minimap color items are drawn in" + ) + default Color itemColor() //mapdot 0 + { + return new Color(255, 0, 0); + } + + @ConfigItem( + keyName = "npc", + name = "NPC color", + description = "Set the minimap color NPCs are drawn in" + ) + default Color npcColor() //mapdot 1 + { + return new Color(255, 255, 0); + } + + @ConfigItem( + keyName = "player", + name = "Player color", + description = "Set the minimap Color players are drawn in" + ) + default Color playerColor() //mapdot 2 + { + return new Color(255, 255, 255); + } + + @ConfigItem( + keyName = "friend", + name = "Friends color", + description = "Set the minimap color your friends are drawn in" + ) + default Color friendColor() //mapdot 3 + { + return new Color(0, 255, 0); + } + + @ConfigItem( + keyName = "team", + name = "Team color", + description = "Set the minimap color your team is drawn in" + ) + default Color teamColor() //mapdot 4 + { + return new Color(19, 110, 247); + } + + @ConfigItem( + keyName = "clan", + name = "Clan color", + description = "Set the minimap color your clan is drawn in" + ) + default Color clanColor() //mapdot 5 + { + return new Color(170, 0, 190); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java new file mode 100644 index 0000000000..01d95312d9 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapDot.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2018, Dreyri + * 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.minimap; + +import java.awt.Color; +import net.runelite.api.Client; +import net.runelite.api.SpritePixels; + +public class MinimapDot +{ + private static final int MAP_DOT_WIDTH = 4; + private static final int MAP_DOT_HEIGHT = 5; + + private static int[] createPixels(Color color) + { + int rgb = color.getRGB(); + + int[] pixels = new int[MAP_DOT_HEIGHT * MAP_DOT_WIDTH]; + + pixels[0] = 0; + pixels[1] = rgb; + pixels[2] = rgb; + pixels[3] = 0; + + pixels[4] = rgb; + pixels[5] = rgb; + pixels[6] = rgb; + pixels[7] = rgb; + + pixels[8] = rgb; + pixels[9] = rgb; + pixels[10] = rgb; + pixels[11] = rgb; + + pixels[12] = 1; + pixels[13] = rgb; + pixels[14] = rgb; + pixels[15] = 1; + + pixels[16] = 0; + pixels[17] = 1; + pixels[18] = 1; + pixels[19] = 0; + + return pixels; + } + + public static SpritePixels create(Client client, Color color) + { + int[] pixels = createPixels(color); + + SpritePixels dotSprite = client.createSpritePixels(pixels, MAP_DOT_WIDTH, MAP_DOT_HEIGHT); + + return dotSprite; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java new file mode 100644 index 0000000000..bc9a404d8c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/minimap/MinimapPlugin.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2018, Dreyri + * 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.minimap; + +import com.google.common.eventbus.Subscribe; +import com.google.inject.Provides; +import java.awt.Color; +import java.util.Arrays; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.SpritePixels; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; + +@PluginDescriptor( + name = "Minimap" +) +public class MinimapPlugin extends Plugin +{ + private static final int NUM_MAPDOTS = 6; + + @Inject + private Client client; + + @Inject + private MinimapConfig config; + + private SpritePixels[] originalDotSprites; + + @Provides + private MinimapConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(MinimapConfig.class); + } + + @Override + protected void startUp() throws Exception + { + storeOriginalDots(); + replaceMapDots(); + } + + @Override + protected void shutDown() throws Exception + { + restoreOriginalDots(); + } + + @Subscribe + public void onGameStateChange(GameStateChanged event) + { + if (event.getGameState() == GameState.LOGIN_SCREEN && originalDotSprites == null) + { + storeOriginalDots(); + replaceMapDots(); + } + } + + private Color[] getColors() + { + Color[] colors = new Color[NUM_MAPDOTS]; + colors[0] = config.itemColor(); + colors[1] = config.npcColor(); + colors[2] = config.playerColor(); + colors[3] = config.friendColor(); + colors[4] = config.teamColor(); + colors[5] = config.clanColor(); + return colors; + } + + private void storeOriginalDots() + { + SpritePixels[] originalDots = client.getMapDots(); + + if (originalDots == null) + { + return; + } + + originalDotSprites = Arrays.copyOf(originalDots, originalDots.length); + } + + public void restoreOriginalDots() + { + SpritePixels[] mapDots = client.getMapDots(); + System.arraycopy(originalDotSprites, 0, mapDots, 0, mapDots.length); + } + + @Subscribe + public void configChanged(ConfigChanged event) + { + if (!event.getGroup().equals("minimap")) + { + return; + } + + replaceMapDots(); + } + + private void replaceMapDots() + { + SpritePixels[] mapDots = client.getMapDots(); + + if (mapDots == null) + { + return; + } + + Color[] minimapDotColors = getColors(); + for (int i = 0; i < mapDots.length && i < minimapDotColors.length; ++i) + { + mapDots[i] = MinimapDot.create(this.client, minimapDotColors[i]); + } + } + +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 8c951b5d53..5c0f0011a6 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -315,6 +315,9 @@ public interface RSClient extends RSGameEngine, Client @Override RSSpritePixels[] getMapIcons(); + @Import("mapDots") + RSSpritePixels[] getMapDots(); + @Import("modIcons") @Override RSIndexedSprite[] getModIcons(); @@ -326,6 +329,10 @@ public interface RSClient extends RSGameEngine, Client @Override RSIndexedSprite createIndexedSprite(); + @Construct + @Override + RSSpritePixels createSpritePixels(int[] pixels, int width, int height); + @Import("destinationX") int getDestinationX();