From 4433eb384b5ec7ab84af102a9d66b086cc5606e5 Mon Sep 17 00:00:00 2001 From: dekvall Date: Wed, 19 Feb 2020 23:50:31 +0100 Subject: [PATCH 01/16] attackstyles: fix salamander magic attacks The magic attack style is the defensive option for salamanders but the xp gained is added to the magic skill entirely. --- .../net/runelite/client/plugins/attackstyles/WeaponType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/WeaponType.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/WeaponType.java index 0a0e443d55..de71de2424 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/WeaponType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/WeaponType.java @@ -44,7 +44,7 @@ enum WeaponType TYPE_3(RANGING, RANGING, null, LONGRANGE), TYPE_4(ACCURATE, AGGRESSIVE, CONTROLLED, DEFENSIVE), TYPE_5(RANGING, RANGING, null, LONGRANGE), - TYPE_6(AGGRESSIVE, RANGING, DEFENSIVE_CASTING, null), + TYPE_6(AGGRESSIVE, RANGING, CASTING, null), TYPE_7(RANGING, RANGING, null, LONGRANGE), TYPE_8(OTHER, AGGRESSIVE, null, null), TYPE_9(ACCURATE, AGGRESSIVE, CONTROLLED, DEFENSIVE), From e77860ab4ce91fa3b34870c6918db8e33d5dfbe7 Mon Sep 17 00:00:00 2001 From: DeliciousLunch55 Date: Thu, 20 Feb 2020 21:00:08 -0600 Subject: [PATCH 02/16] clue plugin: Improve Shilo Village elite coordinate clue hint --- .../client/plugins/cluescrolls/clues/CoordinateClue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java index c9c7ea66c8..88cf082d13 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -167,7 +167,7 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(2820, 3078, 0), new CoordinateClueInfo("Tai Bwo Wannai. Hardwood Grove.")) .put(new WorldPoint(3811, 3060, 0), new CoordinateClueInfo("Small island north-east of Mos Le'Harmless.", true, Varbits.FIRE_PIT_MOS_LE_HARMLESS)) .put(new WorldPoint(2180, 3282, 0), new CoordinateClueInfo("North of Iorwerth Camp.")) - .put(new WorldPoint(2870, 2997, 0), new CoordinateClueInfo("North-east of Shilo Village.")) + .put(new WorldPoint(2870, 2997, 0), new CoordinateClueInfo("North-east corner in Shilo Village.")) .put(new WorldPoint(3302, 2988, 0), new CoordinateClueInfo("On top of a cliff to the west of Pollnivneach.")) .put(new WorldPoint(2511, 2980, 0), new CoordinateClueInfo("Just south of Gu'Tanoth, west of gnome glider.")) .put(new WorldPoint(2732, 3372, 0), new CoordinateClueInfo("Legends' Guild.")) From a5a51ef7dd1792371b785db349cd28612425ea32 Mon Sep 17 00:00:00 2001 From: dekvall Date: Tue, 18 Feb 2020 22:26:05 +0100 Subject: [PATCH 03/16] worldmap: support multiline tooltips --- .../ui/overlay/worldmap/WorldMapOverlay.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java index a8621770a2..ccbb27d676 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/worldmap/WorldMapOverlay.java @@ -24,6 +24,7 @@ */ package net.runelite.client.ui.overlay.worldmap; +import com.google.common.base.Splitter; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; @@ -55,6 +56,8 @@ public class WorldMapOverlay extends Overlay private static final int TOOLTIP_PADDING_HEIGHT = 1; private static final int TOOLTIP_PADDING_WIDTH = 2; + private static final Splitter TOOLTIP_SPLITTER = Splitter.on("
").trimResults().omitEmptyStrings(); + private final WorldMapPointManager worldMapPointManager; private final Client client; @@ -260,6 +263,13 @@ public class WorldMapOverlay extends Overlay return; } + List rows = TOOLTIP_SPLITTER.splitToList(tooltip); + + if (rows.isEmpty()) + { + return; + } + drawPoint = new Point(drawPoint.getX() + TOOLTIP_OFFSET_WIDTH, drawPoint.getY() + TOOLTIP_OFFSET_HEIGHT); final Rectangle bounds = new Rectangle(0, 0, client.getCanvasWidth(), client.getCanvasHeight()); @@ -268,16 +278,20 @@ public class WorldMapOverlay extends Overlay graphics.setColor(JagexColors.TOOLTIP_BACKGROUND); graphics.setFont(FontManager.getRunescapeFont()); FontMetrics fm = graphics.getFontMetrics(); - int width = fm.stringWidth(tooltip); + int width = rows.stream().map(fm::stringWidth).max(Integer::compareTo).get(); 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); + Rectangle tooltipRect = new Rectangle(drawPoint.getX() - TOOLTIP_PADDING_WIDTH, drawPoint.getY() - TOOLTIP_PADDING_HEIGHT, width + TOOLTIP_PADDING_WIDTH * 2, height * rows.size() + TOOLTIP_PADDING_HEIGHT * 2); graphics.fillRect((int) tooltipRect.getX(), (int) tooltipRect.getY(), (int) tooltipRect.getWidth(), (int) tooltipRect.getHeight()); graphics.setColor(JagexColors.TOOLTIP_BORDER); graphics.drawRect((int) tooltipRect.getX(), (int) tooltipRect.getY(), (int) tooltipRect.getWidth(), (int) tooltipRect.getHeight()); + graphics.setColor(JagexColors.TOOLTIP_TEXT); - graphics.drawString(tooltip, drawPoint.getX(), drawPoint.getY() + height); + for (int i = 0; i < rows.size(); i++) + { + graphics.drawString(rows.get(i), drawPoint.getX(), drawPoint.getY() + (i + 1) * height); + } } private Point clipToRectangle(Point drawPoint, Rectangle mapDisplayRectangle) From 164baf4e2c8c7727d41c09be9c9128fa3df79516 Mon Sep 17 00:00:00 2001 From: dekvall Date: Tue, 18 Feb 2020 20:22:42 +0100 Subject: [PATCH 04/16] worldmap: add informative mining site tooltip --- .../plugins/worldmap/MiningSiteLocation.java | 272 ++++++++++++++++++ .../plugins/worldmap/MiningSitePoint.java | 38 +++ .../plugins/worldmap/WorldMapConfig.java | 13 +- .../plugins/worldmap/WorldMapPlugin.java | 14 + .../plugins/worldmap/mining_site_icon.png | Bin 0 -> 224 bytes 5 files changed, 336 insertions(+), 1 deletion(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSitePoint.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/mining_site_icon.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java new file mode 100644 index 0000000000..f52ba791bb --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2020, dekvall + * 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 HOLDER 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.worldmap; + +import com.google.common.base.Joiner; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Value; +import net.runelite.api.coords.WorldPoint; + +@Getter +enum MiningSiteLocation +{ + AGILITY_PYRAMID(new WorldPoint(3322, 2875, 0), new Rock(5, Ore.GOLD)), + // ABANDONED_MINE -- NOT AVAILABLE ON WORLDMAP + AL_KHARID_MINE_NORTH(new WorldPoint(3298, 3312, 0), + new Rock(3, Ore.COPPER), new Rock(1, Ore.TIN), new Rock(7, Ore.IRON), new Rock(5, Ore.SILVER), + new Rock(3, Ore.COAL), new Rock(3, Ore.MITHRIL), new Rock(2, Ore.ADAMANTITE)), + AL_KHARID_MINE_SOUTH(new WorldPoint(3298, 3282, 0), new Rock(2, Ore.IRON), new Rock(2, Ore.GOLD)), + ARANDAR(new WorldPoint(2322, 3269, 0), new Rock(8, Ore.LIMESTONE)), + ARCEUUS_NORTH(new WorldPoint(1763, 3860, 0), new Rock(1, Ore.DENSE_ESSENCE)), + ARCEUUS_SOUTH(new WorldPoint(1763, 3844, 0), new Rock(1, Ore.DENSE_ESSENCE)), + ARDOUGNE_SEWERS(new WorldPoint(2670, 9680, 0), new Rock(5, Ore.IRON), new Rock(5, Ore.COAL)), + ARDOUGNE_SOUTH_EAST(new WorldPoint(2599, 3232, 0), new Rock(6, Ore.IRON), new Rock(4, Ore.COAL)), + // ARZINIAN_MINE -- NOT AVAILABLE ON WORLD MAP + ASGARNIA_ICE_DUNGEON_EAST(new WorldPoint(3063, 9582, 0), new Rock(2, Ore.BLURITE)), + ASGARNIA_ICE_DUNGEON_WEST(new WorldPoint(3049, 9568, 0), new Rock(2, Ore.BLURITE)), + BANDIT_CAMP_MINE(new WorldPoint(3086, 3763, 0), new Rock(16, Ore.IRON), new Rock(20, Ore.COAL), new Rock(22, Ore.MITHRIL), new Rock(8, Ore.ADAMANTITE)), + BANDIT_CAMP_QUARRY(new WorldPoint(3171, 2912, 0), new Rock(4, Ore.CLAY), new Rock(2, Ore.COAL), new Rock(32, Ore.SANDSTONE), new Rock(28, Ore.GRANITE)), + BARBARIAN_VILLAGE(new WorldPoint(3078, 3421, 0), new Rock(5, Ore.TIN), new Rock(4, Ore.COAL)), + BATTLEFIELD(new WorldPoint(2471, 3255, 0), new Rock(2, Ore.COPPER), new Rock(1, Ore.TIN)), + BLAST_MINE_EAST(new WorldPoint(1502, 3869, 0), new Rock(20, Ore.HARD_ROCK)), + BLAST_MINE_NORTH(new WorldPoint(1485, 3882, 0), new Rock(17, Ore.HARD_ROCK)), + BLAST_MINE_WEST(new WorldPoint(1471, 3865, 0), new Rock(22, Ore.HARD_ROCK)), + BRIMHAVEN_NORTH(new WorldPoint(2732, 3225, 0), new Rock(10, Ore.GOLD)), + BRIMHAVEN_SOUTH_(new WorldPoint(2743, 3150, 0), new Rock(6, Ore.GOLD)), + CENTRAL_FREMENIK_ISLES(new WorldPoint(2374, 3850, 0), new Rock(7, Ore.COAL), new Rock(1, Ore.RUNITE)), + COAL_TRUCKS(new WorldPoint(2580, 3484, 0), new Rock(18, Ore.COAL)), + CRAFTING_GUILD(new WorldPoint(2939, 3283, 0), new Rock(6, Ore.CLAY), new Rock(6, Ore.SILVER), new Rock(7, Ore.GOLD)), + CRANDOR_NORTH_EAST(new WorldPoint(2860, 3287, 0), new Rock(3, Ore.GOLD)), + CRANDOR_NORTH_WEST(new WorldPoint(2831, 3296, 0), new Rock(7, Ore.COAL), new Rock(1, Ore.MITHRIL)), + CRANDOR_SOUTH_EAST(new WorldPoint(2835, 3245, 0), new Rock(3, Ore.COAL), new Rock(3, Ore.ADAMANTITE)), + CRANDOR_SOUTH_WEST(new WorldPoint(2819, 3247, 0), new Rock(7, Ore.MITHRIL)), + DESERT_MINING_CAMP_SURFACE(new WorldPoint(3299, 3021, 0), true, new Rock(4, Ore.COPPER), new Rock(4, Ore.TIN), new Rock(3, Ore.IRON), new Rock(4, Ore.COAL)), + // DESERT_MINING_CAMP_UNDERGROUND -- NOT AVAILABLE ON WORLDMAP + DORGESH_KAAN_NORTH(new WorldPoint(3309, 9645, 0), new Rock(1, Ore.IRON), new Rock(9, Ore.SILVER)), + DORGESH_KAAN_SOUTH_EAST(new WorldPoint(3322, 9616, 0), new Rock(3, Ore.IRON)), + DORGESH_KAAN_SOUTH_WEST(new WorldPoint(3312, 9621, 0), new Rock(3, Ore.IRON)), + DORGESH_KAAN_WEST(new WorldPoint(3311, 9628, 0), new Rock(3, Ore.IRON), new Rock(2, Ore.SILVER)), + DWARVEN_EAST_BOTTOM(new WorldPoint(3039, 9763, 0), + new Rock(5, Ore.TIN), new Rock(2, Ore.IRON), new Rock(8, Ore.COAL), new Rock(2, Ore.GOLD), new Rock(1, Ore.ADAMANTITE)), + DWARVEN_EAST_MIDDLE(new WorldPoint(3037, 9775, 0), + new Rock(4, Ore.COPPER), new Rock(3, Ore.IRON), new Rock(3, Ore.COAL), new Rock(2, Ore.MITHRIL), new Rock(2, Ore.ADAMANTITE)), + DWARVEN_EAST_TOP(new WorldPoint(3051, 9820, 0), new Rock(2, Ore.CLAY), new Rock(3, Ore.TIN), new Rock(2, Ore.IRON)), + DWARVEN_WEST_BOTTOM(new WorldPoint(3028, 9809, 0), new Rock(3, Ore.CLAY), new Rock(4, Ore.COPPER)), + DWARVEN_WEST_TOP(new WorldPoint(3031, 9828, 0), new Rock(3, Ore.COPPER), new Rock(2, Ore.TIN), new Rock(2, Ore.IRON)), + FREMENIK_ISLES_EAST(new WorldPoint(2405, 3867, 0), new Rock(3, Ore.COPPER), new Rock(3, Ore.TIN), new Rock(4, Ore.COAL)), + EDGEVILLE_DUNGEON(new WorldPoint(3138, 9874, 0), + new Rock(2, Ore.COPPER), new Rock(2, Ore.TIN), new Rock(3, Ore.IRON), new Rock(3, Ore.SILVER), + new Rock(6, Ore.COAL), new Rock(1, Ore.MITHRIL), new Rock(2, Ore.ADAMANTITE)), + // EVIL_CHICKEN_LAIR -- NOT AVAILABLE ON WORLD MAP + FALADOR_WEST(new WorldPoint(2907, 3362, 0), + new Rock(2, Ore.COPPER), new Rock(6, Ore.TIN), new Rock(3, Ore.IRON), new Rock(2, Ore.COAL)), + FELDIP_HILLS_EAST(new WorldPoint(2638, 2996, 0), new Rock(3, Ore.ROCK)), + FELDIP_HILLS_MIDDLE(new WorldPoint(2579, 2998, 0), new Rock(4, Ore.ROCK)), + FELDIP_HILLS_WEST(new WorldPoint(2567, 2961, 0), new Rock(3, Ore.ROCK)), + FIGHT_ARENA(new WorldPoint(2630, 3142, 0), + new Rock(4, Ore.CLAY), new Rock(2, Ore.COPPER), new Rock(7, Ore.TIN), new Rock(9, Ore.IRON), + new Rock(1, Ore.COAL), new Rock(2, Ore.MITHRIL)), + FOSSIL_ISLAND(new WorldPoint(3770, 3815, 0), + new Rock(7, Ore.IRON), new Rock(20, Ore.COAL), new Rock(3, Ore.MITHRIL), new Rock(5, Ore.ADAMANTITE), + new Rock(2, Ore.RUNITE)), + FREMENNIK_ISLES_WEST(new WorldPoint(2310, 3853, 0), new Rock(3, Ore.COPPER)), + FROZEN_WASTE_PLATEU_CENTER(new WorldPoint(2963, 3933, 0), new Rock(1, Ore.RUNITE)), + FROZEN_WASTE_PLATEU_NORTH(new WorldPoint(2975, 3937, 0), new Rock(1, Ore.RUNITE)), + FROZEN_WASTE_PLATEU_SOUTH(new WorldPoint(2947, 3914, 0), new Rock(1, Ore.RUNITE)), + GRAND_TREE(new WorldPoint(2489, 9916, 0), + new Rock(9, Ore.CLAY), new Rock(8, Ore.IRON), new Rock(4, Ore.SILVER), new Rock(11, Ore.COAL), + new Rock(4, Ore.GOLD), new Rock(4, Ore.MITHRIL), new Rock(3, Ore.ADAMANTITE)), + GWENITH(new WorldPoint(2163, 3415, 0), new Rock(10, Ore.GOLD)), + HEROES_GUILD_EAST_BOTTOM(new WorldPoint(2939, 9898, 0), new Rock(3, Ore.COAL), new Rock(2, Ore.RUNITE)), + HEROES_GUILD_EAST_TOP(new WorldPoint(2940, 9884, 0), new Rock(5, Ore.COAL)), + HEROES_GUILD_WEST_BOTTOM(new WorldPoint(2921, 9904, 0), new Rock(3, Ore.COAL)), + HEROES_GUILD_WEST_TOP(new WorldPoint(2914, 9916, 0), new Rock(2, Ore.MITHRIL), new Rock(2, Ore.ADAMANTITE)), + HOSIDIUS_MINE(new WorldPoint(1777, 3489, 0), + new Rock(10, Ore.CLAY), new Rock(11, Ore.COPPER), new Rock(4, Ore.TIN), new Rock(9, Ore.IRON), + new Rock(2, Ore.SILVER)), + ISAFDAR(new WorldPoint(2277, 3159, 0), new Rock(4, Ore.ADAMANTITE), new Rock(2, Ore.RUNITE)), + JATIZSO(new WorldPoint(2396, 3812, 0), + new Rock(11, Ore.TIN), new Rock(7, Ore.IRON), new Rock(8, Ore.COAL), new Rock(15, Ore.MITHRIL), + new Rock(11, Ore.ADAMANTITE)), + KARAMJA_JUNGLE(new WorldPoint(2848, 3033, 0), + new Rock(1, Ore.IRON), new Rock(1, Ore.SILVER), new Rock(1, Ore.COAL), new Rock(2, Ore.MITHRIL), + new Rock(2, Ore.ADAMANTITE)), + KARAMJA_VOLCANO(new WorldPoint(2856, 9579, 0), new Rock(4, Ore.GOLD)), + KEBOS_LOWLANDS(new WorldPoint(1211, 3657, 0), new Rock(9, Ore.IRON), new Rock(2, Ore.MITHRIL)), + KELDAGRIM_ENTRANCE(new WorldPoint(2724, 3693, 0), new Rock(9, Ore.IRON), new Rock(2, Ore.MITHRIL)), + KELDAGRIM_NORTH_EAST(new WorldPoint(2937, 10232, 0), new Rock(9, Ore.COAL)), + KELDAGRIM_SOUTH_WEST_BOTTOM(new WorldPoint(2872, 10119, 0), new Rock(2, Ore.COPPER), new Rock(5, Ore.COAL)), + KELDAGRIM_SOUTH_WEST_MIDDLE(new WorldPoint(2818, 10156, 0), new Rock(4, Ore.IRON), new Rock(1, Ore.GOLD)), + KELDAGRIM_SOUTH_WEST_TOP(new WorldPoint(2864, 10170, 0), new Rock(5, Ore.TIN)), + LAVA_MAZE_DUNGEON(new WorldPoint(3045, 10263, 0), true, new Rock(1, Ore.RUNITE)), + LAVA_MAZE_NORTH(new WorldPoint(3059, 3884, 0), new Rock(2, Ore.RUNITE)), + LEGENDS_GUILD_EAST(new WorldPoint(2709, 3331, 0), new Rock(6, Ore.IRON), new Rock(8, Ore.COAL)), + LEGENDS_GUILD_WEST(new WorldPoint(2694, 3332, 0), new Rock(5, Ore.IRON), new Rock(5, Ore.COAL)), + LOVAKENGJ_SOUTH(new WorldPoint(1476, 3779, 0), new Rock(4, Ore.IRON), new Rock(6, Ore.COAL), new Rock(1, Ore.MITHRIL)), + LOVAKENGJ_SULPHUR_EAST(new WorldPoint(1445, 3870, 0), new Rock(3, Ore.VOLCANIC_SULPHUR)), + LOVAKENGJ_SULPHUR_WEST(new WorldPoint(1427, 3870, 0), new Rock(2, Ore.VOLCANIC_SULPHUR)), + LOVAKENGJ_WEST(new WorldPoint(1432, 3845, 0), true, new Rock(45, Ore.COAL), new Rock(80, Ore.LOVAKITE)), + LUMBRIDGE_SWAMP_EAST(new WorldPoint(3226, 3146, 0), new Rock(5, Ore.COPPER), new Rock(5, Ore.TIN)), + LUMBRIDGE_SWAMP_WEST(new WorldPoint(3148, 3149, 0), + new Rock(7, Ore.COAL), new Rock(5, Ore.MITHRIL), new Rock(2, Ore.ADAMANTITE)), + // Lunar Isle Dungeon: Starting north-east and going clockwise + LUNAR_ISLE_1(new WorldPoint(2163, 10347, 0), + new Rock(2, Ore.SILVER), new Rock(1, Ore.GOLD), new Rock(1, Ore.GEM_ROCK), new Rock(6, Ore.LUNAR)), + LUNAR_ISLE_2(new WorldPoint(2165, 10325, 0), new Rock(3, Ore.GEM_ROCK), new Rock(4, Ore.LUNAR)), + LUNAR_ISLE_3(new WorldPoint(2140, 10318, 0), new Rock(3, Ore.SILVER), new Rock(3, Ore.LUNAR)), + LUNAR_ISLE_4(new WorldPoint(2125, 10327, 0), new Rock(4, Ore.GOLD), new Rock(1, Ore.LUNAR)), + LUNAR_ISLE_5(new WorldPoint(2124, 10342, 0), new Rock(2, Ore.GOLD), new Rock(5, Ore.LUNAR)), + MINING_GUILD_AMETHYST(new WorldPoint(3022, 9704, 0), new Rock(26, Ore.AMETHYST)), + MINING_GUILD_NORTH(new WorldPoint(3040, 9740, 0), + new Rock(4, Ore.IRON), new Rock(37, Ore.COAL), new Rock(5, Ore.MITHRIL), new Rock(2, Ore.ADAMANTITE)), + MINING_GUILD_SOUTH(new WorldPoint(3032, 9720, 0), + new Rock(8, Ore.IRON), new Rock(20, Ore.COAL), new Rock(10, Ore.MITHRIL), new Rock(8, Ore.ADAMANTITE), + new Rock(2, Ore.RUNITE)), + MISCELLANIA(new WorldPoint(2526, 3891, 0), new Rock(9, Ore.COAL)), + MISCELLANIA_DUNGEON(new WorldPoint(2504, 10287, 0), new Rock(4, Ore.COAL)), + MOR_UL_REK_NORTH(new WorldPoint(2458, 5167, 0), new Rock(3, Ore.SILVER), new Rock(3, Ore.GOLD)), + MOR_UL_REK_SOUTH_EAST(new WorldPoint(2513, 5074, 0), new Rock(6, Ore.SILVER), new Rock(7, Ore.GOLD)), + MOR_UL_REK_SOUTH_WEST(new WorldPoint(2499, 5062, 0), + new Rock(3, Ore.IRON), new Rock(4, Ore.COAL), new Rock(2, Ore.ADAMANTITE), new Rock(3, Ore.RUNITE)), + MOUNT_KARUULM(new WorldPoint(1278, 3814, 0), new Rock(6, Ore.IRON), new Rock(5, Ore.COAL)), + // MOURNER_TUNNELS -- NOT AVAILABLE ON WORLD MAP + MYTHS_GUILD(new WorldPoint(1936, 9020, 0), new Rock(4, Ore.ADAMANTITE), new Rock(2, Ore.RUNITE)), + OGRESS_SETTLEMENT(new WorldPoint(1977, 9041, 0), + new Rock(5, Ore.COAL), new Rock(2, Ore.MITHRIL), new Rock(1, Ore.ADAMANTITE)), + PIRATES_HIDEOUT(new WorldPoint(3056, 3945, 0), + new Rock(1, Ore.IRON), new Rock(4, Ore.COAL), new Rock(4, Ore.MITHRIL), new Rock(1, Ore.ADAMANTITE)), + PISCARILLIUS(new WorldPoint(1759, 3718, 0), + new Rock(5, Ore.COPPER), new Rock(6, Ore.TIN), new Rock(5, Ore.IRON), new Rock(2, Ore.SILVER), + new Rock(1, Ore.MITHRIL)), + PISCATORIS(new WorldPoint(2337, 3640, 0), + new Rock(2, Ore.CLAY), new Rock(2, Ore.COPPER), new Rock(2, Ore.TIN), new Rock(3, Ore.IRON)), + PORT_KHAZARD(new WorldPoint(2651, 3172, 0), + new Rock(2, Ore.COPPER), new Rock(2, Ore.TIN), new Rock(2, Ore.MITHRIL)), + RELLEKKA(new WorldPoint(2682, 3704, 0), new Rock(4, Ore.CLAY), new Rock(3, Ore.SILVER), new Rock(7, Ore.COAL)), + RIMMINGTON(new WorldPoint(2977, 3240, 0), + new Rock(2, Ore.CLAY), new Rock(5, Ore.COPPER), new Rock(2, Ore.TIN), new Rock(6, Ore.IRON), + new Rock(2, Ore.GOLD)), + SALT_MINE(new WorldPoint(2835, 10334, 0), + new Rock(7, Ore.BASALT), new Rock(15, Ore.TE_SALT), new Rock(12, Ore.EFH_SALT), new Rock(12, Ore.URT_SALT)), + SHAYZIEN_EAST(new WorldPoint(1597, 3653, 0), new Rock(3, Ore.CLAY), new Rock(1, Ore.MITHRIL), new Rock(1, Ore.ADAMANTITE)), + SHAYZIEN_WEST(new WorldPoint(1586, 3650, 0), + new Rock(4, Ore.IRON), new Rock(4, Ore.COAL), new Rock(1, Ore.MITHRIL), new Rock(1, Ore.ADAMANTITE)), + SHILO_VILLAGE_SURFACE(new WorldPoint(2822, 3001, 0), new Rock(7, Ore.GEM_ROCK)), + SILVAREA(new WorldPoint(3371, 3498, 0), new Rock(7, Ore.LIMESTONE)), + SLEPE_UNDERGROUND(new WorldPoint(3888, 9749, 0), new Rock(6, Ore.IRON), new Rock(14, Ore.COAL)), + TRAHEARN(new WorldPoint(3295, 12387, 0), + new Rock(26, Ore.IRON), new Rock(8, Ore.SILVER), new Rock(19, Ore.COAL), new Rock(14, Ore.GOLD), + new Rock(7, Ore.MITHRIL), new Rock(10, Ore.SOFT_CLAY), new Rock(7, Ore.ADAMANTITE), new Rock(4, Ore.RUNITE)), + // TUTORIAL ISLAND -- NOT AVAILABLE ON WORLD MAP + UZER(new WorldPoint(3415, 3160, 0), new Rock(10, Ore.CLAY)), + VARROCK_SOUTH_EAST(new WorldPoint(3286, 3365, 0), + new Rock(9, Ore.COPPER), new Rock(6, Ore.TIN), new Rock(4, Ore.IRON)), + VARROCK_SOUTH_WEST(new WorldPoint(3176, 3370, 0), + new Rock(3, Ore.CLAY), new Rock(8, Ore.TIN), new Rock(3, Ore.IRON), new Rock(3, Ore.SILVER)), + VERDANT_VALLEY(new WorldPoint(3766, 3757, 0), true, new Rock(3, Ore.IRON)), + WILDERNESS_RESOURCE_AREA(new WorldPoint(3192, 3930, 0), + new Rock(6, Ore.IRON), new Rock(11, Ore.COAL), new Rock(4, Ore.GOLD), new Rock(1, Ore.MITHRIL), new Rock(6, Ore.ADAMANTITE)), + WILDERNESS_SOUTH(new WorldPoint(3104, 3569, 0), new Rock(2, Ore.IRON), new Rock(3, Ore.COAL)), + WILDERNESS_SOUTH_WEST(new WorldPoint(3013, 3589, 0), new Rock(34, Ore.COAL)), + ; + + private final WorldPoint location; + private final String tooltip; + private final boolean iconRequired; + + MiningSiteLocation(WorldPoint location, Rock... rocks) + { + this(location, false, rocks); + } + + MiningSiteLocation(WorldPoint location, boolean iconRequired, Rock... rocks) + { + this.location = location; + this.iconRequired = iconRequired; + this.tooltip = createTooltip(rocks); + } + + private String createTooltip(Rock[] rocks) + { + return Joiner.on("
").join(rocks); + } + + @RequiredArgsConstructor + private enum Ore + { + ROCK("Rock"), + CLAY("Clay"), + COPPER("Copper"), + TIN("Tin"), + LIMESTONE("Limestone"), + BLURITE("Blurite"), + IRON("Iron"), + ELEMENTAL("Elemental"), + SILVER("Silver"), + COAL("Coal"), + SANDSTONE("Sandstone"), + DENSE_ESSENCE("Dense essence"), + GOLD("Gold"), + GEM_ROCK("Gem rock"), + HARD_ROCK("Hard rock"), + VOLCANIC_SULPHUR("Volcanic sulphur"), + GRANITE("Granite"), + MITHRIL("Mithril"), + LUNAR("Lunar"), + LOVAKITE("Lovakite"), + ADAMANTITE("Adamantite"), + SOFT_CLAY("Soft clay"), + BASALT("Basalt"), + TE_SALT("Te salt"), + EFH_SALT("Efh salt"), + URT_SALT("Urt salt"), + RUNITE("Runite"), + AMETHYST("Amethyst"), + ; + + private final String name; + + @Override + public String toString() + { + return name; + } + } + + @Value + private static class Rock + { + private final int count; + private final Ore ore; + + @Override + public String toString() + { + return count + " " + ore; + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSitePoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSitePoint.java new file mode 100644 index 0000000000..3a09a1b298 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSitePoint.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020, dekvall + * 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 HOLDER 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.worldmap; + +import java.awt.image.BufferedImage; +import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; + +class MiningSitePoint extends WorldMapPoint +{ + MiningSitePoint(MiningSiteLocation point, BufferedImage icon) + { + super(point.getLocation(), icon); + setTooltip(point.getTooltip()); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java index 4070a77b1a..50d5312d82 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java @@ -229,4 +229,15 @@ public interface WorldMapConfig extends Config { return true; } -} \ No newline at end of file + + @ConfigItem( + keyName = WorldMapPlugin.CONFIG_KEY_MINING_SITE_TOOLTIPS, + name = "Show mining site tooltips", + description = "Indicates the ore available at mining sites", + position = 19 + ) + default boolean miningSiteTooltips() + { + return true; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index 37ff9a5192..b8e8293ad7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -60,6 +60,7 @@ public class WorldMapPlugin extends Plugin private static final BufferedImage NOT_STARTED_ICON; private static final BufferedImage STARTED_ICON; private static final BufferedImage FINISHED_ICON; + private static final BufferedImage MINING_SITE_ICON; static final String CONFIG_KEY = "worldmap"; static final String CONFIG_KEY_FAIRY_RING_TOOLTIPS = "fairyRingTooltips"; @@ -80,6 +81,7 @@ public class WorldMapPlugin extends Plugin static final String CONFIG_KEY_RARE_TREE_LEVEL_ICON = "rareTreeIcon"; static final String CONFIG_KEY_TRANSPORATION_TELEPORT_TOOLTIPS = "transportationTooltips"; static final String CONFIG_KEY_RUNECRAFTING_ALTAR_ICON = "runecraftingAltarIcon"; + static final String CONFIG_KEY_MINING_SITE_TOOLTIPS = "miningSiteTooltips"; static { @@ -110,6 +112,10 @@ public class WorldMapPlugin extends Plugin FINISHED_ICON = new BufferedImage(questIconBufferSize, questIconBufferSize, BufferedImage.TYPE_INT_ARGB); final BufferedImage finishedIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "quest_completed_icon.png"); FINISHED_ICON.getGraphics().drawImage(finishedIcon, 4, 4, null); + + MINING_SITE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); + final BufferedImage miningSiteIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "mining_site_icon.png"); + MINING_SITE_ICON.getGraphics().drawImage(miningSiteIcon, 1, 1, null); } @Inject @@ -314,6 +320,14 @@ public class WorldMapPlugin extends Plugin .map(RunecraftingAltarPoint::new) .forEach(worldMapPointManager::add); } + + worldMapPointManager.removeIf(MiningSitePoint.class::isInstance); + if (config.miningSiteTooltips()) + { + Arrays.stream(MiningSiteLocation.values()) + .map(value -> new MiningSitePoint(value, value.isIconRequired() ? MINING_SITE_ICON : BLANK_ICON)) + .forEach(worldMapPointManager::add); + } } private void updateQuestStartPointIcons() diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/mining_site_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/mining_site_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..19fb3a901abdac57d8813207b8d3380768456bdb GIT binary patch literal 224 zcmV<603ZK}P)qtLvUzJNJ#jfm6HwDgpP3-fN3iT zgA78}3=%`rjNOkQJSD~ce?z1W+$Dkj{^+(d;?mh_iOk2)4AU5>!G)p_Su>UphZunFRCMoP32oF6$EA_zghHZ5iqkgf axe5TZEwBW|EwSqW0000 Date: Sat, 22 Feb 2020 16:54:17 -0500 Subject: [PATCH 05/16] configmanager: harden against being killed mid-save This first writes to a temporary file, then if successful, attempts an atomic rename --- .../runelite/client/config/ConfigManager.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index b76849be96..88c4a2e18a 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -41,8 +41,11 @@ import java.io.OutputStreamWriter; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; -import java.nio.channels.FileLock; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.AtomicMoveNotSupportedException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Duration; @@ -61,10 +64,10 @@ import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.coords.WorldPoint; -import net.runelite.client.events.ConfigChanged; import net.runelite.client.RuneLite; import net.runelite.client.account.AccountSession; import net.runelite.client.eventbus.EventBus; +import net.runelite.client.events.ConfigChanged; import net.runelite.client.util.ColorUtil; import net.runelite.http.api.config.ConfigClient; import net.runelite.http.api.config.ConfigEntry; @@ -324,20 +327,27 @@ public class ConfigManager private void saveToFile(final File propertiesFile) throws IOException { - propertiesFile.getParentFile().mkdirs(); + File parent = propertiesFile.getParentFile(); - try (FileOutputStream out = new FileOutputStream(propertiesFile)) + parent.mkdirs(); + + File tempFile = new File(parent, SETTINGS_FILE_NAME + ".tmp"); + + try (FileOutputStream out = new FileOutputStream(tempFile)) { - final FileLock lock = out.getChannel().lock(); + out.getChannel().lock(); + properties.store(new OutputStreamWriter(out, StandardCharsets.UTF_8), "RuneLite configuration"); + // FileOutputStream.close() closes the associated channel, which frees the lock + } - try - { - properties.store(new OutputStreamWriter(out, Charset.forName("UTF-8")), "RuneLite configuration"); - } - finally - { - lock.release(); - } + try + { + Files.move(tempFile.toPath(), propertiesFile.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + } + catch (AtomicMoveNotSupportedException ex) + { + log.debug("atomic move not supported", ex); + Files.move(tempFile.toPath(), propertiesFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } } From abf055c9b8441a044aeb69a64613460f6fe9e016 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 22 Feb 2020 17:13:29 -0500 Subject: [PATCH 06/16] Merge protocol and protocol-api into cache-client Originally I was going to expand on the protocol further, but am no longer looking at doing that. --- cache-client/pom.xml | 12 +++- .../runelite/cache/client/CacheClient.java | 10 +-- .../client/HandshakeResponseHandler.java | 4 +- .../api/handshake/HandshakePacket.java | 0 .../handshake/HandshakeResponsePacket.java | 0 .../protocol/api/handshake/HandshakeType.java | 0 .../api/handshake/LoginHandshakePacket.java | 0 .../api/handshake/UpdateHandshakePacket.java | 0 .../api/login/HandshakeResponseType.java | 0 .../api/update/ArchiveRequestPacket.java | 0 .../api/update/ArchiveResponsePacket.java | 0 .../protocol/api/update/EncryptionPacket.java | 0 .../protocol/handshake/HandshakeDecoder.java | 0 .../handshake/HandshakeResponseEncoder.java | 0 .../handshake/LoginHandshakeEncoder.java | 0 .../handshake/UpdateHandshakeEncoder.java | 0 .../decoders/ArchiveRequestDecoder.java | 0 .../decoders/ArchiveResponseDecoder.java | 0 .../update/decoders/EncryptionDecoder.java | 0 .../decoders/HandshakeResponseDecoder.java | 0 .../update/decoders/LoggedInDecoder.java | 0 .../update/decoders/LoggedOutDecoder.java | 0 .../update/decoders/UpdateOpcodes.java | 0 .../encoders/ArchiveRequestEncoder.java | 0 .../encoders/ArchiveResponseEncoder.java | 0 .../update/encoders/EncryptionEncoder.java | 0 .../protocol/update/encoders/XorEncoder.java | 0 .../encoders/ArchiveResponseEncoderTest.java | 2 +- .../update/encoders/XorEncoderTest.java | 0 pom.xml | 2 - protocol-api/pom.xml | 65 ----------------- protocol/pom.xml | 72 ------------------- 32 files changed, 17 insertions(+), 150 deletions(-) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/handshake/HandshakePacket.java (100%) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/handshake/HandshakeResponsePacket.java (100%) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/handshake/HandshakeType.java (100%) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/handshake/LoginHandshakePacket.java (100%) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/handshake/UpdateHandshakePacket.java (100%) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/login/HandshakeResponseType.java (100%) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/update/ArchiveRequestPacket.java (100%) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/update/ArchiveResponsePacket.java (100%) rename {protocol-api => cache-client}/src/main/java/net/runelite/protocol/api/update/EncryptionPacket.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/handshake/HandshakeDecoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/handshake/HandshakeResponseEncoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/handshake/LoginHandshakeEncoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/handshake/UpdateHandshakeEncoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/decoders/ArchiveRequestDecoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/decoders/ArchiveResponseDecoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/decoders/EncryptionDecoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/decoders/HandshakeResponseDecoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/decoders/LoggedInDecoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/decoders/LoggedOutDecoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/decoders/UpdateOpcodes.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/encoders/ArchiveRequestEncoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/encoders/EncryptionEncoder.java (100%) rename {protocol => cache-client}/src/main/java/net/runelite/protocol/update/encoders/XorEncoder.java (100%) rename {protocol => cache-client}/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java (100%) rename {protocol => cache-client}/src/test/java/net/runelite/protocol/update/encoders/XorEncoderTest.java (100%) delete mode 100644 protocol-api/pom.xml delete mode 100644 protocol/pom.xml diff --git a/cache-client/pom.xml b/cache-client/pom.xml index f138a45e94..ef6c8cb073 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -41,10 +41,16 @@ cache ${project.version} + - net.runelite - protocol - ${project.version} + io.netty + netty-all + 4.1.0.Final + + + org.projectlombok + lombok + provided diff --git a/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java b/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java index 273da5d5fa..2ca319c84a 100644 --- a/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java +++ b/cache-client/src/main/java/net/runelite/cache/client/CacheClient.java @@ -49,14 +49,14 @@ import net.runelite.cache.fs.Storage; import net.runelite.cache.fs.Store; import net.runelite.cache.index.ArchiveData; import net.runelite.cache.index.IndexData; +import net.runelite.cache.util.Crc32; +import net.runelite.protocol.api.handshake.UpdateHandshakePacket; +import net.runelite.protocol.api.login.HandshakeResponseType; +import net.runelite.protocol.api.update.ArchiveRequestPacket; +import net.runelite.protocol.handshake.UpdateHandshakeEncoder; import net.runelite.protocol.update.decoders.HandshakeResponseDecoder; import net.runelite.protocol.update.encoders.ArchiveRequestEncoder; import net.runelite.protocol.update.encoders.EncryptionEncoder; -import net.runelite.protocol.api.update.ArchiveRequestPacket; -import net.runelite.protocol.api.login.HandshakeResponseType; -import net.runelite.cache.util.Crc32; -import net.runelite.protocol.api.handshake.UpdateHandshakePacket; -import net.runelite.protocol.handshake.UpdateHandshakeEncoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/cache-client/src/main/java/net/runelite/cache/client/HandshakeResponseHandler.java b/cache-client/src/main/java/net/runelite/cache/client/HandshakeResponseHandler.java index bcbb01bafb..9f5bf7b65f 100644 --- a/cache-client/src/main/java/net/runelite/cache/client/HandshakeResponseHandler.java +++ b/cache-client/src/main/java/net/runelite/cache/client/HandshakeResponseHandler.java @@ -29,10 +29,10 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.channel.SimpleChannelInboundHandler; import java.util.concurrent.CompletableFuture; -import net.runelite.protocol.update.decoders.ArchiveResponseDecoder; -import net.runelite.protocol.api.update.EncryptionPacket; import net.runelite.protocol.api.handshake.HandshakeResponsePacket; import net.runelite.protocol.api.login.HandshakeResponseType; +import net.runelite.protocol.api.update.EncryptionPacket; +import net.runelite.protocol.update.decoders.ArchiveResponseDecoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakePacket.java b/cache-client/src/main/java/net/runelite/protocol/api/handshake/HandshakePacket.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakePacket.java rename to cache-client/src/main/java/net/runelite/protocol/api/handshake/HandshakePacket.java diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeResponsePacket.java b/cache-client/src/main/java/net/runelite/protocol/api/handshake/HandshakeResponsePacket.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeResponsePacket.java rename to cache-client/src/main/java/net/runelite/protocol/api/handshake/HandshakeResponsePacket.java diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeType.java b/cache-client/src/main/java/net/runelite/protocol/api/handshake/HandshakeType.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/handshake/HandshakeType.java rename to cache-client/src/main/java/net/runelite/protocol/api/handshake/HandshakeType.java diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/LoginHandshakePacket.java b/cache-client/src/main/java/net/runelite/protocol/api/handshake/LoginHandshakePacket.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/handshake/LoginHandshakePacket.java rename to cache-client/src/main/java/net/runelite/protocol/api/handshake/LoginHandshakePacket.java diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/handshake/UpdateHandshakePacket.java b/cache-client/src/main/java/net/runelite/protocol/api/handshake/UpdateHandshakePacket.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/handshake/UpdateHandshakePacket.java rename to cache-client/src/main/java/net/runelite/protocol/api/handshake/UpdateHandshakePacket.java diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/login/HandshakeResponseType.java b/cache-client/src/main/java/net/runelite/protocol/api/login/HandshakeResponseType.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/login/HandshakeResponseType.java rename to cache-client/src/main/java/net/runelite/protocol/api/login/HandshakeResponseType.java diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveRequestPacket.java b/cache-client/src/main/java/net/runelite/protocol/api/update/ArchiveRequestPacket.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveRequestPacket.java rename to cache-client/src/main/java/net/runelite/protocol/api/update/ArchiveRequestPacket.java diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveResponsePacket.java b/cache-client/src/main/java/net/runelite/protocol/api/update/ArchiveResponsePacket.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/update/ArchiveResponsePacket.java rename to cache-client/src/main/java/net/runelite/protocol/api/update/ArchiveResponsePacket.java diff --git a/protocol-api/src/main/java/net/runelite/protocol/api/update/EncryptionPacket.java b/cache-client/src/main/java/net/runelite/protocol/api/update/EncryptionPacket.java similarity index 100% rename from protocol-api/src/main/java/net/runelite/protocol/api/update/EncryptionPacket.java rename to cache-client/src/main/java/net/runelite/protocol/api/update/EncryptionPacket.java diff --git a/protocol/src/main/java/net/runelite/protocol/handshake/HandshakeDecoder.java b/cache-client/src/main/java/net/runelite/protocol/handshake/HandshakeDecoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/handshake/HandshakeDecoder.java rename to cache-client/src/main/java/net/runelite/protocol/handshake/HandshakeDecoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/handshake/HandshakeResponseEncoder.java b/cache-client/src/main/java/net/runelite/protocol/handshake/HandshakeResponseEncoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/handshake/HandshakeResponseEncoder.java rename to cache-client/src/main/java/net/runelite/protocol/handshake/HandshakeResponseEncoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/handshake/LoginHandshakeEncoder.java b/cache-client/src/main/java/net/runelite/protocol/handshake/LoginHandshakeEncoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/handshake/LoginHandshakeEncoder.java rename to cache-client/src/main/java/net/runelite/protocol/handshake/LoginHandshakeEncoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/handshake/UpdateHandshakeEncoder.java b/cache-client/src/main/java/net/runelite/protocol/handshake/UpdateHandshakeEncoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/handshake/UpdateHandshakeEncoder.java rename to cache-client/src/main/java/net/runelite/protocol/handshake/UpdateHandshakeEncoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveRequestDecoder.java b/cache-client/src/main/java/net/runelite/protocol/update/decoders/ArchiveRequestDecoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveRequestDecoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/decoders/ArchiveRequestDecoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveResponseDecoder.java b/cache-client/src/main/java/net/runelite/protocol/update/decoders/ArchiveResponseDecoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/decoders/ArchiveResponseDecoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/decoders/ArchiveResponseDecoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/EncryptionDecoder.java b/cache-client/src/main/java/net/runelite/protocol/update/decoders/EncryptionDecoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/decoders/EncryptionDecoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/decoders/EncryptionDecoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/HandshakeResponseDecoder.java b/cache-client/src/main/java/net/runelite/protocol/update/decoders/HandshakeResponseDecoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/decoders/HandshakeResponseDecoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/decoders/HandshakeResponseDecoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedInDecoder.java b/cache-client/src/main/java/net/runelite/protocol/update/decoders/LoggedInDecoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedInDecoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/decoders/LoggedInDecoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedOutDecoder.java b/cache-client/src/main/java/net/runelite/protocol/update/decoders/LoggedOutDecoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/decoders/LoggedOutDecoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/decoders/LoggedOutDecoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/decoders/UpdateOpcodes.java b/cache-client/src/main/java/net/runelite/protocol/update/decoders/UpdateOpcodes.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/decoders/UpdateOpcodes.java rename to cache-client/src/main/java/net/runelite/protocol/update/decoders/UpdateOpcodes.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveRequestEncoder.java b/cache-client/src/main/java/net/runelite/protocol/update/encoders/ArchiveRequestEncoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveRequestEncoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/encoders/ArchiveRequestEncoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoder.java b/cache-client/src/main/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/encoders/EncryptionEncoder.java b/cache-client/src/main/java/net/runelite/protocol/update/encoders/EncryptionEncoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/encoders/EncryptionEncoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/encoders/EncryptionEncoder.java diff --git a/protocol/src/main/java/net/runelite/protocol/update/encoders/XorEncoder.java b/cache-client/src/main/java/net/runelite/protocol/update/encoders/XorEncoder.java similarity index 100% rename from protocol/src/main/java/net/runelite/protocol/update/encoders/XorEncoder.java rename to cache-client/src/main/java/net/runelite/protocol/update/encoders/XorEncoder.java diff --git a/protocol/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java b/cache-client/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java similarity index 100% rename from protocol/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java rename to cache-client/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java index 8cf508c834..f939431760 100644 --- a/protocol/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java +++ b/cache-client/src/test/java/net/runelite/protocol/update/encoders/ArchiveResponseEncoderTest.java @@ -31,8 +31,8 @@ import java.util.List; import java.util.Random; import net.runelite.cache.fs.Container; import net.runelite.cache.fs.jagex.CompressionType; -import net.runelite.protocol.update.decoders.ArchiveResponseDecoder; import net.runelite.protocol.api.update.ArchiveResponsePacket; +import net.runelite.protocol.update.decoders.ArchiveResponseDecoder; import org.junit.Assert; import org.junit.Test; diff --git a/protocol/src/test/java/net/runelite/protocol/update/encoders/XorEncoderTest.java b/cache-client/src/test/java/net/runelite/protocol/update/encoders/XorEncoderTest.java similarity index 100% rename from protocol/src/test/java/net/runelite/protocol/update/encoders/XorEncoderTest.java rename to cache-client/src/test/java/net/runelite/protocol/update/encoders/XorEncoderTest.java diff --git a/pom.xml b/pom.xml index 12ab17d09b..cb5770eead 100644 --- a/pom.xml +++ b/pom.xml @@ -121,8 +121,6 @@ runelite-script-assembler-plugin http-api http-service - protocol-api - protocol diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml deleted file mode 100644 index c5fefbdbeb..0000000000 --- a/protocol-api/pom.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - 4.0.0 - - - net.runelite - runelite-parent - 1.6.8-SNAPSHOT - - - protocol-api - Protocol API - - - - net.runelite - runelite-api - ${project.version} - - - org.slf4j - slf4j-api - - - com.google.guava - guava - - - org.projectlombok - lombok - provided - - - - junit - junit - 4.12 - test - - - diff --git a/protocol/pom.xml b/protocol/pom.xml deleted file mode 100644 index 26e83ab67c..0000000000 --- a/protocol/pom.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - 4.0.0 - - - net.runelite - runelite-parent - 1.6.8-SNAPSHOT - - - protocol - Protocol - - - - net.runelite - protocol-api - ${project.version} - - - net.runelite - cache - ${project.version} - - - - com.google.guava - guava - - - io.netty - netty-all - 4.1.0.Final - - - org.projectlombok - lombok - provided - - - - junit - junit - 4.12 - test - - - From 5813750cd24ab60096671f2b667c97908d3bf45f Mon Sep 17 00:00:00 2001 From: James Carroll Date: Fri, 14 Feb 2020 18:22:04 +0000 Subject: [PATCH 07/16] Thread Desktop browse and open This should allow systems without GVFS to open the logs folder. This applies to the AppImage on non-Gnome or bare bone systems, the raw Jar, and Snap. Co-authored-by: Adam --- .../plugins/screenshot/ScreenshotPlugin.java | 12 +- .../runelite/client/ui/FatalErrorDialog.java | 10 +- .../net/runelite/client/util/LinkBrowser.java | 110 ++++++++++++++---- 3 files changed, 88 insertions(+), 44 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index e5bdce4414..49c46d394e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -28,11 +28,9 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.inject.Provides; -import java.awt.Desktop; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; -import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.time.LocalDate; import java.util.concurrent.ScheduledExecutorService; @@ -82,6 +80,7 @@ import net.runelite.client.util.HotkeyListener; import net.runelite.client.util.ImageCapture; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; +import net.runelite.client.util.LinkBrowser; @PluginDescriptor( name = "Screenshot", @@ -188,14 +187,7 @@ public class ScreenshotPlugin extends Plugin .builder() .put("Open screenshot folder...", () -> { - try - { - Desktop.getDesktop().open(SCREENSHOT_DIR); - } - catch (IOException ex) - { - log.warn("Error opening screenshot dir", ex); - } + LinkBrowser.open(SCREENSHOT_DIR.toString()); }) .build()) .build(); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java b/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java index 131bbb7830..8563595685 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java @@ -28,7 +28,6 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; -import java.awt.Desktop; import java.awt.Dimension; import java.awt.Font; import java.awt.event.WindowAdapter; @@ -141,14 +140,7 @@ public class FatalErrorDialog extends JDialog addButton("Open logs folder", () -> { - try - { - Desktop.getDesktop().open(RuneLite.LOGS_DIR); - } - catch (IOException e) - { - log.warn("Unable to open logs", e); - } + LinkBrowser.open(RuneLite.LOGS_DIR.toString()); }); addButton("Get help on Discord", () -> LinkBrowser.browse(RuneLiteProperties.getDiscordInvite())); addButton("Troubleshooting steps", () -> LinkBrowser.browse(RuneLiteProperties.getTroubleshootingLink())); diff --git a/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java b/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java index 194b1974b2..f4bc491571 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java +++ b/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java @@ -28,6 +28,7 @@ import com.google.common.base.Strings; import java.awt.Desktop; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; +import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -37,7 +38,7 @@ import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; /** - * Utility class used for browser navigation + * Utility class used for web and file browser navigation */ @Singleton @Slf4j @@ -48,37 +49,70 @@ public class LinkBrowser /** * Tries to navigate to specified URL in browser. In case operation fails, displays message box with message * and copies link to clipboard to navigate to. - * @param url url to open - * @return true if operation was successful */ - public static boolean browse(final String url) + public static void browse(final String url) { - if (Strings.isNullOrEmpty(url)) + new Thread(() -> { - return false; - } + if (Strings.isNullOrEmpty(url)) + { + log.warn("LinkBrowser.browse() called with invalid input"); + return; + } - if (attemptDesktopBrowse(url)) - { - log.debug("Opened browser through Desktop#browse to {}", url); - return true; - } + if (attemptDesktopBrowse(url)) + { + log.debug("Opened url through Desktop#browse to {}", url); + return; + } - if (shouldAttemptXdg && attemptXdgOpen(url)) - { - log.debug("Opened browser through xdg-open to {}", url); - return true; - } - - showMessageBox("Unable to open link. Press 'OK' and link will be copied to your clipboard.", url); - return false; + if (shouldAttemptXdg && attemptXdgOpen(url)) + { + log.debug("Opened url through xdg-open to {}", url); + return; + } + + log.warn("LinkBrowser.browse() could not open {}", url); + showMessageBox("Unable to open link. Press 'OK' and the link will be copied to your clipboard.", url); + }).start(); } - private static boolean attemptXdgOpen(String url) + /** + * Tries to open a directory in the OS native file manager. + * @param directory directory to open + */ + public static void open(final String directory) + { + new Thread(() -> + { + if (Strings.isNullOrEmpty(directory)) + { + log.warn("LinkBrowser.open() called with invalid input"); + return; + } + + if (attemptDesktopOpen(directory)) + { + log.debug("Opened directory through Desktop#open to {}", directory); + return; + } + + if (shouldAttemptXdg && attemptXdgOpen(directory)) + { + log.debug("Opened directory through xdg-open to {}", directory); + return; + } + + log.warn("LinkBrowser.open() could not open {}", directory); + showMessageBox("Unable to open folder. Press 'OK' and the folder directory will be copied to your clipboard.", directory); + }).start(); + } + + private static boolean attemptXdgOpen(String resource) { try { - final Process exec = Runtime.getRuntime().exec(new String[]{"xdg-open", url}); + final Process exec = Runtime.getRuntime().exec(new String[]{"xdg-open", resource}); exec.waitFor(); final int ret = exec.exitValue(); @@ -87,7 +121,7 @@ public class LinkBrowser return true; } - log.warn("xdg-open {} returned with error code {}", url, ret); + log.warn("xdg-open {} returned with error code {}", resource, ret); return false; } catch (IOException ex) @@ -98,7 +132,7 @@ public class LinkBrowser } catch (InterruptedException ex) { - log.warn("Interrupted while waiting for xdg-open {} to execute", url); + log.warn("Interrupted while waiting for xdg-open {} to execute", resource); return false; } } @@ -124,7 +158,33 @@ public class LinkBrowser } catch (IOException | URISyntaxException ex) { - log.warn("Failed to open Desktop#browser {}", url, ex); + log.warn("Failed to open Desktop#browse {}", url, ex); + return false; + } + } + + private static boolean attemptDesktopOpen(String directory) + { + if (!Desktop.isDesktopSupported()) + { + return false; + } + + final Desktop desktop = Desktop.getDesktop(); + + if (!desktop.isSupported(Desktop.Action.OPEN)) + { + return false; + } + + try + { + desktop.open(new File(directory)); + return true; + } + catch (IOException ex) + { + log.warn("Failed to open Desktop#open {}", directory, ex); return false; } } From afe85fa6e6bf49473b27fe9ba5c434709ea22d8b Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Tue, 14 Jan 2020 18:17:41 +0000 Subject: [PATCH 08/16] slayer: fix boss task parsing to support Konar Fixes runelite/runelite#8009 --- .../client/plugins/slayer/SlayerPlugin.java | 2 +- .../client/plugins/slayer/SlayerPluginTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 37d241e386..864659842b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -108,7 +108,7 @@ public class SlayerPlugin extends Plugin //NPC messages private static final Pattern NPC_ASSIGN_MESSAGE = Pattern.compile(".*(?:Your new task is to kill|You are to bring balance to)\\s*(?\\d+) (?.+?)(?: (?:in|on|south of) (?:the )?(?.+))?\\."); - private static final Pattern NPC_ASSIGN_BOSS_MESSAGE = Pattern.compile("^Excellent. You're now assigned to kill (?:the )?(.*) (\\d+) times.*Your reward point tally is (.*)\\.$"); + private static final Pattern NPC_ASSIGN_BOSS_MESSAGE = Pattern.compile("^(?:Excellent\\. )?You're now assigned to (?:kill|bring balance to) (?:the )?(.*) (\\d+) times.*Your reward point tally is (.*)\\.$"); private static final Pattern NPC_ASSIGN_FIRST_MESSAGE = Pattern.compile("^We'll start you off (?:hunting|bringing balance to) (.*), you'll need to kill (\\d*) of them\\.$"); private static final Pattern NPC_CURRENT_MESSAGE = Pattern.compile("^You're still (?:hunting|bringing balance to) (?.+)(?: (?:in|on|south of) (?:the )?(?.+), with|; you have) (?\\d+) to go\\..*"); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index 5582217e51..49caa7c65f 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -83,6 +83,7 @@ public class SlayerPluginTest private static final String TASK_BOSS_NEW = "Excellent. You're now assigned to kill Vet'ion 3 times.
Your reward point tally is 914."; private static final String TASK_BOSS_NEW_THE = "Excellent. You're now assigned to kill the Chaos
Elemental 3 times. Your reward point tally is 914."; + private static final String TASK_KONAR_BOSS = "You're now assigned to bring balance to the Alchemical
Hydra 35 times. Your reward point tally is 724."; private static final String TASK_EXISTING = "You're still hunting suqahs; you have 222 to go. Come
back when you've finished your task."; @@ -282,6 +283,19 @@ public class SlayerPluginTest assertEquals(914, slayerPlugin.getPoints()); } + @Test + public void testKonarBossTask() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_KONAR_BOSS); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Alchemical Hydra", slayerPlugin.getTaskName()); + assertEquals(35, slayerPlugin.getAmount()); + assertEquals(724, slayerPlugin.getPoints()); + } + @Test public void testPartnerTask() { From 5a95ac201585c91e8878ea54d60cc86e7b6e4c57 Mon Sep 17 00:00:00 2001 From: DeliciousLunch55 Date: Sun, 23 Feb 2020 11:28:17 -0600 Subject: [PATCH 09/16] xpdrop plugin: add 'prayer' to tags --- .../runelite/client/plugins/experiencedrop/XpDropPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java index 57073c8fbc..3a62513b8a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java @@ -49,7 +49,7 @@ import net.runelite.client.plugins.PluginDescriptor; @PluginDescriptor( name = "XP Drop", description = "Enable customization of the way XP drops are displayed", - tags = {"experience", "levels", "tick"} + tags = {"experience", "levels", "tick", "prayer"} ) public class XpDropPlugin extends Plugin { From 91bfe7eb6d1ba4cc551c4335c4e1e5a2fed94609 Mon Sep 17 00:00:00 2001 From: Jeremy Plsek Date: Sun, 23 Feb 2020 12:33:09 -0500 Subject: [PATCH 10/16] plugin hub panel: add url to help tooltip and add missing space to warning --- .../net/runelite/client/plugins/config/PluginHubPanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java index d07036ee4c..169f061d17 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java @@ -193,7 +193,6 @@ class PluginHubPanel extends PluginPanel JButton help = new JButton(HELP_ICON); help.setRolloverIcon(HELP_ICON_HOVER); SwingUtil.removeButtonDecorations(help); - help.setToolTipText("Help"); help.setBorder(null); if (manifest.getSupport() == null) { @@ -201,6 +200,7 @@ class PluginHubPanel extends PluginPanel } else { + help.setToolTipText("Open help: " + manifest.getSupport().toString()); help.addActionListener(ev -> LinkBrowser.browse(manifest.getSupport().toString())); } @@ -389,7 +389,7 @@ class PluginHubPanel extends PluginPanel } }); - JLabel externalPluginWarning = new JLabel("External plugins are not supported by the RuneLite Developers." + + JLabel externalPluginWarning = new JLabel("External plugins are not supported by the RuneLite Developers. " + "They may cause bugs or instability."); externalPluginWarning.setBackground(new Color(0xFFBB33)); externalPluginWarning.setForeground(Color.BLACK); From 66fac018eb2ddec2d0e9c30ac38b2780c040a2a6 Mon Sep 17 00:00:00 2001 From: ln Date: Sun, 23 Feb 2020 21:49:04 +0200 Subject: [PATCH 11/16] gpu: add UI bicubic & xBR rescaling --- .../client/plugins/gpu/GpuPlugin.java | 27 +- .../client/plugins/gpu/GpuPluginConfig.java | 14 +- .../plugins/gpu/config/UIScalingMode.java | 48 ++++ .../runelite/client/plugins/gpu/fragui.glsl | 25 +- .../client/plugins/gpu/scale/bicubic.glsl | 167 ++++++++++++ .../plugins/gpu/scale/xbr_lv2_common.glsl | 37 +++ .../plugins/gpu/scale/xbr_lv2_frag.glsl | 247 ++++++++++++++++++ .../plugins/gpu/scale/xbr_lv2_vert.glsl | 54 ++++ .../runelite/client/plugins/gpu/vertui.glsl | 15 ++ 9 files changed, 624 insertions(+), 10 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/gpu/config/UIScalingMode.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/bicubic.glsl create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_common.glsl create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_frag.glsl create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_vert.glsl diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 4377cfc879..83d717e60a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -76,6 +76,7 @@ import net.runelite.client.plugins.PluginInstantiationException; import net.runelite.client.plugins.PluginManager; import static net.runelite.client.plugins.gpu.GLUtil.*; import net.runelite.client.plugins.gpu.config.AntiAliasingMode; +import net.runelite.client.plugins.gpu.config.UIScalingMode; import net.runelite.client.plugins.gpu.template.Template; import net.runelite.client.ui.DrawManager; import net.runelite.client.util.OSType; @@ -239,6 +240,9 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private int uniProjectionMatrix; private int uniBrightness; private int uniTex; + private int uniTexSamplingMode; + private int uniTexSourceDimensions; + private int uniTexTargetDimensions; private int uniTextures; private int uniTextureOffsets; private int uniBlockSmall; @@ -476,6 +480,9 @@ public class GpuPlugin extends Plugin implements DrawCallbacks uniDrawDistance = gl.glGetUniformLocation(glProgram, "drawDistance"); uniTex = gl.glGetUniformLocation(glUiProgram, "tex"); + uniTexSamplingMode = gl.glGetUniformLocation(glUiProgram, "samplingMode"); + uniTexTargetDimensions = gl.glGetUniformLocation(glUiProgram, "targetDimensions"); + uniTexSourceDimensions = gl.glGetUniformLocation(glUiProgram, "sourceDimensions"); uniTextures = gl.glGetUniformLocation(glProgram, "textures"); uniTextureOffsets = gl.glGetUniformLocation(glProgram, "textureOffsets"); @@ -623,8 +630,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks { interfaceTexture = glGenTexture(gl); gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture); - gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_REPEAT); - gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_REPEAT); + gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP_TO_EDGE); + gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP_TO_EDGE); gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR); gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR); gl.glBindTexture(gl.GL_TEXTURE_2D, 0); @@ -1132,26 +1139,32 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, width, height, gl.GL_BGRA, gl.GL_UNSIGNED_INT_8_8_8_8_REV, interfaceBuffer); } + // Use the texture bound in the first pass + final UIScalingMode uiScalingMode = config.uiScalingMode(); + gl.glUseProgram(glUiProgram); + gl.glUniform1i(uniTex, 0); + gl.glUniform1i(uniTexSamplingMode, uiScalingMode.getMode()); + gl.glUniform2i(uniTexSourceDimensions, canvasWidth, canvasHeight); + if (client.isStretchedEnabled()) { Dimension dim = client.getStretchedDimensions(); glDpiAwareViewport(0, 0, dim.width, dim.height); + gl.glUniform2i(uniTexTargetDimensions, dim.width, dim.height); } else { glDpiAwareViewport(0, 0, canvasWidth, canvasHeight); + gl.glUniform2i(uniTexTargetDimensions, canvasWidth, canvasHeight); } - // Use the texture bound in the first pass - gl.glUseProgram(glUiProgram); - gl.glUniform1i(uniTex, 0); - // Set the sampling function used when stretching the UI. // This is probably better done with sampler objects instead of texture parameters, but this is easier and likely more portable. // See https://www.khronos.org/opengl/wiki/Sampler_Object for details. if (client.isStretchedEnabled()) { - final int function = client.isStretchedFast() ? gl.GL_NEAREST : gl.GL_LINEAR; + // GL_NEAREST makes sampling for bicubic/xBR simpler, so it should be used whenever linear isn't + final int function = uiScalingMode == UIScalingMode.LINEAR ? gl.GL_LINEAR : gl.GL_NEAREST; gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, function); gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, function); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java index 94878c69dc..bc37634f41 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java @@ -31,6 +31,7 @@ import net.runelite.client.config.Range; import static net.runelite.client.plugins.gpu.GpuPlugin.MAX_FOG_DEPTH; import net.runelite.client.plugins.gpu.config.AntiAliasingMode; import static net.runelite.client.plugins.gpu.GpuPlugin.MAX_DISTANCE; +import net.runelite.client.plugins.gpu.config.UIScalingMode; @ConfigGroup("gpu") public interface GpuPluginConfig extends Config @@ -71,6 +72,17 @@ public interface GpuPluginConfig extends Config return AntiAliasingMode.DISABLED; } + @ConfigItem( + keyName = "uiScalingMode", + name = "UI scaling mode", + description = "Sampling function to use for the UI in stretched mode", + position = 4 + ) + default UIScalingMode uiScalingMode() + { + return UIScalingMode.LINEAR; + } + @Range( max = MAX_FOG_DEPTH ) @@ -78,7 +90,7 @@ public interface GpuPluginConfig extends Config keyName = "fogDepth", name = "Fog depth", description = "Distance from the scene edge the fog starts", - position = 4 + position = 5 ) default int fogDepth() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/config/UIScalingMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/config/UIScalingMode.java new file mode 100644 index 0000000000..04c01697c5 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/config/UIScalingMode.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2019 logarrhytmic + * 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.gpu.config; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum UIScalingMode +{ + NEAREST("Nearest Neighbor", 0), + LINEAR("Bilinear", 0), + MITCHELL("Bicubic (Mitchell)", 1), + CATMULL_ROM("Bicubic (Catmull-Rom)", 2), + XBR("xBR", 3); + + private final String name; + private final int mode; + + @Override + public String toString() + { + return name; + } +} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl index 57731df5b8..73a3e36ee7 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl @@ -24,13 +24,34 @@ */ #version 330 +#define SAMPLING_DEFAULT 0 +#define SAMPLING_MITCHELL 1 +#define SAMPLING_CATROM 2 +#define SAMPLING_XBR 3 + uniform sampler2D tex; +uniform int samplingMode; +uniform ivec2 sourceDimensions; +uniform ivec2 targetDimensions; + +#include scale/bicubic.glsl +#include scale/xbr_lv2_frag.glsl + in vec2 TexCoord; +in XBRTable xbrTable; out vec4 FragColor; void main() { - vec4 c = texture(tex, TexCoord); - FragColor = c; + vec4 c; + + if (samplingMode == SAMPLING_DEFAULT) + c = texture(tex, TexCoord); + else if (samplingMode == SAMPLING_CATROM || samplingMode == SAMPLING_MITCHELL) + c = textureCubic(tex, TexCoord, samplingMode); + else if (samplingMode == SAMPLING_XBR) + c = textureXBR(tex, TexCoord, xbrTable, ceil(1.0 * targetDimensions.x / sourceDimensions.x)); + + FragColor = c; } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/bicubic.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/bicubic.glsl new file mode 100644 index 0000000000..0d50bcc8c1 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/bicubic.glsl @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2019 logarrhythmic + * 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. + */ + +/* Bicubic sampling takes neighboring pixels into account using a cubic filter for pixel weights. + * + * A generalized cubic filter as described by Mitchell and Netravali is defined by the piecewise equation: + * if abs(x) < 1 + * y = 1/6 * ( (12 - 9b - 6c) * abs(x)^3 + (-18 + 12b + 6c) * abs(x)^2 + (6 - 2b) ) + * if abs(x) >= 1 and < 2 + * y = 1/6 * ( (-1b - 6c) * abs(x)^3 + (6b + 30c) * abs(x)^2 + (-12b - 48c) * abs(x) + (8b + 24c) ) + * otherwise + * y = 0 + * This produces a bell curve centered on 0 with a width of 2. + * + * The 2 functions below are specific cases of the cubic filter with particular values of a and b. + */ + +// Cubic filter with Catmull-Rom parameters +float catmull_rom(float x) +{ + /* + * Generally favorable results in image upscaling are given by a cubic filter with the values b = 0 and c = 0.5. + * This is known as the Catmull-Rom filter, and it closely approximates Jinc upscaling with Lanczos input values. + * Placing these values into the piecewise equation gives us a more compact representation of: + * y = 1.5 * abs(x)^3 - 2.5 * abs(x)^2 + 1 // abs(x) < 1 + * y = -0.5 * abs(x)^3 + 2.5 * abs(x)^2 - 4 * abs(x) + 2 // 1 <= abs(x) < 2 + */ + + float t = abs(x); + float t2 = t * t; + float t3 = t * t * t; + + if (t < 1) + return 1.5 * t3 - 2.5 * t2 + 1.0; + else if (t < 2) + return -0.5 * t3 + 2.5 * t2 - 4.0 * t + 2.0; + else + return 0.0; +} + +float mitchell(float x) +{ + /* + * This is another cubic filter with less aggressive sharpening than Catmull-Rom, which some users may prefer. + * B = 1/3, C = 1/3. + */ + + float t = abs(x); + float t2 = t * t; + float t3 = t * t * t; + + if (t < 1) + return 7.0/6.0 * t3 + -2.0 * t2 + 8.0/9.0; + else if (t < 2) + return -7.0/18.0 * t3 + 2.0 * t2 - 10.0/3.0 * t + 16.0/9.0; + else + return 0.0; +} + +#define CR_AR_STRENGTH 0.9 + +#define FLT_MAX 3.402823466e+38 +#define FLT_MIN 1.175494351e-38 + +// Calculates the distance between two points +float d(vec2 pt1, vec2 pt2) +{ + vec2 v = pt2 - pt1; + return sqrt(dot(v,v)); +} + +// Samples a texture using a 4x4 kernel. +vec4 textureCubic(sampler2D sampler, vec2 texCoords, int mode) +{ + vec2 texSize = textureSize(sampler, 0); + vec2 texelSize = 1.0 / texSize; + vec2 texelFCoords = texCoords * texSize; + texelFCoords -= 0.5; + + vec4 nSum = vec4( 0.0, 0.0, 0.0, 0.0 ); + vec4 nDenom = vec4( 0.0, 0.0, 0.0, 0.0 ); + + vec2 coordFract = fract(texelFCoords); + texCoords -= coordFract * texelSize; + + vec4 c; + + if (mode == SAMPLING_CATROM) + { + // catrom benefits from anti-ringing, which requires knowledge of the minimum and maximum samples in the kernel + vec4 min_sample = vec4(FLT_MAX); + vec4 max_sample = vec4(FLT_MIN); + for (int m = -1; m <= 2; m++) + { + for (int n = -1; n <= 2; n++) + { + // this would use texelFetch, but that would require manual implementation of texture wrapping + vec4 vecData = texture(sampler, texCoords + vec2(m, n) * texelSize); + + // update min and max as we go + min_sample = min(min_sample, vecData); + max_sample = max(max_sample, vecData); + + // calculate weight based on distance of the current texel offset from the sub-texel position of the sampling location + float w = catmull_rom( d(vec2(m, n), coordFract) ); + + // build the weighted average + nSum += vecData * w; + nDenom += w; + } + } + // calculate weighted average + c = nSum / nDenom; + + // store value before anti-ringing + vec4 aux = c; + // anti-ringing: clamp the color value so that it cannot exceed values already present in the kernel area + c = clamp(c, min_sample, max_sample); + // mix according to anti-ringing strength + c = mix(aux, c, CR_AR_STRENGTH); + } + else if (mode == SAMPLING_MITCHELL) + { + for (int m = -1; m <= 2; m++) + { + for (int n = -1; n <= 2; n++) + { + // this would use texelFetch, but that would require manual implementation of texture wrapping + vec4 vecData = texture(sampler, texCoords + vec2(m, n) * texelSize); + + // calculate weight based on distance of the current texel offset from the sub-texel position of the sampling location + float w = mitchell( d(vec2(m, n), coordFract) ); + + // build the weighted average + nSum += vecData * w; + nDenom += w; + } + } + // calculate weighted average + c = nSum / nDenom; + } + + // return the weighted average + return c; +} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_common.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_common.glsl new file mode 100644 index 0000000000..c1fc711df7 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_common.glsl @@ -0,0 +1,37 @@ +/* + Hyllian's xBR-lv2 Shader + + Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Incorporates some of the ideas from SABR shader. Thanks to Joshua Street. +*/ + +struct XBRTable +{ + vec2 texCoord; + vec4 t1; + vec4 t2; + vec4 t3; + vec4 t4; + vec4 t5; + vec4 t6; + vec4 t7; +}; \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_frag.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_frag.glsl new file mode 100644 index 0000000000..2ae6068154 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_frag.glsl @@ -0,0 +1,247 @@ +/* + Hyllian's xBR-lv2 Shader + + Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Incorporates some of the ideas from SABR shader. Thanks to Joshua Street. +*/ + +// PARAMETERS // +// Uncomment just one of the four params below to choose the corner detection +//#define CORNER_A +//#define CORNER_B +#define CORNER_C +//#define CORNER_D + +#define XBR_Y_WEIGHT 50.0 // involved in preserving small details if small_details = 1, otherwise unused +#define XBR_EQ_THRESHOLD 9.0 // equality threshold for comparisons +//#define XBR_LV1_COEFFICIENT 0.5 // unused, probably left over from a previous iteration +#define XBR_LV2_COEFFICIENT 2.0 // moves the step in a step function at one point during blending +#define small_details 1.0 // 0 or 1, switches logic in a few spots to help preserve small details +// END PARAMETERS // + +#define mul(a,b) (b*a) +#define lv2_cf XBR_LV2_COEFFICIENT +#ifndef CORNER_A +#define SMOOTH_TIPS +#endif + +//const float coef = 2.0; // unused +const vec3 rgbw = vec3(14.352, 28.176, 5.472); // rgb weights +//const vec4 eq_threshold = vec4(15.0, 15.0, 15.0, 15.0); // unused + +const vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 ); +const vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 ); +const vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 ); +const vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 ); +const vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 ); +const vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 ); +const vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 ); +const vec4 Ci = vec4(0.25, 0.25, 0.25, 0.25); + +const vec3 Y = vec3(0.2126, 0.7152, 0.0722); // rec.709 luma weights + +// Difference between vector components. +vec4 df(vec4 A, vec4 B) +{ + return vec4(abs(A-B)); +} + +// Compare two vectors and return their components are different. +vec4 diff(vec4 A, vec4 B) +{ + return vec4(notEqual(A, B)); +} + +// Determine if two vector components are equal based on a threshold. +vec4 eq(vec4 A, vec4 B) +{ + return (step(df(A, B), vec4(XBR_EQ_THRESHOLD))); +} + +// Determine if two vector components are NOT equal based on a threshold. +vec4 neq(vec4 A, vec4 B) +{ + return (vec4(1.0, 1.0, 1.0, 1.0) - eq(A, B)); +} + +// Weighted distance. +vec4 wd(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h)); +} + +vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h, vec4 i, vec4 j, vec4 k, vec4 l) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + df(i,j) + df(k,l) + 2.0*df(g,h)); +} + +float c_df(vec3 c1, vec3 c2) +{ + vec3 df = abs(c1 - c2); + return df.r + df.g + df.b; +} + +#include scale/xbr_lv2_common.glsl + + +// xBR-level2 upscaler. Level 2 means it detects edges in 2 directions, instead of just 1 in the most basic form of the algorithm. +// This improves quality by a good bit without adding too much complexity compared to available level-3 and level-4 algorithms. +vec4 textureXBR(sampler2D image, vec2 texCoord, XBRTable t, float scale) +{ + vec4 delta = vec4(1.0/scale, 1.0/scale, 1.0/scale, 1.0/scale); + vec4 delta_l = vec4(0.5/scale, 1.0/scale, 0.5/scale, 1.0/scale); + vec4 delta_u = delta_l.yxwz; + + vec2 textureDimensions = textureSize(image, 0); + + vec4 edri, edr, edr_l, edr_u, px; // px = pixel, edr = edge detection rule + vec4 irlv0, irlv1, irlv2l, irlv2u, block_3d; + vec4 fx, fx_l, fx_u; // inequations of straight lines. + + vec2 fp = fract(texCoord*textureDimensions); + + // A1 B1 C1 + // A0 A B C C4 + // D0 D E F F4 + // G0 G H I I4 + // G5 H5 I5 + vec4 A1 = texture(image, t.t1.xw ); + vec4 B1 = texture(image, t.t1.yw ); + vec4 C1 = texture(image, t.t1.zw ); + vec4 A = texture(image, t.t2.xw ); + vec4 B = texture(image, t.t2.yw ); + vec4 C = texture(image, t.t2.zw ); + vec4 D = texture(image, t.t3.xw ); + vec4 E = texture(image, t.t3.yw ); + vec4 F = texture(image, t.t3.zw ); + vec4 G = texture(image, t.t4.xw ); + vec4 H = texture(image, t.t4.yw ); + vec4 I = texture(image, t.t4.zw ); + vec4 G5 = texture(image, t.t5.xw ); + vec4 H5 = texture(image, t.t5.yw ); + vec4 I5 = texture(image, t.t5.zw ); + vec4 A0 = texture(image, t.t6.xy ); + vec4 D0 = texture(image, t.t6.xz ); + vec4 G0 = texture(image, t.t6.xw ); + vec4 C4 = texture(image, t.t7.xy ); + vec4 F4 = texture(image, t.t7.xz ); + vec4 I4 = texture(image, t.t7.xw ); + + vec4 b = vec4(dot(B.xyz ,rgbw), dot(D.xyz ,rgbw), dot(H.xyz ,rgbw), dot(F.xyz ,rgbw)); + vec4 c = vec4(dot(C.xyz ,rgbw), dot(A.xyz ,rgbw), dot(G.xyz ,rgbw), dot(I.xyz ,rgbw)); + vec4 d = b.yzwx; + vec4 e = vec4(dot(E.xyz,rgbw)); + vec4 f = b.wxyz; + vec4 g = c.zwxy; + vec4 h = b.zwxy; + vec4 i = c.wxyz; + + vec4 i4, i5, h5, f4; + + float y_weight = XBR_Y_WEIGHT; + + if (small_details < 0.5) + { + i4 = vec4(dot(I4.xyz,rgbw), dot(C1.xyz,rgbw), dot(A0.xyz,rgbw), dot(G5.xyz,rgbw)); + i5 = vec4(dot(I5.xyz,rgbw), dot(C4.xyz,rgbw), dot(A1.xyz,rgbw), dot(G0.xyz,rgbw)); + h5 = vec4(dot(H5.xyz,rgbw), dot(F4.xyz,rgbw), dot(B1.xyz,rgbw), dot(D0.xyz,rgbw)); + } + else + { + i4 = mul( mat4x3(I4.xyz, C1.xyz, A0.xyz, G5.xyz), y_weight * Y ); + i5 = mul( mat4x3(I5.xyz, C4.xyz, A1.xyz, G0.xyz), y_weight * Y ); + h5 = mul( mat4x3(H5.xyz, F4.xyz, B1.xyz, D0.xyz), y_weight * Y ); + } + + // These inequations define the line below which interpolation occurs. + fx = (Ao*fp.y+Bo*fp.x); + fx_l = (Ax*fp.y+Bx*fp.x); + fx_u = (Ay*fp.y+By*fp.x); + + // corner detection + irlv1 = irlv0 = diff(e,f) * diff(e,h); + #ifdef CORNER_B + irlv1 = (irlv0 * ( neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) ); + #endif + #ifdef CORNER_D + vec4 c1 = i4.yzwx; + vec4 g0 = i5.wxyz; + irlv1 = (irlv0 * ( neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) * (diff(f,f4) * diff(f,i) + diff(h,h5) * diff(h,i) + diff(h,g) + diff(f,c) + eq(b,c1) * eq(d,g0))); + #endif + #ifdef CORNER_C + irlv1 = (irlv0 * ( neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c)) ); + #endif + + // corner detection in the other direction + irlv2l = diff(e,g) * diff(d,g); + irlv2u = diff(e,c) * diff(b,c); + + vec4 fx45i = clamp((fx + delta -Co - Ci)/(2.0*delta ), 0.0, 1.0); + vec4 fx45 = clamp((fx + delta -Co )/(2.0*delta ), 0.0, 1.0); + vec4 fx30 = clamp((fx_l + delta_l -Cx )/(2.0*delta_l), 0.0, 1.0); + vec4 fx60 = clamp((fx_u + delta_u -Cy )/(2.0*delta_u), 0.0, 1.0); + + vec4 wd1, wd2; + if (small_details < 0.5) + { + wd1 = wd( e, c, g, i, h5, f4, h, f); + wd2 = wd( h, d, i5, f, i4, b, e, i); + } + else + { + wd1 = weighted_distance( e, c, g, i, f4, h5, h, f, b, d, i4, i5); + wd2 = weighted_distance( h, d, i5, f, b, i4, e, i, g, h5, c, f4); + } + + edri = step(wd1, wd2) * irlv0; + edr = step(wd1 + vec4(0.1, 0.1, 0.1, 0.1), wd2) * step(vec4(0.5, 0.5, 0.5, 0.5), irlv1); + edr_l = step( lv2_cf*df(f,g), df(h,c) ) * irlv2l * edr; + edr_u = step( lv2_cf*df(h,c), df(f,g) ) * irlv2u * edr; + + fx45 = edr * fx45; + fx30 = edr_l * fx30; + fx60 = edr_u * fx60; + fx45i = edri * fx45i; + + px = step(df(e,f), df(e,h)); + + #ifdef SMOOTH_TIPS + vec4 maximos = max(max(fx30, fx60), max(fx45, fx45i)); + #endif + #ifndef SMOOTH_TIPS + vec4 maximos = max(max(fx30, fx60), fx45); + #endif + + vec4 res1 = E; + res1 = mix(res1, mix(H, F, px.x), maximos.x); + res1 = mix(res1, mix(B, D, px.z), maximos.z); + + vec4 res2 = E; + res2 = mix(res2, mix(F, B, px.y), maximos.y); + res2 = mix(res2, mix(D, H, px.w), maximos.w); + + vec4 res = mix(res1, res2, step(c_df(E.xyz, res1.xyz), c_df(E.xyz, res2.xyz))); + + return res; +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_vert.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_vert.glsl new file mode 100644 index 0000000000..e4a7a9700c --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/scale/xbr_lv2_vert.glsl @@ -0,0 +1,54 @@ +/* + Hyllian's xBR-lv2 Shader + + Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Incorporates some of the ideas from SABR shader. Thanks to Joshua Street. +*/ + +#include scale/xbr_lv2_common.glsl + +XBRTable xbr_vert(vec2 texCoord, ivec2 sourceDimensions) +{ + float dx = (1.0/sourceDimensions.x); + float dy = (1.0/sourceDimensions.y); + + // Define coordinates to optimize later fetching of adjacent pixels + // A1 B1 C1 + // A0 A B C C4 + // D0 D E F F4 + // G0 G H I I4 + // G5 H5 I5 + XBRTable tab = XBRTable( + texCoord, + texCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy), // A1 B1 C1 + texCoord.xxxy + vec4( -dx, 0, dx, -dy), // A B C + texCoord.xxxy + vec4( -dx, 0, dx, 0), // D E F + texCoord.xxxy + vec4( -dx, 0, dx, dy), // G H I + texCoord.xxxy + vec4( -dx, 0, dx, 2.0*dy), // G5 H5 I5 + texCoord.xyyy + vec4(-2.0*dx,-dy, 0, dy), // A0 D0 G0 + texCoord.xyyy + vec4( 2.0*dx,-dy, 0, dy) // C4 F4 I4 + ); + + tab.texCoord.x *= 1.00000001; + + return tab; +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vertui.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vertui.glsl index c6a1115226..5ec633dada 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vertui.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vertui.glsl @@ -24,13 +24,28 @@ */ #version 330 +#define SAMPLING_DEFAULT 0 +#define SAMPLING_MITCHELL 1 +#define SAMPLING_CATROM 2 +#define SAMPLING_XBR 3 + +uniform int samplingMode; +uniform ivec2 sourceDimensions; +uniform ivec2 targetDimensions; + +#include scale/xbr_lv2_vert.glsl + layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoord; out vec2 TexCoord; +out XBRTable xbrTable; void main() { gl_Position = vec4(aPos, 1.0); TexCoord = aTexCoord; + + if (samplingMode == SAMPLING_XBR) + xbrTable = xbr_vert(TexCoord, sourceDimensions); } From c9e487fc9e5a3b57431220c4a488ecfee01dcec3 Mon Sep 17 00:00:00 2001 From: Krysa <46086365+Krysaczek@users.noreply.github.com> Date: Sun, 23 Feb 2020 20:58:07 +0100 Subject: [PATCH 12/16] inventory tags: add 2 additional color groups --- .../inventorytags/InventoryTagsConfig.java | 22 +++++++++++++++++++ .../inventorytags/InventoryTagsPlugin.java | 8 ++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsConfig.java index 12cff9fcec..27889048bd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsConfig.java @@ -77,4 +77,26 @@ public interface InventoryTagsConfig extends Config { return new Color(255, 0, 255); } + + @ConfigItem( + position = 4, + keyName = "groupColor5", + name = "Group 5 Color", + description = "Color of the Tag" + ) + default Color getGroup5Color() + { + return new Color(255, 255, 0); + } + + @ConfigItem( + position = 5, + keyName = "groupColor6", + name = "Group 6 Color", + description = "Color of the Tag" + ) + default Color getGroup6Color() + { + return new Color(0, 255, 255); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java index 4683328550..77a0548287 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorytags/InventoryTagsPlugin.java @@ -61,6 +61,8 @@ public class InventoryTagsPlugin extends Plugin private static final String SETNAME_GROUP_2 = "Group 2"; private static final String SETNAME_GROUP_3 = "Group 3"; private static final String SETNAME_GROUP_4 = "Group 4"; + private static final String SETNAME_GROUP_5 = "Group 5"; + private static final String SETNAME_GROUP_6 = "Group 6"; private static final String CONFIGURE = "Configure"; private static final String SAVE = "Save"; @@ -81,7 +83,7 @@ public class InventoryTagsPlugin extends Plugin private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE = new WidgetMenuOption(SAVE, MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB); - private static final List GROUPS = ImmutableList.of(SETNAME_GROUP_4, SETNAME_GROUP_3, SETNAME_GROUP_2, SETNAME_GROUP_1); + private static final List GROUPS = ImmutableList.of(SETNAME_GROUP_6, SETNAME_GROUP_5, SETNAME_GROUP_4, SETNAME_GROUP_3, SETNAME_GROUP_2, SETNAME_GROUP_1); @Inject private Client client; @@ -234,6 +236,10 @@ public class InventoryTagsPlugin extends Plugin return config.getGroup3Color(); case SETNAME_GROUP_4: return config.getGroup4Color(); + case SETNAME_GROUP_5: + return config.getGroup5Color(); + case SETNAME_GROUP_6: + return config.getGroup6Color(); } return null; From d52fe009f53bee128b65e3598973935930a9f611 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 23 Feb 2020 17:14:02 -0500 Subject: [PATCH 13/16] blast furnace: add coffer time remaining overlay --- .../BlastFurnaceCofferOverlay.java | 23 ++++++++++++++++--- .../blastfurnace/BlastFurnaceConfig.java | 11 +++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java index b549adbeba..758573a583 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java @@ -34,6 +34,7 @@ import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import static org.apache.commons.lang3.time.DurationFormatUtils.formatDuration; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; @@ -42,17 +43,21 @@ import net.runelite.client.util.QuantityFormatter; class BlastFurnaceCofferOverlay extends Overlay { + private static final float COST_PER_HOUR = 72000.0f; + private final Client client; private final BlastFurnacePlugin plugin; + private final BlastFurnaceConfig config; private final PanelComponent panelComponent = new PanelComponent(); @Inject - private BlastFurnaceCofferOverlay(Client client, BlastFurnacePlugin plugin) + private BlastFurnaceCofferOverlay(Client client, BlastFurnacePlugin plugin, BlastFurnaceConfig config) { super(plugin); setPosition(OverlayPosition.TOP_LEFT); this.client = client; this.plugin = plugin; + this.config = config; getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Coffer overlay")); } @@ -70,14 +75,26 @@ class BlastFurnaceCofferOverlay extends Overlay if (sack != null) { + final int coffer = client.getVar(BLAST_FURNACE_COFFER); + sack.setHidden(true); panelComponent.getChildren().add(LineComponent.builder() .left("Coffer:") - .right(QuantityFormatter.quantityToStackSize(client.getVar(BLAST_FURNACE_COFFER)) + " gp") + .right(QuantityFormatter.quantityToStackSize(coffer) + " gp") .build()); + + if (config.showCofferTime()) + { + final long millis = (long) (coffer / COST_PER_HOUR * 60 * 60 * 1000); + + panelComponent.getChildren().add(LineComponent.builder() + .left("Time:") + .right(formatDuration(millis, "H'h' m'm' s's'", true)) + .build()); + } } return panelComponent.render(graphics); } -} \ No newline at end of file +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceConfig.java index 8f55d44258..c67250355a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceConfig.java @@ -52,4 +52,15 @@ public interface BlastFurnaceConfig extends Config { return false; } + + @ConfigItem( + keyName = "showCofferTime", + name = "Show coffer time remaining", + description = "Configures whether or not the coffer time remaining is displayed", + position = 3 + ) + default boolean showCofferTime() + { + return true; + } } From 20920be0c07751244b74243e4692fb701a4a9951 Mon Sep 17 00:00:00 2001 From: Ron Young Date: Sat, 22 Feb 2020 12:36:20 -0600 Subject: [PATCH 14/16] LayoutResizableStones: fix bad script merge --- runelite-client/src/main/scripts/LayoutResizableStones.rs2asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/scripts/LayoutResizableStones.rs2asm b/runelite-client/src/main/scripts/LayoutResizableStones.rs2asm index d6b0955c00..81d887a85f 100644 --- a/runelite-client/src/main/scripts/LayoutResizableStones.rs2asm +++ b/runelite-client/src/main/scripts/LayoutResizableStones.rs2asm @@ -43,7 +43,7 @@ LABEL9: sconst "forceStackStones" ; push event name runelite_callback ; invoke callback iconst 0 ; if 0 is returned, continue normal layout - jump LABEL49 + if_icmpeq LABEL49 LABEL29: iconst 0 iload 3 From 5a46abddc5c3d054037e21529a23a34334b21400 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 23 Feb 2020 17:09:56 -0500 Subject: [PATCH 15/16] Use GE limits from item stats --- .../net/runelite/http/api/item/ItemStats.java | 5 +- .../grandexchange/GrandExchangePanel.java | 6 - .../grandexchange/GrandExchangePlugin.java | 25 +- .../GrandExchangeSearchPanel.java | 16 +- .../plugins/itemstats/ItemStatOverlay.java | 2 +- .../plugins/grandexchange/ge_limits.json | 3500 ----------------- 6 files changed, 15 insertions(+), 3539 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemStats.java b/http-api/src/main/java/net/runelite/http/api/item/ItemStats.java index 3ebc17970f..55a1bf76dd 100644 --- a/http-api/src/main/java/net/runelite/http/api/item/ItemStats.java +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemStats.java @@ -24,6 +24,7 @@ */ package net.runelite.http.api.item; +import com.google.gson.annotations.SerializedName; import lombok.Value; @Value @@ -32,6 +33,8 @@ public class ItemStats private boolean quest; private boolean equipable; private double weight; + @SerializedName("ge_limit") + private int geLimit; private ItemEquipmentStats equipment; @@ -76,7 +79,7 @@ public class ItemStats newEquipment = equipment; } - return new ItemStats(quest, equipable, newWeight, newEquipment); + return new ItemStats(quest, equipable, newWeight, 0, newEquipment); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java index 68e18cecc0..0b59270de5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java @@ -27,7 +27,6 @@ package net.runelite.client.plugins.grandexchange; import java.awt.BorderLayout; -import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; import javax.swing.JPanel; @@ -90,9 +89,4 @@ class GrandExchangePanel extends PluginPanel tabGroup.select(searchTab); revalidate(); } - - void setGELimits(Map itemGELimits) - { - searchPanel.setItemGELimits(itemGELimits); - } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index a769660b93..32ebd2b8a3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -32,8 +32,6 @@ import com.google.gson.Gson; import com.google.inject.Provides; import java.awt.image.BufferedImage; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; @@ -51,7 +49,6 @@ import net.runelite.api.ItemComposition; import net.runelite.api.MenuAction; import net.runelite.api.MenuEntry; import net.runelite.api.events.ChatMessage; -import net.runelite.client.events.ConfigChanged; import net.runelite.api.events.FocusChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GrandExchangeOfferChanged; @@ -66,6 +63,7 @@ import net.runelite.client.account.AccountSession; import net.runelite.client.account.SessionManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionOpen; import net.runelite.client.game.ItemManager; @@ -80,6 +78,7 @@ import net.runelite.client.util.QuantityFormatter; import net.runelite.client.util.Text; import net.runelite.http.api.ge.GrandExchangeClient; import net.runelite.http.api.ge.GrandExchangeTrade; +import net.runelite.http.api.item.ItemStats; import net.runelite.http.api.osbuddy.OSBGrandExchangeClient; import net.runelite.http.api.osbuddy.OSBGrandExchangeResult; @@ -149,7 +148,6 @@ public class GrandExchangePlugin extends Plugin private Widget grandExchangeText; private Widget grandExchangeItem; - private Map itemGELimits; private int osbItem; private OSBGrandExchangeResult osbGrandExchangeResult; @@ -185,9 +183,7 @@ public class GrandExchangePlugin extends Plugin @Override protected void startUp() { - itemGELimits = loadGELimits(); panel = injector.getInstance(GrandExchangePanel.class); - panel.setGELimits(itemGELimits); final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "ge_icon.png"); @@ -224,7 +220,6 @@ public class GrandExchangePlugin extends Plugin keyManager.unregisterKeyListener(inputListener); grandExchangeText = null; grandExchangeItem = null; - itemGELimits = null; grandExchangeClient = null; } @@ -507,14 +502,14 @@ public class GrandExchangePlugin extends Plugin String[] lines = geText.getText().split("
"); String text = lines[0]; // remove any limit or OSB ge values - if (config.enableGELimits() && itemGELimits != null) + if (config.enableGELimits()) { - final Integer itemLimit = itemGELimits.get(itemId); + final ItemStats itemStats = itemManager.getItemStats(itemId, false); // If we have item buy limit, append it - if (itemLimit != null) + if (itemStats != null && itemStats.getGeLimit() > 0) { - text += BUY_LIMIT_GE_TEXT + QuantityFormatter.formatNumber(itemLimit); + text += BUY_LIMIT_GE_TEXT + QuantityFormatter.formatNumber(itemStats.getGeLimit()); } } @@ -557,12 +552,4 @@ public class GrandExchangePlugin extends Plugin } }); } - - private static Map loadGELimits() - { - final InputStream geLimitData = GrandExchangePlugin.class.getResourceAsStream("ge_limits.json"); - final Map itemGELimits = GSON.fromJson(new InputStreamReader(geLimitData), BUY_LIMIT_TOKEN.getType()); - log.debug("Loaded {} limits", itemGELimits.size()); - return itemGELimits; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java index 2200cb234e..19683158b4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java @@ -32,23 +32,21 @@ import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; -import lombok.Setter; import net.runelite.api.ItemComposition; import net.runelite.client.callback.ClientThread; -import net.runelite.client.util.AsyncBufferedImage; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.components.IconTextField; import net.runelite.client.ui.components.PluginErrorPanel; +import net.runelite.client.util.AsyncBufferedImage; import net.runelite.http.api.item.ItemPrice; +import net.runelite.http.api.item.ItemStats; /** * This panel holds the search section of the Grand Exchange Plugin. @@ -80,9 +78,6 @@ class GrandExchangeSearchPanel extends JPanel private final List itemsList = new ArrayList<>(); - @Setter - private Map itemGELimits = Collections.emptyMap(); - GrandExchangeSearchPanel(ClientThread clientThread, ItemManager itemManager, ScheduledExecutorService executor) { this.clientThread = clientThread; @@ -209,13 +204,10 @@ class GrandExchangeSearchPanel extends JPanel int itemId = item.getId(); ItemComposition itemComp = itemManager.getItemComposition(itemId); - if (itemComp == null) - { - continue; - } + ItemStats itemStats = itemManager.getItemStats(itemId, false); int itemPrice = item.getPrice(); - int itemLimit = itemGELimits.getOrDefault(itemId, 0); + int itemLimit = itemStats != null ? itemStats.getGeLimit() : 0; AsyncBufferedImage itemImage = itemManager.getImage(itemId); itemsList.add(new GrandExchangeItems(itemImage, item.getName(), itemId, itemPrice, itemComp.getPrice() * 0.6, itemLimit)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java index 877dab9d3a..d7fd9dae08 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java @@ -49,7 +49,7 @@ import net.runelite.http.api.item.ItemStats; public class ItemStatOverlay extends Overlay { // Unarmed attack speed is 6 - private static final ItemStats UNARMED = new ItemStats(false, true, 0, + private static final ItemStats UNARMED = new ItemStats(false, true, 0, 0, ItemEquipmentStats.builder() .aspeed(6) .build()); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json deleted file mode 100644 index d2c98b8457..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json +++ /dev/null @@ -1,3500 +0,0 @@ -{ - "2": 7000, - "6": 70, - "8": 70, - "10": 70, - "12": 70, - "28": 15, - "30": 15, - "36": 40, - "39": 10000, - "40": 10000, - "41": 10000, - "42": 10000, - "43": 10000, - "44": 10000, - "45": 11000, - "46": 11000, - "47": 11000, - "48": 10000, - "50": 10000, - "52": 7000, - "53": 7000, - "54": 10000, - "56": 10000, - "58": 10000, - "60": 10000, - "62": 10000, - "64": 10000, - "66": 10000, - "68": 10000, - "70": 10000, - "72": 10000, - "91": 10000, - "93": 10000, - "95": 10000, - "97": 10000, - "99": 10000, - "101": 10000, - "103": 10000, - "105": 10000, - "107": 10000, - "109": 10000, - "111": 10000, - "113": 2000, - "115": 2000, - "117": 2000, - "119": 2000, - "121": 2000, - "123": 2000, - "125": 2000, - "127": 2000, - "129": 2000, - "131": 2000, - "133": 2000, - "135": 2000, - "137": 2000, - "139": 2000, - "141": 2000, - "143": 2000, - "145": 2000, - "147": 2000, - "149": 2000, - "151": 2000, - "153": 2000, - "155": 2000, - "157": 2000, - "159": 2000, - "161": 2000, - "163": 2000, - "165": 2000, - "167": 2000, - "169": 2000, - "171": 2000, - "173": 2000, - "175": 2000, - "177": 2000, - "179": 2000, - "181": 2000, - "183": 2000, - "185": 2000, - "187": 2000, - "189": 2000, - "191": 2000, - "193": 2000, - "197": 2000, - "199": 13000, - "201": 13000, - "203": 13000, - "205": 13000, - "207": 11000, - "209": 13000, - "211": 13000, - "213": 13000, - "215": 11000, - "217": 11000, - "219": 11000, - "221": 13000, - "223": 13000, - "225": 13000, - "227": 13000, - "229": 13000, - "231": 13000, - "233": 40, - "235": 13000, - "237": 13000, - "239": 13000, - "241": 13000, - "243": 13000, - "245": 11000, - "247": 13000, - "249": 13000, - "251": 13000, - "253": 13000, - "255": 13000, - "257": 11000, - "259": 13000, - "261": 13000, - "263": 13000, - "265": 11000, - "267": 11000, - "269": 11000, - "272": 15, - "273": 15, - "288": 15, - "299": 18000, - "301": 40, - "303": 40, - "305": 40, - "307": 40, - "309": 40, - "311": 40, - "313": 8000, - "314": 13000, - "315": 6000, - "317": 15000, - "319": 15000, - "321": 13000, - "325": 6000, - "327": 15000, - "329": 6000, - "331": 15000, - "333": 6000, - "335": 15000, - "339": 6000, - "341": 15000, - "345": 15000, - "347": 6000, - "349": 15000, - "351": 6000, - "353": 15000, - "355": 6000, - "359": 15000, - "361": 6000, - "363": 15000, - "365": 6000, - "371": 15000, - "373": 6000, - "377": 15000, - "379": 6000, - "383": 15000, - "385": 10000, - "389": 15000, - "391": 10000, - "395": 15000, - "397": 10000, - "401": 13000, - "403": 13000, - "405": 50, - "407": 11000, - "411": 11000, - "413": 11000, - "426": 150, - "428": 150, - "434": 13000, - "436": 13000, - "438": 13000, - "440": 13000, - "442": 13000, - "444": 13000, - "447": 13000, - "449": 4500, - "451": 4500, - "453": 13000, - "464": 2000, - "526": 3000, - "528": 3000, - "530": 3000, - "532": 3000, - "534": 3000, - "536": 7500, - "538": 125, - "540": 125, - "542": 125, - "544": 125, - "546": 125, - "548": 125, - "554": 20000, - "555": 20000, - "556": 20000, - "557": 20000, - "558": 12000, - "559": 12000, - "560": 10000, - "561": 12000, - "562": 12000, - "563": 12000, - "564": 12000, - "565": 10000, - "566": 10000, - "567": 10000, - "569": 10000, - "571": 10000, - "573": 10000, - "575": 10000, - "577": 125, - "579": 125, - "581": 125, - "590": 40, - "592": 13000, - "596": 40, - "621": 18000, - "626": 150, - "628": 150, - "630": 150, - "632": 150, - "634": 150, - "636": 150, - "638": 150, - "640": 150, - "642": 150, - "644": 150, - "646": 150, - "648": 150, - "650": 150, - "652": 150, - "654": 150, - "656": 150, - "658": 150, - "660": 150, - "662": 150, - "664": 150, - "751": 150, - "753": 15, - "800": 7000, - "801": 7000, - "802": 7000, - "803": 7000, - "804": 11000, - "805": 11000, - "806": 7000, - "807": 7000, - "808": 7000, - "809": 7000, - "810": 11000, - "811": 11000, - "812": 7000, - "813": 7000, - "814": 7000, - "815": 7000, - "816": 11000, - "817": 11000, - "819": 13000, - "820": 13000, - "821": 13000, - "822": 13000, - "823": 11000, - "824": 11000, - "825": 7000, - "826": 7000, - "827": 7000, - "828": 7000, - "829": 11000, - "830": 11000, - "831": 7000, - "832": 7000, - "833": 7000, - "834": 7000, - "835": 11000, - "836": 7000, - "837": 125, - "839": 18000, - "841": 18000, - "843": 18000, - "845": 18000, - "847": 18000, - "849": 18000, - "851": 18000, - "853": 18000, - "855": 18000, - "857": 18000, - "859": 18000, - "861": 18000, - "863": 7000, - "864": 7000, - "865": 7000, - "866": 7000, - "867": 11000, - "868": 11000, - "869": 7000, - "870": 7000, - "871": 7000, - "872": 7000, - "873": 7000, - "874": 7000, - "875": 11000, - "876": 7000, - "877": 7000, - "878": 11000, - "879": 11000, - "880": 11000, - "881": 7000, - "882": 7000, - "883": 7000, - "884": 7000, - "885": 7000, - "886": 7000, - "887": 7000, - "888": 7000, - "889": 7000, - "890": 11000, - "891": 11000, - "892": 11000, - "893": 11000, - "946": 40, - "948": 18000, - "950": 18000, - "952": 40, - "954": 250, - "958": 18000, - "960": 13000, - "962": 50, - "970": 13000, - "973": 13000, - "975": 15, - "981": 5, - "983": 15, - "985": 11000, - "987": 11000, - "989": 11000, - "991": 11000, - "993": 11000, - "1005": 150, - "1007": 150, - "1009": 150, - "1011": 150, - "1013": 150, - "1015": 150, - "1017": 125, - "1019": 150, - "1021": 150, - "1023": 150, - "1025": 150, - "1027": 150, - "1029": 150, - "1031": 150, - "1033": 15, - "1035": 15, - "1038": 5, - "1040": 5, - "1042": 5, - "1044": 5, - "1046": 5, - "1048": 5, - "1050": 5, - "1053": 5, - "1055": 5, - "1057": 5, - "1059": 125, - "1061": 125, - "1063": 125, - "1065": 125, - "1067": 125, - "1069": 125, - "1071": 125, - "1073": 125, - "1075": 125, - "1077": 125, - "1079": 70, - "1081": 125, - "1083": 125, - "1085": 125, - "1087": 125, - "1089": 125, - "1091": 125, - "1093": 70, - "1095": 125, - "1097": 125, - "1099": 125, - "1101": 125, - "1103": 125, - "1105": 125, - "1107": 125, - "1109": 125, - "1111": 125, - "1113": 70, - "1115": 125, - "1117": 125, - "1119": 125, - "1121": 125, - "1123": 125, - "1125": 125, - "1127": 70, - "1129": 125, - "1131": 125, - "1133": 125, - "1135": 125, - "1137": 125, - "1139": 125, - "1141": 125, - "1143": 125, - "1145": 125, - "1147": 70, - "1149": 8, - "1151": 125, - "1153": 125, - "1155": 125, - "1157": 125, - "1159": 125, - "1161": 125, - "1163": 70, - "1165": 125, - "1167": 125, - "1169": 125, - "1171": 125, - "1173": 125, - "1175": 125, - "1177": 125, - "1179": 125, - "1181": 125, - "1183": 125, - "1185": 70, - "1187": 70, - "1189": 125, - "1191": 125, - "1193": 125, - "1195": 125, - "1197": 125, - "1199": 125, - "1201": 70, - "1203": 125, - "1205": 125, - "1207": 125, - "1209": 125, - "1211": 125, - "1213": 70, - "1215": 70, - "1217": 125, - "1219": 125, - "1221": 125, - "1223": 125, - "1225": 125, - "1227": 125, - "1229": 70, - "1231": 70, - "1233": 125, - "1237": 125, - "1239": 125, - "1241": 125, - "1243": 125, - "1245": 125, - "1247": 70, - "1249": 70, - "1251": 125, - "1253": 125, - "1255": 125, - "1257": 125, - "1259": 125, - "1261": 70, - "1263": 70, - "1265": 40, - "1267": 40, - "1269": 40, - "1271": 40, - "1273": 40, - "1275": 40, - "1277": 125, - "1279": 125, - "1281": 125, - "1283": 125, - "1285": 125, - "1287": 125, - "1289": 70, - "1291": 125, - "1293": 125, - "1295": 125, - "1297": 125, - "1299": 125, - "1301": 125, - "1303": 70, - "1305": 70, - "1307": 125, - "1309": 125, - "1311": 125, - "1313": 125, - "1315": 125, - "1317": 125, - "1319": 70, - "1321": 125, - "1323": 125, - "1325": 125, - "1327": 125, - "1329": 125, - "1331": 125, - "1333": 70, - "1335": 125, - "1337": 125, - "1339": 125, - "1341": 125, - "1343": 125, - "1345": 125, - "1347": 70, - "1349": 40, - "1351": 40, - "1353": 40, - "1355": 40, - "1357": 40, - "1359": 40, - "1361": 40, - "1363": 125, - "1365": 125, - "1367": 125, - "1369": 125, - "1371": 125, - "1373": 70, - "1375": 125, - "1377": 70, - "1379": 125, - "1381": 125, - "1383": 125, - "1385": 125, - "1387": 125, - "1389": 125, - "1391": 11000, - "1393": 18000, - "1395": 18000, - "1397": 18000, - "1399": 18000, - "1401": 18000, - "1403": 18000, - "1405": 18000, - "1407": 18000, - "1420": 125, - "1422": 125, - "1424": 125, - "1426": 125, - "1428": 125, - "1430": 125, - "1432": 70, - "1434": 70, - "1436": 20000, - "1438": 11000, - "1440": 11000, - "1442": 11000, - "1444": 11000, - "1446": 11000, - "1448": 11000, - "1452": 11000, - "1454": 11000, - "1456": 11000, - "1462": 11000, - "1464": 18000, - "1470": 11000, - "1472": 11000, - "1474": 11000, - "1476": 11000, - "1478": 5, - "1511": 15000, - "1513": 12000, - "1515": 12000, - "1517": 15000, - "1519": 15000, - "1521": 15000, - "1523": 250, - "1539": 13000, - "1540": 125, - "1550": 11000, - "1552": 15, - "1573": 15, - "1592": 40, - "1595": 40, - "1597": 40, - "1599": 40, - "1601": 11000, - "1603": 13000, - "1605": 13000, - "1607": 13000, - "1609": 13000, - "1611": 13000, - "1613": 11000, - "1615": 11000, - "1617": 10000, - "1619": 10000, - "1621": 10000, - "1623": 10000, - "1625": 10000, - "1627": 10000, - "1629": 10000, - "1631": 10000, - "1635": 18000, - "1637": 10000, - "1639": 10000, - "1641": 10000, - "1643": 10000, - "1645": 10000, - "1654": 18000, - "1656": 18000, - "1658": 18000, - "1660": 18000, - "1662": 18000, - "1664": 10000, - "1673": 18000, - "1675": 10000, - "1677": 10000, - "1679": 10000, - "1681": 10000, - "1683": 10000, - "1692": 18000, - "1694": 10000, - "1696": 10000, - "1698": 10000, - "1700": 10000, - "1702": 10000, - "1704": 10000, - "1712": 10000, - "1714": 10000, - "1716": 10000, - "1718": 125, - "1720": 10000, - "1722": 10000, - "1724": 125, - "1725": 125, - "1727": 125, - "1729": 125, - "1731": 125, - "1733": 40, - "1734": 18000, - "1735": 40, - "1737": 13000, - "1739": 13000, - "1741": 13000, - "1743": 13000, - "1745": 13000, - "1747": 11000, - "1749": 11000, - "1751": 13000, - "1753": 13000, - "1755": 40, - "1757": 40, - "1759": 13000, - "1761": 13000, - "1763": 150, - "1765": 150, - "1767": 150, - "1769": 150, - "1771": 150, - "1773": 150, - "1775": 13000, - "1777": 13000, - "1779": 13000, - "1781": 13000, - "1783": 13000, - "1785": 40, - "1787": 10000, - "1789": 10000, - "1791": 10000, - "1793": 11000, - "1794": 15, - "1823": 2000, - "1831": 10000, - "1833": 150, - "1835": 150, - "1837": 150, - "1854": 18000, - "1859": 11000, - "1861": 11000, - "1865": 11000, - "1869": 11000, - "1871": 11000, - "1873": 11000, - "1875": 11000, - "1877": 11000, - "1879": 11000, - "1881": 11000, - "1885": 10000, - "1887": 40, - "1891": 6000, - "1897": 6000, - "1905": 2000, - "1907": 2000, - "1909": 2000, - "1911": 2000, - "1913": 2000, - "1915": 2000, - "1917": 2000, - "1919": 10000, - "1921": 13000, - "1923": 13000, - "1925": 13000, - "1927": 13000, - "1929": 13000, - "1931": 13000, - "1933": 13000, - "1935": 13000, - "1937": 13000, - "1939": 13000, - "1941": 13000, - "1942": 13000, - "1944": 13000, - "1947": 13000, - "1949": 150, - "1951": 13000, - "1953": 13000, - "1955": 13000, - "1957": 13000, - "1959": 50, - "1961": 50, - "1963": 13000, - "1965": 6000, - "1969": 50, - "1971": 6000, - "1973": 13000, - "1975": 13000, - "1978": 2000, - "1980": 13000, - "1982": 13000, - "1985": 13000, - "1987": 13000, - "1989": 50, - "1993": 6000, - "2003": 10000, - "2007": 11000, - "2011": 10000, - "2015": 13000, - "2017": 13000, - "2019": 13000, - "2021": 13000, - "2023": 15, - "2025": 40, - "2026": 13000, - "2028": 2000, - "2030": 2000, - "2032": 2000, - "2034": 2000, - "2036": 2000, - "2038": 2000, - "2040": 2000, - "2048": 2000, - "2054": 2000, - "2064": 2000, - "2074": 2000, - "2080": 2000, - "2084": 2000, - "2092": 2000, - "2102": 13000, - "2104": 13000, - "2106": 13000, - "2108": 13000, - "2110": 13000, - "2112": 13000, - "2114": 13000, - "2116": 13000, - "2118": 13000, - "2120": 13000, - "2122": 13000, - "2124": 13000, - "2126": 13000, - "2128": 13000, - "2130": 13000, - "2132": 13000, - "2134": 13000, - "2136": 13000, - "2138": 13000, - "2140": 6000, - "2142": 6000, - "2150": 13000, - "2152": 13000, - "2162": 13000, - "2164": 40, - "2165": 40, - "2166": 40, - "2167": 15, - "2169": 13000, - "2171": 13000, - "2185": 6000, - "2187": 6000, - "2191": 6000, - "2195": 6000, - "2205": 6000, - "2209": 6000, - "2213": 6000, - "2217": 6000, - "2219": 6000, - "2221": 6000, - "2223": 6000, - "2225": 6000, - "2227": 6000, - "2229": 6000, - "2231": 6000, - "2233": 6000, - "2235": 6000, - "2237": 6000, - "2239": 6000, - "2241": 6000, - "2243": 6000, - "2253": 6000, - "2255": 6000, - "2259": 6000, - "2277": 6000, - "2281": 6000, - "2283": 11000, - "2289": 10000, - "2293": 10000, - "2297": 10000, - "2301": 10000, - "2307": 13000, - "2309": 6000, - "2313": 500, - "2315": 13000, - "2317": 13000, - "2319": 13000, - "2321": 13000, - "2323": 10000, - "2325": 15, - "2327": 10000, - "2337": 15, - "2341": 15, - "2343": 15, - "2347": 40, - "2349": 10000, - "2351": 10000, - "2353": 10000, - "2355": 10000, - "2357": 10000, - "2359": 10000, - "2361": 10000, - "2363": 10000, - "2366": 50, - "2368": 50, - "2370": 13000, - "2428": 2000, - "2430": 2000, - "2432": 2000, - "2434": 2000, - "2436": 2000, - "2438": 2000, - "2440": 2000, - "2442": 2000, - "2444": 2000, - "2446": 2000, - "2448": 2000, - "2450": 2000, - "2452": 2000, - "2454": 2000, - "2456": 2000, - "2458": 2000, - "2460": 150, - "2462": 150, - "2464": 150, - "2466": 150, - "2468": 150, - "2470": 150, - "2472": 150, - "2474": 150, - "2476": 150, - "2481": 11000, - "2483": 10000, - "2485": 11000, - "2487": 125, - "2489": 70, - "2491": 70, - "2493": 125, - "2495": 70, - "2497": 70, - "2499": 125, - "2501": 70, - "2503": 70, - "2505": 13000, - "2507": 11000, - "2509": 11000, - "2520": 150, - "2522": 150, - "2524": 150, - "2526": 150, - "2550": 10000, - "2552": 10000, - "2568": 10000, - "2570": 10000, - "2572": 10000, - "2577": 8, - "2579": 8, - "2581": 8, - "2583": 8, - "2585": 8, - "2587": 8, - "2589": 8, - "2591": 8, - "2593": 8, - "2595": 8, - "2597": 8, - "2599": 8, - "2601": 8, - "2603": 8, - "2605": 8, - "2607": 8, - "2609": 8, - "2611": 8, - "2613": 8, - "2615": 8, - "2617": 8, - "2619": 8, - "2621": 8, - "2623": 8, - "2625": 8, - "2627": 8, - "2629": 8, - "2631": 4, - "2633": 4, - "2635": 4, - "2637": 4, - "2639": 4, - "2641": 4, - "2643": 4, - "2645": 4, - "2647": 4, - "2649": 4, - "2651": 4, - "2653": 8, - "2655": 8, - "2657": 8, - "2659": 8, - "2661": 8, - "2663": 8, - "2665": 8, - "2667": 8, - "2669": 8, - "2671": 8, - "2673": 8, - "2675": 8, - "2859": 13000, - "2861": 7000, - "2862": 13000, - "2864": 7000, - "2865": 7000, - "2866": 7000, - "2876": 13000, - "2878": 6000, - "2890": 70, - "2894": 150, - "2896": 150, - "2898": 150, - "2900": 150, - "2902": 150, - "2904": 150, - "2906": 150, - "2908": 150, - "2910": 150, - "2912": 150, - "2914": 150, - "2916": 150, - "2918": 150, - "2920": 150, - "2922": 150, - "2924": 150, - "2926": 150, - "2928": 150, - "2930": 150, - "2932": 150, - "2934": 150, - "2936": 150, - "2938": 150, - "2940": 150, - "2942": 150, - "2955": 2000, - "2961": 15, - "2970": 13000, - "2972": 13000, - "2974": 13000, - "2976": 40, - "2997": 4, - "2998": 13000, - "3000": 11000, - "3002": 10000, - "3004": 10000, - "3008": 2000, - "3010": 2000, - "3012": 2000, - "3014": 2000, - "3016": 2000, - "3018": 2000, - "3020": 2000, - "3022": 2000, - "3024": 2000, - "3026": 2000, - "3028": 2000, - "3030": 2000, - "3032": 2000, - "3034": 2000, - "3036": 2000, - "3038": 2000, - "3040": 2000, - "3042": 2000, - "3044": 2000, - "3046": 2000, - "3049": 13000, - "3051": 11000, - "3053": 8, - "3054": 8, - "3093": 7000, - "3094": 7000, - "3095": 125, - "3096": 125, - "3097": 125, - "3098": 125, - "3099": 125, - "3100": 125, - "3101": 70, - "3105": 15, - "3107": 15, - "3122": 70, - "3123": 7500, - "3125": 3000, - "3138": 11000, - "3140": 70, - "3142": 13000, - "3144": 10000, - "3157": 15, - "3159": 15, - "3162": 15, - "3183": 3000, - "3188": 40, - "3190": 125, - "3192": 125, - "3194": 125, - "3196": 125, - "3198": 125, - "3200": 125, - "3202": 70, - "3204": 70, - "3211": 13000, - "3216": 15, - "3226": 13000, - "3228": 6000, - "3239": 13000, - "3325": 11000, - "3327": 150, - "3329": 150, - "3331": 150, - "3333": 150, - "3335": 150, - "3337": 150, - "3339": 150, - "3341": 150, - "3343": 150, - "3345": 13000, - "3347": 13000, - "3349": 13000, - "3351": 13000, - "3353": 13000, - "3355": 13000, - "3357": 13000, - "3359": 13000, - "3361": 13000, - "3363": 13000, - "3365": 13000, - "3367": 13000, - "3369": 6000, - "3371": 6000, - "3373": 6000, - "3379": 13000, - "3381": 6000, - "3385": 70, - "3387": 70, - "3389": 70, - "3391": 70, - "3393": 70, - "3396": 7500, - "3398": 7500, - "3400": 7500, - "3402": 7500, - "3404": 7500, - "3406": 10000, - "3408": 2000, - "3410": 2000, - "3412": 2000, - "3414": 2000, - "3420": 10000, - "3422": 10000, - "3424": 10000, - "3426": 10000, - "3428": 10000, - "3430": 2000, - "3432": 2000, - "3434": 2000, - "3436": 2000, - "3438": 11000, - "3440": 11000, - "3442": 11000, - "3444": 11000, - "3446": 11000, - "3448": 11000, - "3470": 11000, - "3472": 8, - "3473": 8, - "3474": 8, - "3475": 8, - "3476": 8, - "3477": 8, - "3478": 8, - "3479": 8, - "3480": 8, - "3481": 8, - "3483": 8, - "3485": 8, - "3486": 8, - "3488": 8, - "3678": 40, - "3749": 70, - "3751": 70, - "3753": 70, - "3755": 70, - "3759": 150, - "3761": 150, - "3763": 150, - "3765": 150, - "3767": 150, - "3769": 150, - "3771": 150, - "3773": 150, - "3775": 150, - "3777": 150, - "3779": 150, - "3781": 150, - "3783": 150, - "3785": 150, - "3787": 150, - "3789": 150, - "3791": 150, - "3793": 150, - "3795": 150, - "3797": 150, - "3799": 150, - "3801": 2000, - "3803": 2000, - "3827": 5, - "3828": 5, - "3829": 5, - "3830": 5, - "3831": 5, - "3832": 5, - "3833": 5, - "3834": 5, - "3835": 5, - "3836": 5, - "3837": 5, - "3838": 5, - "3853": 10000, - "4012": 6000, - "4014": 6000, - "4016": 6000, - "4087": 70, - "4089": 125, - "4091": 125, - "4093": 125, - "4095": 125, - "4097": 125, - "4099": 70, - "4101": 70, - "4103": 70, - "4105": 70, - "4107": 70, - "4109": 70, - "4111": 70, - "4113": 70, - "4115": 70, - "4117": 70, - "4119": 125, - "4121": 125, - "4123": 125, - "4125": 125, - "4127": 125, - "4129": 125, - "4131": 70, - "4151": 70, - "4153": 70, - "4156": 40, - "4161": 8000, - "4162": 40, - "4164": 70, - "4166": 70, - "4168": 70, - "4170": 70, - "4207": 70, - "4212": 70, - "4224": 70, - "4298": 15, - "4300": 15, - "4302": 15, - "4304": 15, - "4306": 15, - "4308": 15, - "4310": 15, - "4315": 150, - "4317": 150, - "4319": 150, - "4321": 150, - "4323": 150, - "4325": 150, - "4327": 150, - "4329": 150, - "4331": 150, - "4333": 150, - "4335": 150, - "4337": 150, - "4339": 150, - "4341": 150, - "4343": 150, - "4345": 150, - "4347": 150, - "4349": 150, - "4351": 150, - "4353": 150, - "4355": 150, - "4357": 150, - "4359": 150, - "4361": 150, - "4363": 150, - "4365": 150, - "4367": 150, - "4369": 150, - "4371": 150, - "4373": 150, - "4375": 150, - "4377": 150, - "4379": 150, - "4381": 150, - "4383": 150, - "4385": 150, - "4387": 150, - "4389": 150, - "4391": 150, - "4393": 150, - "4395": 150, - "4397": 150, - "4399": 150, - "4401": 150, - "4403": 150, - "4405": 150, - "4407": 150, - "4409": 150, - "4411": 150, - "4413": 150, - "4417": 2000, - "4419": 2000, - "4421": 2000, - "4423": 2000, - "4436": 15, - "4438": 100, - "4440": 15, - "4456": 13000, - "4458": 13000, - "4460": 13000, - "4517": 6000, - "4522": 40, - "4525": 10000, - "4527": 10000, - "4529": 40, - "4532": 40, - "4535": 10000, - "4537": 40, - "4540": 10000, - "4542": 10000, - "4544": 10000, - "4546": 10000, - "4548": 10000, - "4551": 125, - "4580": 8, - "4582": 8, - "4585": 70, - "4587": 70, - "4591": 15, - "4593": 15, - "4595": 15, - "4600": 125, - "4608": 15, - "4627": 2000, - "4668": 15, - "4675": 70, - "4684": 15, - "4687": 15, - "4689": 15, - "4694": 12000, - "4695": 12000, - "4696": 12000, - "4697": 12000, - "4698": 12000, - "4699": 12000, - "4708": 15, - "4710": 15, - "4712": 15, - "4714": 15, - "4716": 15, - "4718": 15, - "4720": 15, - "4722": 15, - "4724": 15, - "4726": 15, - "4728": 15, - "4730": 15, - "4732": 15, - "4734": 15, - "4736": 15, - "4738": 15, - "4740": 11000, - "4745": 15, - "4747": 15, - "4749": 15, - "4751": 15, - "4753": 15, - "4755": 15, - "4757": 15, - "4759": 15, - "4773": 11000, - "4778": 11000, - "4783": 11000, - "4788": 11000, - "4793": 11000, - "4798": 11000, - "4803": 11000, - "4812": 3000, - "4819": 13000, - "4820": 13000, - "4821": 13000, - "4822": 13000, - "4823": 13000, - "4824": 13000, - "4825": 10000, - "4827": 70, - "4830": 7500, - "4832": 7500, - "4834": 7500, - "4842": 2000, - "4844": 2000, - "4846": 2000, - "4848": 2000, - "4850": 3000, - "4860": 15, - "4866": 15, - "4872": 15, - "4878": 15, - "4884": 15, - "4890": 15, - "4896": 15, - "4902": 15, - "4908": 15, - "4914": 15, - "4920": 15, - "4926": 15, - "4932": 15, - "4938": 15, - "4944": 15, - "4950": 15, - "4956": 15, - "4962": 15, - "4968": 15, - "4974": 15, - "4980": 15, - "4986": 15, - "4992": 15, - "4998": 15, - "5001": 13000, - "5003": 10000, - "5014": 4, - "5016": 4, - "5018": 4, - "5024": 150, - "5026": 150, - "5028": 150, - "5030": 150, - "5032": 150, - "5034": 150, - "5036": 150, - "5038": 150, - "5040": 150, - "5042": 150, - "5044": 150, - "5046": 150, - "5048": 150, - "5050": 150, - "5052": 150, - "5075": 11000, - "5096": 600, - "5097": 600, - "5098": 200, - "5099": 600, - "5100": 600, - "5101": 600, - "5102": 600, - "5103": 600, - "5104": 200, - "5105": 200, - "5106": 200, - "5280": 200, - "5281": 200, - "5282": 200, - "5283": 200, - "5284": 200, - "5285": 200, - "5286": 200, - "5287": 200, - "5288": 200, - "5289": 200, - "5290": 200, - "5291": 600, - "5292": 600, - "5293": 600, - "5294": 600, - "5295": 200, - "5296": 600, - "5297": 600, - "5298": 200, - "5299": 200, - "5300": 200, - "5301": 200, - "5302": 200, - "5303": 200, - "5304": 200, - "5305": 600, - "5306": 600, - "5307": 600, - "5308": 600, - "5309": 600, - "5310": 600, - "5311": 200, - "5312": 200, - "5313": 200, - "5314": 200, - "5315": 200, - "5316": 200, - "5318": 600, - "5319": 600, - "5320": 600, - "5321": 200, - "5322": 600, - "5323": 600, - "5324": 600, - "5325": 40, - "5329": 40, - "5331": 40, - "5341": 40, - "5343": 40, - "5345": 150, - "5350": 10000, - "5352": 10000, - "5354": 600, - "5370": 200, - "5371": 200, - "5372": 200, - "5373": 200, - "5374": 200, - "5376": 10000, - "5386": 600, - "5396": 600, - "5406": 200, - "5416": 600, - "5418": 10000, - "5438": 600, - "5458": 600, - "5478": 600, - "5496": 200, - "5497": 200, - "5498": 200, - "5499": 200, - "5500": 200, - "5501": 200, - "5502": 200, - "5503": 200, - "5504": 11000, - "5516": 40, - "5521": 10000, - "5523": 40, - "5525": 10000, - "5527": 40, - "5529": 40, - "5531": 40, - "5533": 40, - "5535": 40, - "5537": 40, - "5539": 40, - "5541": 40, - "5543": 40, - "5547": 40, - "5574": 125, - "5575": 125, - "5576": 125, - "5616": 7000, - "5617": 7000, - "5618": 7000, - "5619": 7000, - "5620": 11000, - "5621": 11000, - "5622": 7000, - "5623": 7000, - "5624": 7000, - "5625": 7000, - "5626": 11000, - "5627": 11000, - "5628": 7000, - "5629": 7000, - "5630": 7000, - "5631": 7000, - "5632": 7000, - "5633": 11000, - "5634": 11000, - "5635": 7000, - "5636": 7000, - "5637": 7000, - "5638": 7000, - "5639": 7000, - "5640": 11000, - "5641": 11000, - "5642": 7000, - "5643": 7000, - "5644": 7000, - "5645": 7000, - "5646": 11000, - "5647": 11000, - "5648": 7000, - "5649": 7000, - "5650": 7000, - "5651": 7000, - "5652": 11000, - "5653": 11000, - "5654": 7000, - "5655": 7000, - "5656": 7000, - "5657": 7000, - "5658": 7000, - "5659": 7000, - "5660": 7000, - "5661": 7000, - "5662": 7000, - "5663": 7000, - "5664": 7000, - "5665": 7000, - "5666": 7000, - "5667": 7000, - "5668": 125, - "5670": 125, - "5672": 125, - "5674": 125, - "5676": 125, - "5678": 70, - "5680": 70, - "5682": 125, - "5686": 125, - "5688": 125, - "5690": 125, - "5692": 125, - "5694": 125, - "5696": 70, - "5698": 70, - "5700": 125, - "5704": 125, - "5706": 125, - "5708": 125, - "5710": 125, - "5712": 125, - "5714": 70, - "5716": 70, - "5718": 125, - "5720": 125, - "5722": 125, - "5724": 125, - "5726": 125, - "5728": 70, - "5730": 70, - "5734": 8, - "5736": 8, - "5739": 2000, - "5741": 2000, - "5743": 2000, - "5745": 2000, - "5747": 2000, - "5749": 2000, - "5751": 2000, - "5753": 2000, - "5755": 2000, - "5757": 2000, - "5759": 2000, - "5761": 2000, - "5763": 2000, - "5765": 2000, - "5767": 11000, - "5769": 10000, - "5777": 2000, - "5785": 2000, - "5793": 2000, - "5801": 2000, - "5809": 2000, - "5817": 2000, - "5825": 2000, - "5833": 2000, - "5841": 2000, - "5849": 2000, - "5857": 2000, - "5865": 2000, - "5873": 2000, - "5881": 2000, - "5889": 2000, - "5897": 2000, - "5905": 2000, - "5913": 2000, - "5921": 2000, - "5929": 2000, - "5931": 13000, - "5933": 11000, - "5935": 11000, - "5937": 2000, - "5940": 2000, - "5943": 4000, - "5945": 4000, - "5947": 4000, - "5949": 4000, - "5952": 4000, - "5954": 4000, - "5956": 4000, - "5958": 4000, - "5968": 600, - "5970": 11000, - "5972": 11000, - "5974": 11000, - "5980": 11000, - "5982": 11000, - "5984": 11000, - "5988": 11000, - "5992": 11000, - "5994": 11000, - "5996": 11000, - "5998": 11000, - "6000": 11000, - "6002": 11000, - "6004": 11000, - "6006": 11000, - "6008": 11000, - "6010": 600, - "6012": 600, - "6014": 600, - "6016": 11000, - "6018": 11000, - "6032": 600, - "6034": 600, - "6036": 2000, - "6038": 11000, - "6043": 11000, - "6045": 11000, - "6047": 11000, - "6049": 11000, - "6051": 11000, - "6055": 600, - "6061": 11000, - "6062": 11000, - "6128": 70, - "6129": 70, - "6130": 70, - "6131": 70, - "6133": 70, - "6135": 70, - "6137": 70, - "6139": 70, - "6141": 70, - "6143": 125, - "6145": 125, - "6147": 125, - "6149": 125, - "6151": 125, - "6153": 125, - "6155": 11000, - "6157": 11000, - "6159": 11000, - "6161": 11000, - "6163": 11000, - "6165": 11000, - "6167": 11000, - "6169": 11000, - "6171": 11000, - "6173": 11000, - "6211": 11000, - "6213": 11000, - "6215": 125, - "6235": 125, - "6237": 125, - "6257": 125, - "6259": 125, - "6279": 125, - "6281": 100, - "6283": 100, - "6285": 100, - "6287": 13000, - "6289": 13000, - "6291": 13000, - "6297": 6000, - "6299": 6000, - "6305": 13000, - "6306": 18000, - "6311": 5, - "6313": 15, - "6315": 15, - "6317": 15, - "6319": 100, - "6322": 125, - "6324": 125, - "6326": 125, - "6328": 125, - "6330": 125, - "6332": 11000, - "6333": 13000, - "6335": 150, - "6337": 150, - "6339": 150, - "6341": 150, - "6343": 150, - "6345": 150, - "6347": 150, - "6349": 150, - "6351": 150, - "6353": 150, - "6355": 150, - "6357": 150, - "6359": 150, - "6361": 150, - "6363": 150, - "6365": 150, - "6367": 150, - "6369": 150, - "6371": 150, - "6373": 150, - "6375": 150, - "6377": 150, - "6379": 150, - "6382": 150, - "6384": 150, - "6386": 150, - "6388": 150, - "6390": 150, - "6392": 150, - "6394": 150, - "6396": 150, - "6398": 150, - "6400": 150, - "6402": 150, - "6404": 150, - "6406": 150, - "6408": 125, - "6410": 125, - "6412": 125, - "6414": 125, - "6416": 125, - "6418": 125, - "6420": 125, - "6470": 50, - "6472": 50, - "6474": 50, - "6476": 50, - "6522": 11000, - "6523": 70, - "6524": 70, - "6525": 70, - "6526": 70, - "6527": 70, - "6528": 70, - "6562": 8, - "6563": 8, - "6568": 70, - "6571": 11000, - "6573": 11000, - "6575": 10000, - "6577": 10000, - "6579": 10000, - "6581": 10000, - "6583": 70, - "6585": 8, - "6587": 125, - "6589": 125, - "6591": 125, - "6593": 125, - "6595": 125, - "6597": 125, - "6599": 125, - "6601": 125, - "6603": 125, - "6605": 125, - "6607": 125, - "6609": 125, - "6611": 125, - "6613": 125, - "6615": 125, - "6617": 125, - "6619": 125, - "6621": 125, - "6623": 125, - "6625": 125, - "6627": 125, - "6629": 125, - "6631": 125, - "6633": 125, - "6667": 100, - "6681": 100, - "6685": 2000, - "6687": 2000, - "6689": 2000, - "6691": 2000, - "6693": 11000, - "6697": 11000, - "6701": 13000, - "6703": 13000, - "6705": 13000, - "6724": 8, - "6729": 7500, - "6731": 8, - "6733": 8, - "6735": 8, - "6737": 8, - "6739": 40, - "6750": 15, - "6752": 15, - "6760": 8, - "6762": 8, - "6764": 8, - "6794": 6000, - "6809": 70, - "6812": 7500, - "6814": 18000, - "6889": 15, - "6891": 15, - "6908": 125, - "6910": 125, - "6912": 70, - "6914": 70, - "6916": 125, - "6918": 125, - "6920": 125, - "6922": 125, - "6924": 125, - "6959": 150, - "6962": 6000, - "6971": 100, - "6973": 100, - "6975": 100, - "6977": 100, - "6979": 100, - "6981": 100, - "6983": 100, - "7051": 40, - "7054": 13000, - "7056": 13000, - "7058": 13000, - "7060": 13000, - "7062": 13000, - "7064": 13000, - "7066": 13000, - "7068": 13000, - "7070": 13000, - "7072": 13000, - "7074": 13000, - "7076": 13000, - "7078": 13000, - "7080": 13000, - "7082": 13000, - "7084": 13000, - "7086": 13000, - "7088": 11000, - "7110": 150, - "7112": 150, - "7114": 150, - "7116": 150, - "7122": 150, - "7124": 150, - "7126": 150, - "7128": 150, - "7130": 150, - "7132": 150, - "7134": 150, - "7136": 150, - "7138": 150, - "7158": 8, - "7159": 70, - "7162": 15, - "7168": 13000, - "7170": 11000, - "7176": 13000, - "7178": 10000, - "7186": 13000, - "7188": 10000, - "7196": 13000, - "7198": 10000, - "7206": 13000, - "7208": 10000, - "7216": 13000, - "7218": 10000, - "7223": 6000, - "7225": 11000, - "7228": 6000, - "7319": 4, - "7321": 4, - "7323": 4, - "7325": 4, - "7327": 4, - "7329": 150, - "7330": 150, - "7331": 150, - "7332": 70, - "7334": 70, - "7336": 70, - "7338": 70, - "7340": 70, - "7342": 70, - "7344": 70, - "7346": 70, - "7348": 70, - "7350": 70, - "7352": 70, - "7354": 70, - "7356": 70, - "7358": 70, - "7360": 70, - "7362": 8, - "7364": 8, - "7366": 8, - "7368": 8, - "7370": 8, - "7372": 8, - "7374": 8, - "7376": 8, - "7378": 8, - "7380": 8, - "7382": 8, - "7384": 8, - "7386": 4, - "7388": 4, - "7390": 4, - "7392": 4, - "7394": 4, - "7396": 4, - "7398": 8, - "7399": 8, - "7400": 8, - "7416": 50, - "7418": 50, - "7433": 50, - "7435": 50, - "7437": 50, - "7439": 50, - "7441": 50, - "7443": 50, - "7445": 50, - "7447": 50, - "7449": 50, - "7451": 50, - "7466": 15, - "7468": 15, - "7521": 6000, - "7566": 11000, - "7568": 10000, - "7650": 13000, - "7660": 2000, - "7662": 2000, - "7664": 2000, - "7666": 2000, - "7668": 8, - "7754": 500, - "7759": 150, - "7761": 150, - "7763": 150, - "7765": 150, - "7767": 150, - "7769": 150, - "7771": 150, - "7801": 11000, - "7919": 10000, - "7936": 20000, - "7939": 7500, - "7944": 13000, - "7946": 13000, - "8007": 10000, - "8008": 10000, - "8009": 10000, - "8010": 10000, - "8011": 10000, - "8012": 10000, - "8013": 10000, - "8014": 10000, - "8015": 10000, - "8016": 10000, - "8017": 10000, - "8018": 10000, - "8019": 10000, - "8020": 10000, - "8021": 10000, - "8417": 10000, - "8419": 10000, - "8421": 10000, - "8423": 10000, - "8425": 10000, - "8427": 10000, - "8429": 10000, - "8431": 10000, - "8433": 10000, - "8435": 10000, - "8437": 10000, - "8439": 10000, - "8441": 10000, - "8443": 10000, - "8445": 10000, - "8447": 10000, - "8449": 10000, - "8451": 10000, - "8453": 10000, - "8455": 10000, - "8457": 10000, - "8459": 10000, - "8461": 10000, - "8496": 500, - "8498": 500, - "8500": 500, - "8502": 500, - "8504": 500, - "8506": 500, - "8508": 500, - "8510": 500, - "8512": 500, - "8514": 500, - "8516": 500, - "8518": 500, - "8520": 500, - "8522": 500, - "8524": 500, - "8526": 500, - "8528": 500, - "8530": 500, - "8532": 500, - "8548": 500, - "8550": 500, - "8552": 500, - "8554": 500, - "8556": 500, - "8558": 500, - "8560": 500, - "8562": 500, - "8564": 500, - "8566": 500, - "8568": 500, - "8570": 500, - "8572": 500, - "8574": 500, - "8576": 500, - "8578": 500, - "8580": 500, - "8582": 500, - "8584": 500, - "8586": 500, - "8588": 500, - "8590": 500, - "8592": 500, - "8594": 500, - "8596": 500, - "8598": 500, - "8600": 500, - "8602": 500, - "8604": 500, - "8606": 500, - "8608": 500, - "8610": 500, - "8612": 500, - "8614": 500, - "8616": 500, - "8618": 500, - "8620": 500, - "8622": 500, - "8624": 500, - "8626": 500, - "8628": 500, - "8778": 13000, - "8780": 13000, - "8782": 13000, - "8784": 11000, - "8786": 11000, - "8788": 11000, - "8790": 13000, - "8792": 11000, - "8794": 40, - "8837": 13000, - "8872": 70, - "8874": 70, - "8876": 70, - "8878": 70, - "8880": 70, - "8882": 11000, - "8901": 70, - "8921": 70, - "8924": 150, - "8925": 150, - "8926": 150, - "8927": 150, - "8928": 150, - "9003": 15, - "9004": 15, - "9026": 13000, - "9028": 13000, - "9030": 13000, - "9032": 13000, - "9034": 13000, - "9036": 13000, - "9038": 13000, - "9040": 13000, - "9042": 13000, - "9044": 50, - "9050": 10000, - "9052": 6000, - "9075": 10000, - "9140": 7000, - "9141": 7000, - "9142": 7000, - "9143": 11000, - "9144": 11000, - "9145": 11000, - "9174": 125, - "9177": 125, - "9179": 125, - "9181": 125, - "9183": 70, - "9185": 70, - "9187": 11000, - "9188": 11000, - "9189": 11000, - "9190": 11000, - "9191": 11000, - "9192": 11000, - "9193": 11000, - "9194": 11000, - "9236": 11000, - "9238": 11000, - "9239": 11000, - "9240": 11000, - "9241": 11000, - "9242": 11000, - "9243": 11000, - "9244": 11000, - "9245": 11000, - "9287": 11000, - "9288": 11000, - "9289": 11000, - "9290": 11000, - "9291": 11000, - "9292": 11000, - "9294": 11000, - "9295": 11000, - "9296": 11000, - "9297": 11000, - "9298": 11000, - "9299": 11000, - "9301": 11000, - "9302": 11000, - "9303": 11000, - "9304": 11000, - "9305": 11000, - "9306": 11000, - "9336": 11000, - "9337": 11000, - "9338": 11000, - "9339": 11000, - "9340": 11000, - "9341": 11000, - "9342": 11000, - "9375": 13000, - "9377": 13000, - "9378": 13000, - "9379": 13000, - "9380": 13000, - "9381": 13000, - "9382": 13000, - "9416": 11000, - "9418": 11000, - "9419": 11000, - "9420": 10000, - "9423": 10000, - "9425": 10000, - "9427": 10000, - "9429": 10000, - "9431": 10000, - "9434": 40, - "9436": 13000, - "9438": 11000, - "9440": 10000, - "9442": 10000, - "9444": 10000, - "9446": 10000, - "9448": 10000, - "9450": 10000, - "9452": 10000, - "9454": 10000, - "9457": 10000, - "9459": 10000, - "9461": 10000, - "9463": 10000, - "9465": 10000, - "9469": 15, - "9470": 4, - "9472": 4, - "9475": 10000, - "9629": 150, - "9634": 150, - "9636": 150, - "9638": 150, - "9640": 150, - "9642": 150, - "9644": 150, - "9666": 70, - "9668": 70, - "9670": 70, - "9672": 70, - "9674": 70, - "9676": 70, - "9678": 70, - "9729": 70, - "9731": 70, - "9733": 70, - "9735": 13000, - "9736": 13000, - "9739": 2000, - "9741": 2000, - "9743": 2000, - "9745": 2000, - "9843": 500, - "9844": 500, - "9845": 500, - "9846": 500, - "9847": 500, - "9848": 500, - "9849": 500, - "9850": 500, - "9851": 500, - "9852": 500, - "9853": 500, - "9854": 500, - "9855": 500, - "9856": 500, - "9857": 500, - "9858": 500, - "9859": 500, - "9860": 500, - "9861": 500, - "9862": 500, - "9863": 500, - "9864": 500, - "9865": 500, - "9866": 500, - "9867": 500, - "9978": 11000, - "9980": 6000, - "9986": 11000, - "9988": 6000, - "9994": 8000, - "9996": 8000, - "9998": 2000, - "10000": 2000, - "10002": 2000, - "10004": 2000, - "10006": 250, - "10008": 250, - "10010": 125, - "10012": 40, - "10014": 125, - "10016": 125, - "10018": 125, - "10020": 125, - "10025": 250, - "10029": 40, - "10031": 250, - "10033": 7000, - "10034": 7000, - "10035": 150, - "10037": 150, - "10039": 150, - "10041": 150, - "10043": 150, - "10045": 150, - "10047": 150, - "10049": 150, - "10051": 150, - "10053": 150, - "10055": 150, - "10057": 150, - "10059": 150, - "10061": 150, - "10063": 150, - "10065": 150, - "10067": 150, - "10069": 125, - "10071": 125, - "10075": 8000, - "10077": 125, - "10079": 125, - "10081": 125, - "10083": 125, - "10085": 125, - "10087": 8000, - "10088": 8000, - "10089": 8000, - "10090": 8000, - "10091": 8000, - "10093": 10000, - "10095": 10000, - "10097": 10000, - "10099": 10000, - "10101": 10000, - "10103": 10000, - "10105": 10000, - "10107": 10000, - "10109": 10000, - "10111": 10000, - "10113": 10000, - "10115": 10000, - "10119": 10000, - "10121": 10000, - "10123": 10000, - "10125": 10000, - "10127": 10000, - "10129": 40, - "10132": 150, - "10134": 100, - "10136": 6000, - "10138": 13000, - "10142": 7000, - "10143": 7000, - "10144": 7000, - "10145": 11000, - "10146": 125, - "10147": 125, - "10148": 125, - "10149": 125, - "10150": 40, - "10156": 70, - "10158": 11000, - "10159": 11000, - "10280": 8, - "10282": 8, - "10284": 8, - "10286": 70, - "10288": 70, - "10290": 70, - "10292": 70, - "10294": 70, - "10296": 70, - "10298": 70, - "10300": 70, - "10302": 70, - "10304": 70, - "10306": 70, - "10308": 70, - "10310": 70, - "10312": 70, - "10314": 70, - "10316": 4, - "10318": 4, - "10320": 4, - "10322": 4, - "10324": 4, - "10326": 150, - "10327": 150, - "10330": 8, - "10332": 8, - "10334": 8, - "10336": 8, - "10338": 8, - "10340": 8, - "10342": 8, - "10344": 8, - "10346": 8, - "10348": 8, - "10350": 8, - "10352": 8, - "10354": 5, - "10362": 5, - "10364": 5, - "10366": 5, - "10368": 8, - "10370": 8, - "10372": 8, - "10374": 8, - "10376": 8, - "10378": 8, - "10380": 8, - "10382": 8, - "10384": 8, - "10386": 8, - "10388": 8, - "10390": 8, - "10392": 4, - "10394": 4, - "10396": 4, - "10398": 4, - "10400": 4, - "10402": 4, - "10404": 4, - "10406": 4, - "10408": 4, - "10410": 4, - "10412": 4, - "10414": 4, - "10416": 4, - "10418": 4, - "10420": 4, - "10422": 4, - "10424": 4, - "10426": 4, - "10428": 4, - "10430": 4, - "10432": 4, - "10434": 4, - "10436": 4, - "10438": 4, - "10440": 8, - "10442": 8, - "10444": 8, - "10446": 8, - "10448": 8, - "10450": 8, - "10452": 8, - "10454": 8, - "10456": 8, - "10458": 8, - "10460": 8, - "10462": 8, - "10464": 8, - "10466": 8, - "10468": 8, - "10470": 8, - "10472": 8, - "10474": 8, - "10476": 10000, - "10496": 15, - "10564": 70, - "10589": 70, - "10808": 11000, - "10810": 11000, - "10812": 11000, - "10814": 13000, - "10816": 11000, - "10818": 13000, - "10820": 13000, - "10822": 70, - "10824": 70, - "10826": 70, - "10828": 70, - "10891": 15, - "10925": 2000, - "10927": 2000, - "10929": 2000, - "10931": 2000, - "10937": 11000, - "10952": 40, - "10954": 70, - "10956": 70, - "10958": 70, - "10973": 10000, - "10978": 13000, - "10981": 11000, - "10999": 15, - "11037": 8, - "11061": 8, - "11065": 40, - "11069": 18000, - "11072": 10000, - "11074": 10000, - "11076": 10000, - "11079": 10000, - "11085": 10000, - "11088": 10000, - "11090": 10000, - "11092": 10000, - "11095": 10000, - "11105": 10000, - "11113": 10000, - "11115": 10000, - "11118": 10000, - "11126": 10000, - "11128": 70, - "11130": 10000, - "11133": 70, - "11200": 50, - "11205": 15, - "11212": 11000, - "11227": 11000, - "11228": 11000, - "11229": 11000, - "11230": 11000, - "11231": 11000, - "11232": 11000, - "11233": 11000, - "11234": 11000, - "11235": 8, - "11237": 10000, - "11238": 18000, - "11240": 18000, - "11242": 18000, - "11244": 18000, - "11246": 18000, - "11248": 18000, - "11250": 18000, - "11252": 18000, - "11254": 18000, - "11256": 18000, - "11260": 13000, - "11280": 150, - "11284": 8, - "11286": 5, - "11324": 13000, - "11326": 13000, - "11328": 13000, - "11330": 13000, - "11332": 13000, - "11334": 8000, - "11335": 8, - "11367": 125, - "11369": 125, - "11371": 125, - "11373": 125, - "11375": 125, - "11377": 70, - "11379": 125, - "11382": 125, - "11384": 125, - "11386": 125, - "11389": 125, - "11391": 125, - "11393": 125, - "11396": 125, - "11398": 125, - "11400": 125, - "11403": 125, - "11405": 125, - "11407": 125, - "11410": 125, - "11412": 125, - "11414": 70, - "11417": 70, - "11419": 70, - "11429": 2000, - "11431": 2000, - "11433": 2000, - "11435": 2000, - "11437": 2000, - "11439": 2000, - "11441": 2000, - "11443": 2000, - "11445": 2000, - "11447": 2000, - "11449": 2000, - "11451": 2000, - "11453": 2000, - "11455": 2000, - "11457": 2000, - "11459": 2000, - "11461": 2000, - "11463": 2000, - "11465": 2000, - "11467": 2000, - "11469": 2000, - "11471": 2000, - "11473": 2000, - "11475": 2000, - "11477": 2000, - "11479": 2000, - "11481": 2000, - "11483": 2000, - "11485": 2000, - "11487": 2000, - "11489": 2000, - "11491": 2000, - "11493": 2000, - "11495": 2000, - "11497": 2000, - "11499": 2000, - "11501": 2000, - "11503": 2000, - "11505": 2000, - "11507": 2000, - "11509": 2000, - "11511": 2000, - "11513": 2000, - "11515": 2000, - "11517": 2000, - "11519": 2000, - "11521": 2000, - "11523": 2000, - "11785": 8, - "11787": 8, - "11789": 8, - "11791": 8, - "11798": 10000, - "11802": 8, - "11804": 8, - "11806": 8, - "11808": 8, - "11810": 10000, - "11812": 10000, - "11814": 10000, - "11816": 10000, - "11818": 11000, - "11820": 11000, - "11822": 11000, - "11824": 8, - "11826": 8, - "11828": 8, - "11830": 8, - "11832": 8, - "11834": 8, - "11836": 8, - "11838": 8, - "11840": 70, - "11874": 7000, - "11875": 7000, - "11876": 7000, - "11889": 8, - "11902": 70, - "11905": 8, - "11908": 8, - "11920": 40, - "11924": 8, - "11926": 8, - "11928": 10000, - "11929": 10000, - "11930": 10000, - "11931": 10000, - "11932": 10000, - "11933": 10000, - "11934": 15000, - "11936": 10000, - "11940": 8000, - "11943": 7500, - "11951": 2000, - "11953": 2000, - "11955": 2000, - "11957": 2000, - "11959": 11000, - "11960": 2000, - "11962": 2000, - "11964": 5, - "11968": 10000, - "11972": 10000, - "11978": 10000, - "11980": 10000, - "11990": 4, - "11992": 11000, - "11994": 11000, - "11998": 8, - "12000": 8, - "12002": 8, - "12004": 70, - "12007": 4, - "12193": 8, - "12195": 8, - "12197": 8, - "12199": 8, - "12201": 8, - "12203": 8, - "12205": 4, - "12207": 4, - "12209": 4, - "12211": 4, - "12213": 4, - "12215": 4, - "12217": 4, - "12219": 4, - "12221": 4, - "12223": 4, - "12225": 4, - "12227": 4, - "12229": 4, - "12231": 4, - "12233": 4, - "12235": 4, - "12237": 4, - "12239": 4, - "12241": 4, - "12243": 4, - "12245": 4, - "12247": 4, - "12249": 4, - "12251": 4, - "12253": 8, - "12255": 8, - "12257": 8, - "12259": 8, - "12261": 8, - "12263": 8, - "12265": 8, - "12267": 8, - "12269": 8, - "12271": 8, - "12273": 8, - "12275": 8, - "12277": 8, - "12279": 8, - "12281": 8, - "12283": 8, - "12285": 8, - "12287": 8, - "12289": 8, - "12291": 8, - "12293": 8, - "12295": 8, - "12297": 4, - "12299": 4, - "12301": 4, - "12303": 4, - "12305": 4, - "12307": 4, - "12309": 4, - "12311": 4, - "12313": 4, - "12315": 4, - "12317": 4, - "12319": 4, - "12321": 4, - "12323": 4, - "12325": 4, - "12327": 8, - "12329": 8, - "12331": 8, - "12333": 8, - "12335": 4, - "12337": 4, - "12339": 4, - "12341": 4, - "12343": 4, - "12345": 4, - "12347": 4, - "12349": 4, - "12351": 4, - "12353": 4, - "12355": 4, - "12357": 8, - "12359": 4, - "12361": 4, - "12363": 4, - "12365": 4, - "12367": 4, - "12369": 4, - "12371": 4, - "12373": 4, - "12375": 4, - "12377": 4, - "12379": 4, - "12381": 8, - "12383": 8, - "12385": 8, - "12387": 8, - "12389": 8, - "12391": 8, - "12393": 4, - "12395": 4, - "12397": 4, - "12399": 4, - "12402": 10000, - "12403": 10000, - "12404": 10000, - "12405": 10000, - "12406": 10000, - "12407": 10000, - "12408": 10000, - "12409": 10000, - "12410": 10000, - "12411": 10000, - "12412": 150, - "12422": 8, - "12424": 8, - "12426": 8, - "12428": 4, - "12430": 4, - "12432": 4, - "12434": 4, - "12437": 8, - "12439": 4, - "12441": 4, - "12443": 4, - "12445": 4, - "12447": 4, - "12449": 4, - "12451": 4, - "12453": 4, - "12455": 4, - "12460": 8, - "12462": 8, - "12464": 8, - "12466": 8, - "12468": 8, - "12470": 8, - "12472": 8, - "12474": 8, - "12476": 8, - "12478": 8, - "12480": 8, - "12482": 8, - "12484": 8, - "12486": 8, - "12488": 8, - "12490": 8, - "12492": 8, - "12494": 8, - "12496": 8, - "12498": 8, - "12500": 8, - "12502": 8, - "12504": 8, - "12506": 8, - "12508": 8, - "12510": 8, - "12512": 8, - "12514": 4, - "12516": 4, - "12518": 4, - "12520": 4, - "12522": 4, - "12524": 4, - "12526": 4, - "12528": 4, - "12530": 4, - "12532": 4, - "12534": 4, - "12536": 4, - "12538": 4, - "12540": 4, - "12596": 4, - "12598": 4, - "12601": 8, - "12603": 8, - "12605": 8, - "12613": 5, - "12614": 5, - "12615": 5, - "12616": 5, - "12617": 5, - "12618": 5, - "12619": 5, - "12620": 5, - "12621": 5, - "12622": 5, - "12623": 5, - "12624": 5, - "12625": 2000, - "12627": 2000, - "12629": 2000, - "12631": 2000, - "12633": 2000, - "12635": 2000, - "12640": 11000, - "12642": 10000, - "12695": 2000, - "12697": 2000, - "12699": 2000, - "12701": 2000, - "12746": 18000, - "12757": 4, - "12759": 4, - "12761": 4, - "12763": 4, - "12769": 4, - "12771": 4, - "12775": 10000, - "12776": 10000, - "12777": 10000, - "12778": 10000, - "12779": 10000, - "12780": 10000, - "12781": 10000, - "12782": 10000, - "12783": 10000, - "12786": 10000, - "12789": 50, - "12798": 50, - "12800": 50, - "12802": 50, - "12804": 50, - "12817": 8, - "12819": 5, - "12821": 8, - "12823": 5, - "12825": 8, - "12827": 5, - "12829": 8, - "12831": 8, - "12833": 5, - "12846": 5, - "12849": 50, - "12851": 8, - "12863": 40, - "12865": 125, - "12867": 125, - "12869": 70, - "12871": 70, - "12873": 8, - "12875": 8, - "12877": 8, - "12879": 8, - "12881": 8, - "12883": 8, - "12885": 5, - "12900": 8, - "12902": 8, - "12905": 2000, - "12907": 2000, - "12909": 2000, - "12911": 2000, - "12913": 2000, - "12915": 2000, - "12917": 2000, - "12919": 2000, - "12922": 5, - "12924": 8, - "12927": 5, - "12929": 8, - "12932": 5, - "12934": 30000, - "12936": 4, - "12938": 10000, - "12960": 8, - "12962": 8, - "12964": 8, - "12966": 8, - "12968": 8, - "12970": 8, - "12972": 8, - "12974": 8, - "12976": 8, - "12978": 8, - "12980": 8, - "12982": 8, - "12984": 8, - "12986": 8, - "12988": 8, - "12990": 8, - "12992": 8, - "12994": 8, - "12996": 8, - "12998": 8, - "13000": 8, - "13002": 8, - "13004": 8, - "13006": 8, - "13008": 8, - "13010": 8, - "13012": 8, - "13014": 8, - "13016": 8, - "13018": 8, - "13020": 8, - "13022": 8, - "13024": 8, - "13026": 8, - "13028": 8, - "13030": 8, - "13032": 8, - "13034": 8, - "13036": 8, - "13038": 8, - "13040": 8, - "13042": 8, - "13044": 8, - "13046": 8, - "13048": 8, - "13050": 8, - "13052": 8, - "13054": 8, - "13056": 8, - "13058": 8, - "13060": 8, - "13062": 8, - "13064": 2000, - "13066": 2000, - "13149": 5, - "13151": 5, - "13153": 5, - "13155": 5, - "13157": 5, - "13159": 5, - "13161": 8, - "13163": 8, - "13165": 8, - "13167": 8, - "13169": 8, - "13171": 8, - "13173": 5, - "13175": 5, - "13190": 100, - "13227": 15, - "13229": 15, - "13231": 15, - "13233": 5, - "13235": 15, - "13237": 15, - "13239": 15, - "13245": 4, - "13256": 5, - "13263": 8, - "13265": 8, - "13267": 8, - "13269": 8, - "13271": 8, - "13277": 4, - "13383": 13000, - "13385": 125, - "13387": 125, - "13389": 125, - "13391": 13000, - "13421": 13000, - "13431": 8000, - "13439": 15000, - "13441": 10000, - "13448": 3000, - "13451": 3000, - "13454": 3000, - "13457": 3000, - "13460": 3000, - "13463": 3000, - "13466": 3000, - "13469": 3000, - "13472": 3000, - "13475": 3000, - "13478": 3000, - "13481": 7500, - "13484": 7500, - "13487": 7500, - "13490": 7500, - "13493": 7500, - "13496": 3000, - "13499": 3000, - "13502": 7500, - "13505": 7500, - "13508": 3000, - "13511": 7500, - "13573": 13000, - "13576": 8, - "13652": 8, - "13657": 200, - "19478": 8, - "19481": 8, - "19484": 11000, - "19486": 11000, - "19488": 11000, - "19490": 11000, - "19493": 11000, - "19496": 10000, - "19501": 10000, - "19529": 11000, - "19532": 10000, - "19535": 70, - "19538": 10000, - "19541": 8, - "19544": 10000, - "19547": 70, - "19550": 10000, - "19553": 8, - "19570": 10000, - "19572": 10000, - "19574": 10000, - "19576": 10000, - "19578": 10000, - "19580": 10000, - "19582": 10000, - "19584": 7000, - "19586": 8, - "19589": 8, - "19592": 8, - "19595": 8, - "19598": 8, - "19601": 8, - "19604": 8, - "19607": 8, - "19610": 8, - "19613": 10000, - "19615": 10000, - "19617": 10000, - "19619": 10000, - "19621": 10000, - "19623": 10000, - "19625": 10000, - "19627": 10000, - "19629": 10000, - "19631": 10000, - "19653": 100, - "19656": 13000, - "19662": 10000, - "19665": 13000, - "19669": 12000, - "19672": 11000, - "19701": 4, - "19707": 5, - "19724": 4, - "19727": 4, - "19912": 4, - "19915": 4, - "19918": 8, - "19921": 8, - "19924": 8, - "19927": 8, - "19930": 8, - "19933": 8, - "19936": 8, - "19943": 4, - "19946": 4, - "19949": 4, - "19952": 4, - "19955": 4, - "19958": 4, - "19961": 4, - "19964": 4, - "19967": 4, - "19970": 4, - "19973": 4, - "19976": 4, - "19979": 4, - "19982": 4, - "19985": 4, - "19988": 125, - "19991": 4, - "19994": 8, - "19997": 4, - "20002": 4, - "20005": 4, - "20008": 4, - "20011": 40, - "20014": 40, - "20017": 4, - "20020": 4, - "20023": 4, - "20026": 4, - "20029": 4, - "20032": 4, - "20035": 70, - "20038": 70, - "20041": 70, - "20044": 70, - "20047": 70, - "20050": 70, - "20053": 4, - "20056": 4, - "20059": 4, - "20062": 4, - "20065": 4, - "20068": 4, - "20071": 4, - "20074": 4, - "20077": 4, - "20080": 4, - "20083": 4, - "20086": 4, - "20089": 4, - "20092": 4, - "20095": 4, - "20098": 4, - "20101": 4, - "20104": 4, - "20107": 4, - "20110": 4, - "20113": 4, - "20116": 4, - "20119": 4, - "20122": 4, - "20125": 4, - "20128": 70, - "20131": 70, - "20134": 70, - "20137": 70, - "20140": 70, - "20143": 4, - "20146": 70, - "20149": 70, - "20152": 70, - "20155": 70, - "20158": 70, - "20161": 70, - "20166": 125, - "20169": 125, - "20172": 125, - "20175": 125, - "20178": 125, - "20181": 125, - "20184": 125, - "20187": 125, - "20190": 125, - "20193": 125, - "20196": 125, - "20199": 4, - "20202": 4, - "20205": 4, - "20208": 4, - "20211": 4, - "20214": 4, - "20217": 4, - "20220": 5, - "20223": 5, - "20226": 5, - "20229": 5, - "20232": 5, - "20235": 5, - "20238": 10000, - "20240": 4, - "20243": 4, - "20246": 4, - "20251": 4, - "20254": 4, - "20257": 4, - "20260": 4, - "20263": 4, - "20266": 4, - "20269": 4, - "20272": 125, - "20275": 40, - "20376": 8, - "20379": 8, - "20382": 8, - "20385": 8, - "20433": 4, - "20436": 4, - "20439": 4, - "20442": 4, - "20517": 125, - "20520": 125, - "20590": 5, - "20595": 125, - "20716": 15, - "20718": 11000, - "20724": 8, - "20727": 70, - "20730": 8, - "20733": 8, - "20736": 8, - "20739": 8, - "20749": 11000, - "20756": 125, - "20849": 11000, - "20997": 8, - "21000": 8, - "21003": 8, - "21006": 8, - "21009": 70, - "21012": 8, - "21015": 8, - "21018": 8, - "21021": 8, - "21024": 8, - "21028": 5, - "21034": 5, - "21043": 8, - "21047": 5, - "21049": 5, - "21079": 5, - "21081": 10000, - "21084": 10000, - "21087": 10000, - "21090": 10000, - "21093": 10000, - "21096": 10000, - "21099": 10000, - "21102": 10000, - "21105": 10000, - "21108": 10000, - "21111": 10000, - "21114": 10000, - "21117": 10000, - "21120": 10000, - "21123": 10000, - "21129": 10000, - "21140": 10000, - "21143": 10000, - "21146": 10000, - "21157": 10000, - "21160": 10000, - "21163": 10000, - "21166": 10000, - "21177": 10000, - "21180": 10000, - "21183": 10000, - "21202": 50, - "21257": 500, - "21270": 8, - "21279": 5, - "21298": 70, - "21301": 70, - "21304": 70, - "21316": 11000, - "21318": 11000, - "21320": 7000, - "21322": 7000, - "21324": 7000, - "21326": 11000, - "21332": 11000, - "21334": 11000, - "21336": 11000, - "21338": 11000, - "21347": 13000, - "21350": 10000, - "21352": 10000, - "21477": 200, - "21480": 200, - "21483": 600, - "21486": 200, - "21488": 200, - "21490": 600, - "21504": 11000, - "21512": 250, - "21515": 250, - "21518": 250, - "21521": 250, - "21543": 13000, - "21545": 13000, - "21555": 30000, - "21622": 13000, - "21634": 8, - "21637": 5, - "21643": 70, - "21646": 70, - "21649": 125, - "21652": 100, - "21684": 13000, - "21690": 10000, - "21730": 5, - "21733": 8, - "21736": 8, - "21739": 70, - "21742": 8, - "21745": 4, - "21754": 11000, - "21802": 10000, - "21804": 11000, - "21807": 18000, - "21810": 18000, - "21813": 18000, - "21817": 10000, - "21820": 30000, - "21838": 125, - "21880": 10000, - "21882": 8, - "21885": 8, - "21892": 70, - "21895": 70, - "21902": 70, - "21905": 11000, - "21918": 10000, - "21921": 10000, - "21924": 11000, - "21926": 11000, - "21928": 11000, - "21930": 13000, - "21932": 11000, - "21934": 11000, - "21936": 11000, - "21938": 11000, - "21940": 11000, - "21942": 11000, - "21944": 11000, - "21946": 11000, - "21948": 11000, - "21950": 11000, - "21952": 10000, - "21955": 11000, - "21957": 11000, - "21959": 11000, - "21961": 11000, - "21963": 11000, - "21965": 11000, - "21967": 11000, - "21969": 11000, - "21971": 11000, - "21973": 11000, - "21975": 11000, - "21978": 2000, - "21981": 2000, - "21984": 2000, - "21987": 2000, - "21994": 2000, - "21997": 2000, - "22003": 8, - "22006": 5, - "22097": 50, - "22100": 50, - "22103": 50, - "22106": 4, - "22111": 8, - "22118": 11000, - "22121": 40, - "22124": 7500, - "22192": 250, - "22195": 250, - "22198": 250, - "22201": 250, - "22204": 250, - "22209": 2000, - "22212": 2000, - "22215": 2000, - "22218": 2000, - "22221": 2000, - "22224": 2000, - "22231": 4, - "22236": 4, - "22239": 4, - "22246": 4, - "22251": 125, - "22254": 125, - "22257": 125, - "22260": 125, - "22263": 125, - "22266": 125, - "22269": 125, - "22272": 125, - "22275": 125, - "22278": 125, - "22281": 125, - "22284": 125, - "22290": 8, - "22294": 8, - "22296": 8, - "22299": 18000, - "22302": 18000, - "22305": 18000, - "22324": 8, - "22326": 8, - "22327": 8, - "22328": 8, - "22368": 8, - "22430": 2000, - "22438": 5, - "22443": 10000, - "22446": 13000, - "22449": 2000, - "22452": 2000, - "22455": 2000, - "22458": 2000, - "22461": 2000, - "22464": 2000, - "22467": 2000, - "22470": 2000, - "22477": 8, - "22481": 8, - "22486": 8, - "22542": 8, - "22547": 8, - "22552": 8, - "22557": 8, - "22593": 10000, - "22595": 10000, - "22597": 10000, - "22599": 10000, - "22601": 10000, - "22603": 10000, - "22610": 10, - "22613": 10, - "22622": 10, - "22634": 100, - "22636": 100, - "22647": 10, - "23499": 11000, - "23517": 100, - "23522": 70, - "23525": 4, - "23528": 70, - "22856": 200, - "22859": 200, - "22866": 200, - "22869": 200, - "22871": 200, - "22877": 200, - "22879": 200, - "22935": 12000, - "23685": 2000, - "23688": 2000, - "23691": 2000, - "23694": 2000, - "23697": 2000, - "23700": 2000, - "23703": 2000, - "23706": 2000, - "23709": 2000, - "23712": 2000, - "23715": 2000, - "23718": 2000, - "23721": 2000, - "23724": 2000, - "23727": 2000, - "23730": 2000, - "23733": 2000, - "23736": 2000, - "23739": 2000, - "23742": 2000, - "23745": 2000, - "23748": 2000, - "23751": 2000, - "23754": 2000 -} From b322f2ef6c0b0ba89ed75412dbe46e9c3ec55735 Mon Sep 17 00:00:00 2001 From: Henry Darnell Date: Mon, 24 Feb 2020 18:42:48 -0500 Subject: [PATCH 16/16] emoji: add pensive emoji --- .../net/runelite/client/plugins/emojis/Emoji.java | 1 + .../runelite/client/plugins/emojis/pensive.png | Bin 0 -> 227 bytes 2 files changed, 1 insertion(+) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/emojis/pensive.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java index 16e27b1519..fde8c4bb84 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java @@ -86,6 +86,7 @@ enum Emoji WAVE("(^_^)/"), HEART_EYES("(*.*)"), FACEPALM("M-)"), + PENSIVE("V_V"), ; private static final Map emojiMap; diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/pensive.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/pensive.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a01433be6b55df5d3d268916e127c0d583c837 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uGBwbBK{6JKIPlzj!{(r_7h&~>0d$h@}HG%)b ze%A?EqB9C5U+#2T-==zWror}J%~NxYHngeUTxHdnBDAhmFVdQ&MBb@0Nj>XmH+?% literal 0 HcmV?d00001