From a2b83e1c90d5e4daf3076ac2c03b652d52544818 Mon Sep 17 00:00:00 2001 From: ltvill <40988464+ltvill@users.noreply.github.com> Date: Wed, 1 Aug 2018 22:19:57 +0300 Subject: [PATCH 01/10] Change default examine chat color to green For better visibility --- .../main/java/net/runelite/client/config/ChatColorConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java b/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java index 0bcf67341c..c9a3e40d3d 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java @@ -451,7 +451,7 @@ public interface ChatColorConfig extends Config ) default Color transparentExamineHighlight() { - return Color.decode("#0000FF"); + return Color.GREEN; } @ConfigItem( From 973e624e4238a3b1d5751eb11fea4791aef60227 Mon Sep 17 00:00:00 2001 From: Sander de Groot Date: Fri, 14 Jun 2019 22:36:41 -0400 Subject: [PATCH 02/10] Adjust alignment of icons in fixed 2005 interface style and fix inventory icon --- .../plugins/interfacestyles/WidgetOffset.java | 24 +++++++++--------- .../plugins/interfacestyles/2005/900.png | Bin 924 -> 8357 bytes 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java index fe61af1af7..9edf17165e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/WidgetOffset.java @@ -118,33 +118,33 @@ enum WidgetOffset FIXED_2005_INTERFACE_CONTAINER(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INTERFACE_CONTAINER, 7, null, null, null), FIXED_2005_BANK_CONTAINER(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_BANK_CONTAINER, 7, null, null, null), FIXED_2005_COMBAT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_TAB, 19, 2, null, null), - FIXED_2005_COMBAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_ICON, 26, null, null, null), + FIXED_2005_COMBAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_ICON, 28, 1, null, null), FIXED_2005_STATS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_TAB, 55, null, 30, null), - FIXED_2005_STATS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_ICON, 53, null, null, null), + FIXED_2005_STATS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_ICON, 51, null, null, null), FIXED_2005_QUESTS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_TAB, 82, 1, 30, null), - FIXED_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_ICON, 81, null, null, null), + FIXED_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_ICON, 80, null, null, null), FIXED_2005_INVENTORY_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB, null, null, 45, null), - FIXED_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_ICON, 115, null, null, null), + FIXED_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_ICON, 113, 1, null, null), FIXED_2005_EQUIPMENT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_TAB, 153, 1, 30, null), - FIXED_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_ICON, 152, 4, null, null), + FIXED_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_ICON, 151, 4, null, null), FIXED_2005_PRAYER_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_TAB, 180, null, 32, null), - FIXED_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 180, null, null, null), + FIXED_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 178, null, null, null), FIXED_2005_MAGIC_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_TAB, 209, 1, 30, null), - FIXED_2005_MAGIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 206, 3, null, null), + FIXED_2005_MAGIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 206, 2, null, null), FIXED_2005_CLAN_CHAT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_CLAN_CHAT_TAB, 15, null, null, null), FIXED_2005_CLAN_CHAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_CLAN_CHAT_ICON, 22, 0, null, null), FIXED_2005_FRIENDS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_TAB, 51, null, 30, null), - FIXED_2005_FRIENDS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_ICON, 50, null, null, null), + FIXED_2005_FRIENDS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_ICON, 49, -1, null, null), FIXED_2005_IGNORES_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_IGNORES_TAB, 79, null, 30, null), FIXED_2005_IGNORES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_IGNORES_ICON, 78, null, null, null), FIXED_2005_LOGOUT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_TAB, 107, 1, 45, null), - FIXED_2005_LOGOUT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_ICON, 114, 1, null, null), + FIXED_2005_LOGOUT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_ICON, 112, null, null, null), FIXED_2005_OPTIONS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_TAB, 150, null, 30, null), - FIXED_2005_OPTIONS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_ICON, 149, null, null, null), + FIXED_2005_OPTIONS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_ICON, 148, -1, null, null), FIXED_2005_EMOTES_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_TAB, 178, null, 30, null), - FIXED_2005_EMOTES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_ICON, 179, null, null, null), + FIXED_2005_EMOTES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_ICON, 178, 1, null, null), FIXED_2005_MUSIC_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_TAB, 206, null, 30, null), - FIXED_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 202, 5, null, null); + FIXED_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 202, 2, null, null); private Skin skin; private WidgetInfo widgetInfo; diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/900.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/2005/900.png index 407e476c549bcba6b12b4add6e3e356e33881326..80c3b83fc8bcc414459bcfe200b709d6ff07a72c 100644 GIT binary patch literal 8357 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 delta 902 zcmV;119|+VL7WGWBYyx1a7bBm000XU000XU0RWnu7ytkRPDw;TR9J=WmQQOFQ5400 z$rzA8(-5#^$Rh4a2)gQ`D_4S0-1!Mys7w6>f-cT;qR7<9}}id2-jwM!vGv)(0>- zXz}_my)wri5g2#KhCLW`JVw4^eW2G*0(+m3c=tW!ICAH@@v8|}+R(eHlM1Bj$w3Q% z)9iBTw{AaWIEUlN9s8#Qwr-P2QoqpzV1J$h5adAzolE>iv-rK+Ppue(j>ov8GM5TY z0^<&u`LF~wD}M|ZS`i>`gRb}_fQy+{WHKWsnzGUc94gd$V6#saCoolQhF-$32lv-0 z`dv+Snq6{qu80#5e*}>#{)Y>Q6PCQ-RAB42R^V&g=H9J@aG}>fp1`+Lud-XK;y0SG z20^5X?*XbHv9YREJU+DB({xpC8cmoB2{VC-YJ0>dW`8VmPb~rIE5Oi8h!c<#Ai)Jf zqK?$YYO6R6`}33_QkK7*1WXKj%WEdVD!ToY`|EIL&13ha{(doQ6&?Uxj0vX)q#{9_ z*vW%P;jcF7_EWk5lrq0~vqj@@kEd_Fe6McBoi*8G$95737x3k*!FZ)qD^AQH8ge2o zX3aeL1AiVq+RJ^TifT>OrlFn7YJs?49+)ayFHt6l6#Mg($w7;&FL9L zYUvmj1UCDnIrgS{&%IlTMI>C#ik79ereSiFx2-LyspJ~ED$IJh8h1&6Y_y{g$ zt$ZHnwb-r$a2!K(aDX;VoY+J}%8{=a`HEN1wfttK;u9enE|$lzlK^13-|WATtImS$ zoieFeh%E|sS@qTuxGt#bfVoQYDryyw0Chx6h{WR#&iB5n@LQW*WPUf{ cHU2sL0B!!8K&}`MeE Date: Mon, 24 Jun 2019 16:14:25 -0400 Subject: [PATCH 03/10] Add Barbarian Assault quick-start option to menu entry swapper --- .../plugins/menuentryswapper/MenuEntrySwapperPlugin.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 1498df1506..5ab6cb6aca 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -540,6 +540,10 @@ public class MenuEntrySwapperPlugin extends Plugin { swap("quick-open", option, target, true); } + else if (config.swapQuick() && option.equals("climb-down")) + { + swap("quick-start", option, target, true); + } else if (config.swapAdmire() && option.equals("admire")) { swap("teleport", option, target, true); From b58b683f49fac62763cedc6fae4491c787289926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Evaldas=20Lavrinovi=C4=8Dius?= Date: Wed, 26 Jun 2019 11:02:01 +0300 Subject: [PATCH 04/10] Fix WC world map icons around Hosidius area (#9205) Fixes #9204 --- .../client/plugins/worldmap/RareTreeLocation.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java index d32dee4c32..843d6eb645 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RareTreeLocation.java @@ -67,6 +67,7 @@ enum RareTreeLocation new WorldPoint(1640, 3496, 0), new WorldPoint(1613, 3494, 0), new WorldPoint(1560, 3636, 0), + new WorldPoint(1646, 3590, 0), // Miscellania new WorldPoint(2550, 3869, 0), @@ -109,9 +110,8 @@ enum RareTreeLocation new WorldPoint(1353, 3731, 0), new WorldPoint(1529, 3452, 0), new WorldPoint(1591, 3421, 0), - new WorldPoint(1647, 3510, 0), - new WorldPoint(1632, 3509, 0), - new WorldPoint(1623, 3512, 0), + new WorldPoint(1647, 3508, 0), + new WorldPoint(1621, 3512, 0), new WorldPoint(1593, 3491, 0), new WorldPoint(1583, 3499, 0), new WorldPoint(1696, 3554, 0), @@ -119,6 +119,9 @@ enum RareTreeLocation new WorldPoint(1625, 3669, 0), new WorldPoint(1642, 3683, 0), new WorldPoint(1642, 3663, 0), + new WorldPoint(1642, 3533, 0), + new WorldPoint(1671, 3657, 0), + new WorldPoint(1680, 3657, 0), // Tirannwn new WorldPoint(2217, 3141, 0), @@ -187,8 +190,10 @@ enum RareTreeLocation new WorldPoint(1389, 3821, 0), new WorldPoint(1610, 3443, 0), new WorldPoint(1578, 3488, 0), - new WorldPoint(1772, 3510, 0), new WorldPoint(1685, 3740, 0), + new WorldPoint(1681, 3689, 0), + new WorldPoint(1751, 3564, 0), + new WorldPoint(1796, 3600, 0), // Misthalin new WorldPoint(3355, 3312, 0), From 473d447ec79dd8350643a574dfb173f97b866cb2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 26 Jun 2019 16:05:04 -0400 Subject: [PATCH 05/10] Added Larran's chest to loot tracker (#9209) Closes #9177 --- .../client/plugins/loottracker/LootTrackerPlugin.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index 5429ec5941..00f15a1616 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -105,9 +105,12 @@ public class LootTrackerPlugin extends Plugin // Chest loot handling private static final String CHEST_LOOTED_MESSAGE = "You find some treasure in the chest!"; + private static final Pattern LARRAN_LOOTED_PATTERN = Pattern.compile("You have opened Larran's (big|small) chest .*"); private static final Map CHEST_EVENT_TYPES = ImmutableMap.of( 5179, "Brimstone Chest", - 11573, "Crystal Chest" + 11573, "Crystal Chest", + 12093, "Larran's big chest", + 13113, "Larran's small chest" ); @Inject @@ -384,7 +387,7 @@ public class LootTrackerPlugin extends Plugin final String message = event.getMessage(); - if (message.equals(CHEST_LOOTED_MESSAGE)) + if (message.equals(CHEST_LOOTED_MESSAGE) || LARRAN_LOOTED_PATTERN.matcher(message).matches()) { final int regionID = client.getLocalPlayer().getWorldLocation().getRegionID(); if (!CHEST_EVENT_TYPES.containsKey(regionID)) From 8d4fff459c3e795d04685ccef11e105a50c0ae1e Mon Sep 17 00:00:00 2001 From: Lotto Date: Wed, 5 Jun 2019 02:49:46 +0200 Subject: [PATCH 06/10] interface styles: add RuneScape cross sprites option --- .../main/java/net/runelite/api/Client.java | 5 ++ .../InterfaceStylesConfig.java | 10 +++ .../InterfaceStylesPlugin.java | 78 ++++++++++++++++++ .../interfacestyles/rs3/cross_sprites/0.png | Bin 0 -> 15717 bytes .../interfacestyles/rs3/cross_sprites/1.png | Bin 0 -> 15729 bytes .../interfacestyles/rs3/cross_sprites/2.png | Bin 0 -> 15819 bytes .../interfacestyles/rs3/cross_sprites/3.png | Bin 0 -> 15896 bytes .../interfacestyles/rs3/cross_sprites/4.png | Bin 0 -> 15689 bytes .../interfacestyles/rs3/cross_sprites/5.png | Bin 0 -> 15691 bytes .../interfacestyles/rs3/cross_sprites/6.png | Bin 0 -> 15701 bytes .../interfacestyles/rs3/cross_sprites/7.png | Bin 0 -> 15684 bytes .../java/net/runelite/rs/api/RSClient.java | 4 + 12 files changed, 97 insertions(+) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/5.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/6.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 14f3ff5cb8..de8123b359 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -1632,6 +1632,11 @@ public interface Client extends GameEngine */ NodeCache getItemCompositionCache(); + /** + * Returns the array of cross sprites that appear and animate when left-clicking + */ + SpritePixels[] getCrossSprites(); + EnumComposition getEnum(int id); void draw2010Menu(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java index 540186558c..3f64778e52 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesConfig.java @@ -62,4 +62,14 @@ public interface InterfaceStylesConfig extends Config { return false; } + + @ConfigItem( + keyName = "rsCrossSprites", + name = "RuneScape cross sprites", + description = "Replaces left-click cross sprites with the ones in RuneScape" + ) + default boolean rsCrossSprites() + { + return false; + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java index cdadf60320..c635eb9bd5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java @@ -31,11 +31,13 @@ import java.awt.image.BufferedImage; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.api.GameState; import net.runelite.api.HealthBar; import net.runelite.api.SpriteID; import net.runelite.api.SpritePixels; import net.runelite.api.events.BeforeMenuRender; import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.PostHealthBar; import net.runelite.api.events.WidgetPositioned; import net.runelite.api.widgets.Widget; @@ -69,6 +71,8 @@ public class InterfaceStylesPlugin extends Plugin @Inject private SpriteManager spriteManager; + private SpritePixels[] defaultCrossSprites; + @Provides InterfaceStylesConfig provideConfig(ConfigManager configManager) { @@ -89,6 +93,7 @@ public class InterfaceStylesPlugin extends Plugin restoreWidgetDimensions(); removeGameframe(); restoreHealthBars(); + restoreCrossSprites(); }); } @@ -126,6 +131,22 @@ public class InterfaceStylesPlugin extends Plugin } } + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) + { + if (gameStateChanged.getGameState() != GameState.LOGIN_SCREEN) + { + return; + } + + /* + * The cross sprites aren't loaded yet when the initial config change event is received. + * So run the overriding for cross sprites when we reach the login screen, + * at which point the cross sprites will have been loaded. + */ + overrideCrossSprites(); + } + private void updateAllOverrides() { removeGameframe(); @@ -134,6 +155,7 @@ public class InterfaceStylesPlugin extends Plugin restoreWidgetDimensions(); adjustWidgetDimensions(); overrideHealthBars(); + overrideCrossSprites(); } @Subscribe @@ -283,6 +305,62 @@ public class InterfaceStylesPlugin extends Plugin clientThread.invokeLater(client::resetHealthBarCaches); } + private void overrideCrossSprites() + { + if (config.rsCrossSprites()) + { + // If we've already replaced them, + // we don't need to replace them again + if (defaultCrossSprites != null) + { + return; + } + + SpritePixels[] crossSprites = client.getCrossSprites(); + + if (crossSprites == null) + { + return; + } + + defaultCrossSprites = new SpritePixels[crossSprites.length]; + System.arraycopy(crossSprites, 0, defaultCrossSprites, 0, defaultCrossSprites.length); + + for (int i = 0; i < crossSprites.length; i++) + { + SpritePixels newSprite = getFileSpritePixels("rs3/cross_sprites/" + i + ".png"); + + if (newSprite == null) + { + continue; + } + + crossSprites[i] = newSprite; + } + } + else + { + restoreCrossSprites(); + } + } + + private void restoreCrossSprites() + { + if (defaultCrossSprites == null) + { + return; + } + + SpritePixels[] crossSprites = client.getCrossSprites(); + + if (crossSprites != null && defaultCrossSprites.length == crossSprites.length) + { + System.arraycopy(defaultCrossSprites, 0, crossSprites, 0, defaultCrossSprites.length); + } + + defaultCrossSprites = null; + } + private void restoreWidgetDimensions() { for (WidgetOffset widgetOffset : WidgetOffset.values()) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/0.png new file mode 100644 index 0000000000000000000000000000000000000000..b817c474c04ce529e239bb864c3c823625600dca GIT binary patch literal 15717 zcmeI3Ply{;7{Es>i`~-VpF&wC%)DfWCNtBS zNt0a=sy%2yPz1q)BB%(Wh!-z<&|)ii(TfN1B!UOMco0FotZ!zL%;atISlWUpFOWaq z``-6`@B4l4eKT{&_0@Av9-Mz@o?)1SE6cSt^!-5mzJCsVKJxnxKwta)<&BVG4&993 z_q=xU&{2jlpLH7R(R%%?VR_vmu)QWM4!S;?jdZ65KCmvqh;72Q<5mj4efD{Qb?i#v zf>Iai{vzCTmbU|Ve*0X*+P-AzcHvZY-W(XnK^I1V9dtWxXbdWa#IJ#V$HRPqO{PSb zDusnOAiG{)Wf#2wvPx0qEU{E(HN7Y*dRdYmXC*;Yc|qqznG-}q&<#Okhp$3)9{n-{ zyJf7^&J4pLsZ!XCBH!Toe!pMrmx^A{=0#oCc|qbOi9<8EaLbLrfOErRsgseP8Vs$# z@gv7`+1M{=dcCMpD8zxruVG$Ye;mjShwKnVegJ%4EDHQIBikC=_`RT$EX}rf*nwT> zMj^5jr`q|OUgU+F-i(lA^~}JiCiVI__SE%uyHi7l(b5%!V2E_8W!TvAA-@JguNPQw z=?Y5a*tF~;rgx}Xht-)){IubzRyEJ+#oKzpwP1*f5$1}7N|hYk)1W;$I#P6;YT7nz&vI-d3u?7Q z0Cl;og|*F zGv{nqpr--{wR6zP&53idQ7%A$s-|for>kYaK`3jSu9PKC)Krv+CIC?_k8+vfW>=_X zC$9SzR))AX=i%ka(X8%CY;7&6QkL( za5HCjIroMj^`A4J9izVqT~gObT_v+-I|;p3)CU1vXruGAmxh*loixMUPd_DyQF1an z&K(pY1Xu2?3?{5KHWLxDFL6$fmwVIp-T6(DjEd_}3sLZ!f2Gn>3LzE0@+<5=J zGQ_~s=+-81+t9A^qs&GF|E0?9tskZd-(KagOXmNea_LE&?1`g3ySs;)@!gVv`Y-AQ zAnALe$?qD=_Dni|J?^8OUNT=-1@z*@_;YBQSL3D|WYfGFH_a@ccAcmy4WnVhIji`V zF1_D4kDfkYRaKOdV)FPfZn5eNU}wGNp!NSS>3yodz$(yFE^E&Yu64GUk1#l_nw}+ zIC$=R|BDmfKJm%=krQ*PhhIFrbnMpt>p#7F_Hyg(`}WN-_B$WEaNzSdkDzGG%F?;o JN2f17{|_DZ1xWw^ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/1.png new file mode 100644 index 0000000000000000000000000000000000000000..a6add2616dc8bf19a883048ea72f95258e1beedc GIT binary patch literal 15729 zcmeI3O^6&t6o6YJYqBIEO2FU`HnYSZVo(3iOgA%=Y<4#8f)kg`YIeOOHPzL#ZDzXL z?w+051xYj@21F#FD4r#^oIC_Pgh+Dprl5Eb!IM$&;6*R4)zkCSQ#(^Ei6BZf%yhqc z_1>%cUe)XFLtj}s{o;Y?$EP`tJFvJ=S;pr>@o(=G{(t)SZGcbv{DrlU;||`Ae-C_k z?BEj|SA5f1S&de!FPYG5W`X6^P`1W*8={PxAo4DVQ_%vrrE zRsA`%?ksEt=*-sX6}WW)8dm0bdAis!v4bXx0N-gg+|cZlGF`tWzK)y44Bzb%T_|N{ ztatoB(CDz~_yutQ!SIdx2LZIVVbnC~JZwo04HlGT%EgitTng+g7t)P#0yxFhofa6-B^3gmBZ1Ku2)HnZ!xoPX&cAaQw*e zTt4;-YF;ZUWioM~!O@#n(;ozK!yY?KQS1O;l(UjJ&d7oT8^0Aaxn~6-HW_%-J1|{pq>~Q=cHO4#2!1|W^-)lFq+@M2zp4zT81l|J`$Hv=(Pff<~Q(E zX2#7va_nJpMm)uuiDO3{XM$O*NzA%SA<0k?&()j@5Qw~B#q%2FWR)%T5%P0$@v6%6 z&z*H#%WH?v7e&%!nD3!CQ~?nxV@pGja)P9-D5@zJOkFxADW)W)oFqL7A63tC?9EXh z`U+mtvS#Y}w2xFz(g)r@7Kp&Eyrlc4{8-Smy`TxAveN{0B>HZ>C=MG_JqN4Gobwu9 zfQN<3YEc~5Jl3k>!B)JiXI+RwoQyD)B%G@5#ytt@qpf{K!zm|a!}6eGnZuyamH{#} zRVd_TU65sD2nMpC0CN!P(8>cvs};p~^I{jnam9YSt)mgs)1i$wUIx{wx#)%wz|&c* zlyO7W!6Vaw4WWjRP%GGZ!N_TfP{qsfo zYBGJ|$v9Kab_9AkaBw*XjZ~j_E*74PhUA(8bE=@p$QBG$s|f{320}r#Gzm%uuywt= z&hcEvxY-eE!HM&}Nu(jp%^CE@XzMWV-NNgGAVhIlDP{U~Wl*Vc*TGTjmM0UyxMY`M zyz7xw6h~Tz!y?U`o$1^ig2aEyd~%HTI&x`MBXQO3HQ7n%*-;w=Xts{`({2h{;&s%F zbU%KVU`E}Y*>LV75h2*Pzche?1#C^O394iPA#Z8A0JMT4KsBGYRof~k7VM|_9@2md zuVl)qsSb+wzn6v>coH411GkQ>ve=(lzu~`>x!u*nWWx8BIpUW2Kge9N6Gv-ezs~Ng zp~d)VDXzb`7JzQulZ)bxw&9vd`me@yw9)GJH*yj_L^=NNnWojG=^EWMttL%}man)@ zR91S?h~|`4{79EPZ=AtzAE=zubrs)p$Y#=F$?2fRYQ@3N8)1AWkaIm7QZd$WZIWS1 z(KAd^m3mL;-o}zv{1$>=fW*NY(2hIY;QsSZUJPgSPkJSMu^Ld$RwKTdbp=G!TAas%8qVplN3>N`} zE;3wnK7^LxB7o3EhKtUJ&@x;E5W2{4(fJTshKm3~7a1-(A41D;5kTl7!$s#qXc;a7 z2wh~j=zIt*!$kn0iwqZ?520na2q1Kk;iB^)vIv+yIa1lW0BEv=JLueT;0tj8C;+h_QQ;b~vA#odjF+6YH zJ&3u~UJ74_ZwzD_eI`Zgu z`)^&Fy7pkS$6vej^_3g@Pqd%<;m|Xu-hXT9^GCk?M!%F1mkz&scz)*2zALXUe)8*A d6=!2=KX>aUd={NMdICr07Uxe_uAe;r_TPdo2FU;b literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/2.png new file mode 100644 index 0000000000000000000000000000000000000000..015b85e5a0ea4be8083f5c65d9ed379a045694bb GIT binary patch literal 15819 zcmeI3&5zqe6u`}g+Oo7&)k;tmP_0x*t%_qiwv*UOvfABj*_B9HZ9}`|0G-&AthI@4 zY-f|*OM!|?tvFPb_!5_15aQAUCn^q5sqhCNAqpoXxImFW;sP94#&!}rlVn(E4+u@9 ze7t${-kbTo=Qs8tmzGXGy=Uss6vHrk78lCP=zCxA-n9dL9{zO;ps$CVg|i;R?7bDd z?|b9;-p3fGaNDe|_$!rXG~I5cfnnERy4!NlY^0m+IzV58K3jtg(<-KZ{`iv=YZ}GW z8KojroH@8^E^NB+)aJ>mzPYBWMryh=Rp@HSK@0kT?Y5ehr*(^|(65Gm2g7`d4X5~P z#nem?kX@-Pv2(TyStXt2bWzH)IW;XRYCa=B#byLC%L^(m%A6o-f~pB3+k2%-Q|MR0 zHR{@O`9v=ql8UKS-*+^g?{qrpj+D0D1~00r$_p7jli|<|&fBnj(B&-eNaUpNrwl#a zH67oyEjI8AYIfT%rcyzm!K=5gmNN)sc|CTBBHslLFQx^4oROgqY@D{+43}o;JZ!=i zw0sZQiDT`YRol0{ReM6nfqG(Kl#@zj5PR%;TdlF7J%4^3A?P6;Yw1-t9LO(2&u+Uq zoL@&< zoZYltv@BSX3jDa?u~ubUZwF;PW9iUC$?y_MLa7Qb+*!~V9_=fdW+`eLhOL{176;Yq zB7mwaarvC6aH0rRPKAcf=~-P@bR!2ca;?Az7cX)Vud7!Zz47s`>k7=|Yc=toyN&`5 zZzf5Kgd(W0N<~|=JRcxZi{%m;NSkQWVjT*o{mC2vvcbtUS>S3AN}MDMl9U5#R#fz` z?1s(bP4`^)qa)YjH?Asb#xM+(yzywA31=gLo^?%hQh;V+POujP?FHm(0@URk2c^8q zLNvh~P3QIyjF?Z3(OHESsUbzK!da7@ zcy`_I02j_Q(51SaUKx2EHpAWj-353TiSWSs-K9Z=*?LxyM9z>=0}%vSA|!bGRq=`|M~BEd)1W8tT8O7l5$ui3NUSEUuYo z{z}kCo9%GEnibHC7lY59X;O`wo+XVor!L$??281jUaZSa4SB4h)k8%h78Tr#2Z(T=!WM=h+Kl_NV@59%w-1+5? z15fA=AKo$h%KTC1gEeOUg={&ZRGY+I^7u{?O^2r$0Y@2?b^r M=TDZe&z^hrFCj}I8~^|S literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/3.png new file mode 100644 index 0000000000000000000000000000000000000000..e62c91b16c78c4fdc4d2c8218852925f6a6b35b4 GIT binary patch literal 15896 zcmeI3Ply{;7{Es=wXSUOP_$amA*Euellec%3`xrFrgaxgUAB>Kq0qj}d&!PXW~MW< zO?DBiRjYy*g+h+$=( z%ZGOFje!_HceBM6j4zGJVOXK+z508H{72%>H8_8&<-3w zay*xh{eqge9u+g0IMCqL+gHmU1aiY3J4{jR0AG}|k~ql-+5;PZJ!p2925k{FQ46_I zi0$NwcK(_ddEuHjCFDRoH89Rer80;;alNh9#L!`MGJjI%+YeyYtidn2l%(|tJWT=4mYApl^L|#z!yk;q>vgJNPeqkZ5 zsvQ6H3CD$AJ3LqrNt0o|hu%;bM5u%iHFZ;g z5Sl_hC+mVNBU3ODv<2I+ZQX`BplG#%82@;&i{ZL@wb2`&?Aor&0GXQlFSxGjNXge~ z^51uz>}8ZwItet&aq(6v){+}W04HIoT*3oc2lG@gH@%LaVA`f3Xqtwv|yT8w>P&;NU|DG*ffpy+FJd&8R76 z&Q=6NRZYRb%NOz*)C7oB4L}v<>In4rGQrJQs6{8P){W8P=~nA;bZ&HXSgqaT!UsW! z;$~RP^t<8Ud`SwhSBBlDY5_YwXi9e6s}L-RBcsD*4J-@E1ZO;*+e0vBK0QWz4Y{;l zm$>TAn(id@>QNg6Xs&^~z;@bj;&s%FbpKbs?Yl@s2+rSK8Vm^m3FQnySCE4154RFi zlk0*}134Q?xw@fh{WPbtNNzE%subYCk%Ny5$&xiomios@BKU)&2ox9`aX zacpc@Gs*nbxQ{m1yYo#$!Y@&dKYONWHEDX1Zkkq;rbEjYTqi0iy=cU6$}0XNn*2*T zj_;XJ$N`}E;3wnK7^LxB7o3EhKtUJ z&@x;E5W2{4(fJTshKm3~7a1-(A41D;5kTl7!$s#qXc;a72wh~j=zIt*!$kn0iwqZ? z520na2q1Kk;iB^)v zIv+yIa1lW0BEv=JLueT;0tj7XxafQcEyG0sp^FR`oe!a9xCkJ0k>R5AA+!t^0fa6x zTy#E!mf<3R&_#xe&WF%4Tm%rhNX0cXd=eVD`0?j9e$M&!jo+`~XQX+1aizj>n+G`V z!mAv2XA6J-#Bu8q$NhYU|#Z|J^S8Q5AAs%bMyUoetE5YZsm!OzuUE!`|QS>w?4SO?`s^2TRL*A{L%cGi+=*y CQ#i%| literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/4.png new file mode 100644 index 0000000000000000000000000000000000000000..695cc03088eeab56a7bee600787fed85b0640821 GIT binary patch literal 15689 zcmeI3&5zqe6u{kXSzy&xy;0f&Zc0T_>)4L-Wh+U$-E6xnk+R(`>Xr)~+mpoI#5T6K z$*wrGaN>#pRpr1R0OEjLlS16sy*KAe|iw6v8FXuQfMZ{EE3 zW`1wxjeYRjD;F;um^(7ZaomCBrRpmAJ`{eQnkE0A`+WzIuczImt3Jma{3iVDdGFN0 zqa0U4*4lcoUVBM1oOT+Sj*ipawo7^w-I=b7j13&{I&N5YIrZz8U!{1$Mer!SOJkOXmecR*HNV1kywBx9k9Q1=~L!JL&tWV&CvAH?SO= z5B(zD*$m35R2XP*_2$)f2Z3zA$Bs}GyT}#gv?NY4GL3o*3E>7H<#)J){#Y{k1I@i>ugoHa!C`-XK#s zK56!WRUam2#8ar5I(FQ(rkI7A*eqHKafV7{uG)f!QQ&xMj?=2dt8Ar@kY88`S5<*O zdBw6#r{lj^5~0a3-$QS>iUM3AmZ~7-1u3@{u17^v3a6xuCP@h=aZli*=9pG}Ys`nD zNd>a3lRgqXp%1cuOcbD9c}ez7_%RKw?s#n!RID~?V9~W3C2`o8=s8$b+Je(^JTfd? zQA*;Z=80BS$Jh*)^}KChpCrRiB#ERd+PLRXW3;ueXjv7Kl(cD?nyIT;sTXuXmsLej za5gWXtZoX$dOa%@idjR!g_0Oc0y`VIf3%fg|}_-J;i16gn=vhTu#ZAMA!^1R;(^=tye8_PvM6rft>HzK*dDE ztJ4eHKEbd1HVu3>Tdb&@x;A2wh~j=zM^d;Q~PDBEv=J1GEem z074fTE;=8eWw-zky2xR5A0a}I& z0HKQv7o88#GF$)%U1YfEe1MkW0zl{@!$s!Iv=2AxBw8k$Z*m504>7> zfY3#Ti_QmV87=^XE;3wnK0wQG0U&gd;iB^aT80Y%p^H>pbHn$Bu}xkU?vS^FKmS%1 z$Q#AHv9wy_xa|`hck?Zd`*VkU|IBfl636{=jpMZ29QTa#&TIG2lfL?Lb$+e;z5d6} z&Y77Lw{KmaUBB+i1$n_Q$(l>_01; z_hyzqZoPqSes`#K=fShTeW=fze6aWat)(BD&%bc&();f|dAhK7mOJ{{k?q4zTzHj4 P zJ56@g11&w!QxW3pz#o8wgb)%Z4zv;+IB@F)BqYQI0S6>FfrQG~&WAHeMoU`>fyPok z-n@D5&HUcX8~fnvtEZovpF1?iFwFeQa%~O$J{EuWJdD1d{QV9e>tK<^D8u}kM^Eo!@5?!d| z7UF>HMtzlC^a98#`66eEQkgBOc~Mcz1^F0T5X2%csJtk1f~X0qCWvhR%2nskKRvK) zZLM~)9}Y>C+-4N{8qasT-F#QddqI;IRaNDM0$(U_s0SBrxe@4bZg@C#GVoJ_p&2-S z%%P3n30ld}ER%;V*oJNt zB0F)aoxkZtUbyMa2su>G42*J8uMcBS9dElmHFOv)T|x-@NT*tcjV&MYYcTXWfeDu` zp{X36Hv7o2N68uU6l-RV9rm0VX0awUOO`^KAsx+CTMQtGyrAKEt!lc;RtE^##l?74 zmDnR^9M|%?;WIjqn~d^3@&;=lf>mUxazc?4lt#QBB~6x(3I$CNGEUN-n2)+=Iri3s z4@nbBnlR=g(-ZfB_KyW3up=+oz8OE3so7r822s^%gC^vCx2f}^#!S!Qs?rv{mKUI5 z!K$S5)0(GR)jYEkFY5)@gds{sm`M^!RkCqUfaZAXK+$rlC@Fc%u{6t2p=6f~&Jb0J zlb~GWfNWS?*|ue&RF+K%mUKSeuE=OKlGszyIvyiC0n!NL#MkTEiW^1%O<<*#jK@La zfj|_BWm`eZKu|at$bd7-io_|B1Xa<5iXs)0)i7>88d=}&3Em&ovjOJF7 zxe}TtrwTyeM9EOgielTQZ46vz%qLvG5ICr0gI1=`faX65F~!Y9sAVV4?G^?;&c-^t zINmzSZBkr)5QH!;9hKamb_}aA>N>piqy%ZejLUM>jCVG)bbhRLG%VcAnM~l$5TyPy z=CfmTH=#?a45_Q6*K8-DXGdKSz=bB-Gdn3-sn>Bc-2L=@ffyybujSlBB0_NK-qN5N zA}H9F$O&rMY@-O;82}`rk`K3_Oi)ZUVOnttvm5 z*`VRSl)0T%z;wcQmpSZM{2yd4-HGEhaZt)9Yp5RI5oxIYqFMlwx+m)VMB8Z1r2RMI zI@;auC#s@7n+z0d&RE5_ZRtJ5I(ou@)gn4E z6`jYMaf?-_2U{C82i;SI@kt<}Q#P@|6;ln*&N9p>`i5z$GS33ZF_yNXCk^zF!w;Ww zCQi8F`Ex)2jAnE{y<)y-5DW-eq`1g@FfGM}0U?VN7nu*HrMNI4WRc<`^TD(f7Y2kZ zQe0#{n3m$gfRIIsi_8bpQd}4ivPf}}`CwX#3j;zHDK0V}OiOWLK*%D+MdpKPDJ~2M zS){ngd@wD=g#jUp6c?Efrlq(rAY_r^BJ;tt6c+}BEK*!#KA4u`!hn!Pii^w#(^6a* z5VA;dk@;X+iVFim7AY<=A52SeVL-?t#YN_WX(=uY2w9}K$b2v@#f1SOixd}`52mHK zFd$@+;v)0Gv=kQxge($q&5hn0hAw(pxQpHj{tgt2=#665Twbd)%=Xg^^Xh91^T!?Z z`xC=-1cv$fJi}=3G0fxMo3DI%67{uKY733tx5me}zmGqE-ne#f&-wkIKJw0?b9a99 zKe;9DS`=;@dwvjif2i%hKL6-b7Y|-tpI>t7Q~P1_CL_H3Y(vt)4HS=ASvp<&=*0P}e*pO!hE;wquxk&wCe-w9E?~Kt~qWw_s5stIC9rQ5lqmFZH~Kn~h40&KV4azmqA&Lw^gbR9SIIX3AMoh#>N z z*N*qXA*q~eMv-sue5cdNcci=*tns3*>%36l3k44K;KEHe0$t7x52sH0erhnZ0>_UW z&t+r3!1UImaxNDK8XUcOwf#XLH|()P6!|Xjc`+~WAn#lseCLpKVM zojBIcZ+ejzHoXZU2kMD|QBLahLF}>PZMVmU4x_mZgrJ9XtYx^e=|g@QhTeK$!MP1I zmBZs^A32R-az;GGnu%kFU1x$>tVzw1rI2Q*gyw2g0|+87Sn<48C0%7peS~ba8n3D% z`@|{7wY^UGWQoU3hWQ?PgEbJr3bNEWLFEKxC0>uRA*e@$f*}YQCuvX2N8PiX#^yF3 z5^`WDde%p#C+-979~(qqM_#ghGk$E#Xm~*zL=~qE)*$b@YbAcznCUrKRYuioc>x+0 ztVkt(T=Q6~nrE%Y%X-$eV2F|tW|D+bm2BK&U~ROuuV^_Hl$5;f*oJNDP-+xS&J=Zt zlc20}KsIeoYcyn`sL7TDizPnZuE=OOlGszyIvOK80n!NL#MkS_f*VEvO<kf24N$Z-wICGiWHpSM4@cH>-H+aL9Zyx(G*gvTjgvH` zz(GmY(4-}WlSIK%HAw|U*yy{?m~V6aT;QOR4O*E#eVYFy#27c*Ld`pIZZ|RTaW+oE zmquHMxlM|z4}uWJrK6nd*N#CoMqLL-DJek)u;Q{@vErQ#5#W*5;jnNsXG{WjL^<`J zF`pcx(}XUmGNi7OUXz`KUL)#&0M4$VJ+qUdm3kdD!`+YH7l=`^`&!OzBq9VGx0eRV zv@H_=le28S$SJ05a=HpsPEr~o)CAjBbhV%6TTVmKD2V;y`tPM72A)Q@n!sIyc7^ZH ztl#io%G}N>U^?Mj%N%xF{2yd4-HD?$v0uu!*U(b@L}Z})i)sN#>YiBQx3vw|Oxk}n zuA{B>q`$5T=-|cpzh|0NwCIHNo174t=dU_i(s#YN_WX(=uY2w9}K$b2v@#f1SOixd}`52mHKFd$@+ z;v)0Gv=kQxge+2AWImXd;=+KCMT(2e2h&nq7!a~Zagq68T8aw;LKZ15G9OG!abZBn zBE?1KgJ~%)3Vor!L$??281k9Tx33&mg2&I zkVT4%%m>p_To@3tNO6(*U|Na`140%lE;1iXOL1X9$Rfo>=7VV|E({1+q`1g@FfGM} z0U?VN7nu*HrMNI4WRZw#didQibkWDc9rRW3%=LpGp)ZPAYks-TFk6o^%*(GZ%wIRr z`5MEl3k>u7S%xv*XPEoFcV4`59QAbni>g<8fXWlz>=H_qy zXWxpus>0Rpb{9);KW0yzdHCb|t}xNX#?+#s-MhcQ=rjI}OAqK@J$kYF(A-<+UvGZ@ z<|i)m^<8s6-E&}fZtmy#7mi)neC@`<2Os`eJF&56hB@)YzNZgg`|~`C%q+|;);>LU G_QKysfA?ts literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png b/runelite-client/src/main/resources/net/runelite/client/plugins/interfacestyles/rs3/cross_sprites/7.png new file mode 100644 index 0000000000000000000000000000000000000000..c17114ae828d3f89b6b216099a54c12ce1abad53 GIT binary patch literal 15684 zcmeI3O^n+_6o9>gqOxi$Zis@wN+~KTj>qv&Vk=3t-E7%KWC`1?x|Kk5Y>yMu#16K% z$?l1^5)wCr09AquTq|+p!T~Da!ig)KsF0B0!T}+{DU9v>IFn?ww3QHOEG71vH}Acf z@69~h2fy9eeE#V2@nw$Vj&7{iw($9p_;>gr{QuPN1Bg!#ch@h49Cz&N__y@_>0^&` zTp7CCJJC-4MZ@wtd1(74%J(~6+#Bo8^t;fyf+F5TP1mdBe*6539Piqd+(oqx>fKe; za@Y3*bbfzx+uFZk>2~f+b-CO(u!9bYAm8t_z0l}aa*1C9U&qa2j!(KoS1P%cI3T}M zZ}6*rfOs{p36><6_@bVdRJ~MCp5qHZ(nO$(k|F@f0J;Gret6`n%lN7s*p9JPJ2wo6 zrAn?9MO{M_d%a%1C+Gd3DN4Goi=ZGD3IgsSgnM2D`+^sqNS%!Q)KF*zZZ~p$kB|LA z)8CCMxm+A*d<^H+>5c<=;gB7sDE47jl=48FXJlJro9=GVPKIV%B5I=!@}dyiNptPG zEkE+ZmcJn6SiLYX&PlyKjy-q0ozC3QVYGG?BN!r`YZ-3ub&b~tddow;{189aS zXMJRPl0NYMv0(%cb9rssH78LNKV5Ad*1RW6J3 zn&(>8d}}ve)+?TcLY#~+lO&v~WaFNN&FR*WqU~03Qu4NI8@8z<*(sWWDe1BxBSjOS zV%kEf2xPB>camj}5OrH_We-dJjo0(ASZk*da0(_i}^XQG~)=6%Y z;@X8lh~m;w$&G5qxEkZGHLssD`m;uyUa z@@SPIb(Qp5>?HJ^s0RbI(!_h_AVn+nI&DU}pT93Kqh$BB-Frwx2(R8-8dL~%$CP!! zv2{~`mSPJ!k`UhEvIbOHl7VWD(tOux&(xTz^ zQG2K6;%AC5z7t5=(1ujZHN3RQFrye6rm4!j3naI(v=zT;;Flb6{FXCwha2C2?&rm1 zM)%Vz;fnLd$RwKTdbp=G!TAas%8qVplN3>N`}E;3wnK7^LxB7o3EhKtUJ&@x;E z5W2{4(fJTshKm3~7a1-(A41D;5kTl7!$s#qXc;a72wh~j=zIt*!$kn0iwqZ?520na z2q1Kk;iB^)vIv+yI za1lW0A{E#2Yj zGj4L+qyD?EeRB@?eRZR@vfcl|{Btlk^T5fQcLsyOkq?f)68{Dt-@L}Xb!%1oaqz_E zXM?cx{o%*1e{$^BQvb;9#*I6N%%flae8~K2Y3<1mm!7@@U+31Yt-q{nee}+$&2QgB d&%6LGb3e5j5B_nXf#Y!8#@c4>)3cYa{|(ic^*I0l literal 0 HcmV?d00001 diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index a620f4d539..e4833e1830 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -1009,4 +1009,8 @@ public interface RSClient extends RSGameEngine, Client @Import("viewportWalking") void setViewportWalking(boolean viewportWalking); + + @Import("crossSprites") + @Override + RSSpritePixels[] getCrossSprites(); } From 5025b6d5afad6f5ca7b0f2b9c8cd837ef21f6b38 Mon Sep 17 00:00:00 2001 From: William Collishaw Date: Thu, 27 Jun 2019 01:27:56 -0600 Subject: [PATCH 07/10] Replace use of deprecated Guava Files write method --- cache/src/test/java/net/runelite/cache/AreaDumper.java | 2 +- cache/src/test/java/net/runelite/cache/EnumDumperTest.java | 2 +- cache/src/test/java/net/runelite/cache/FrameDumper.java | 2 +- cache/src/test/java/net/runelite/cache/FramemapDumper.java | 2 +- cache/src/test/java/net/runelite/cache/InventoryDumper.java | 2 +- cache/src/test/java/net/runelite/cache/KitDumperTest.java | 2 +- cache/src/test/java/net/runelite/cache/OverlayDumper.java | 2 +- cache/src/test/java/net/runelite/cache/SequenceDumper.java | 2 +- .../test/java/net/runelite/cache/SoundEffectsDumperTest.java | 2 +- cache/src/test/java/net/runelite/cache/StructManagerTest.java | 2 +- cache/src/test/java/net/runelite/cache/TextureDumper.java | 2 +- cache/src/test/java/net/runelite/cache/UnderlayDumper.java | 2 +- cache/src/test/java/net/runelite/cache/VarbitDumper.java | 2 +- cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/cache/src/test/java/net/runelite/cache/AreaDumper.java b/cache/src/test/java/net/runelite/cache/AreaDumper.java index b789d78a0d..2aab1db48b 100644 --- a/cache/src/test/java/net/runelite/cache/AreaDumper.java +++ b/cache/src/test/java/net/runelite/cache/AreaDumper.java @@ -64,7 +64,7 @@ public class AreaDumper for (AreaDefinition area : areaManager.getAreas()) { - Files.write(gson.toJson(area), new File(outDir, area.id + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, area.id + ".json"), Charset.defaultCharset()).write(gson.toJson(area)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/EnumDumperTest.java b/cache/src/test/java/net/runelite/cache/EnumDumperTest.java index a094b9fc24..705356b0b5 100644 --- a/cache/src/test/java/net/runelite/cache/EnumDumperTest.java +++ b/cache/src/test/java/net/runelite/cache/EnumDumperTest.java @@ -80,7 +80,7 @@ public class EnumDumperTest if (def != null) { - Files.write(gson.toJson(def), new File(dumpDir, file.getFileId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(dumpDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(def)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/FrameDumper.java b/cache/src/test/java/net/runelite/cache/FrameDumper.java index 2bd7e2ca17..8e856cd2f8 100644 --- a/cache/src/test/java/net/runelite/cache/FrameDumper.java +++ b/cache/src/test/java/net/runelite/cache/FrameDumper.java @@ -101,7 +101,7 @@ public class FrameDumper frames.add(frame); } - Files.write(gson.toJson(frames), new File(outDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()).write(gson.toJson(frames)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/FramemapDumper.java b/cache/src/test/java/net/runelite/cache/FramemapDumper.java index 4513bf3dfb..f95e92c9fa 100644 --- a/cache/src/test/java/net/runelite/cache/FramemapDumper.java +++ b/cache/src/test/java/net/runelite/cache/FramemapDumper.java @@ -74,7 +74,7 @@ public class FramemapDumper FramemapLoader loader = new FramemapLoader(); FramemapDefinition framemap = loader.load(0, contents); - Files.write(gson.toJson(framemap), new File(outDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()).write(gson.toJson(framemap)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/InventoryDumper.java b/cache/src/test/java/net/runelite/cache/InventoryDumper.java index 4caf464141..f74c4ce188 100644 --- a/cache/src/test/java/net/runelite/cache/InventoryDumper.java +++ b/cache/src/test/java/net/runelite/cache/InventoryDumper.java @@ -77,7 +77,7 @@ public class InventoryDumper InventoryLoader loader = new InventoryLoader(); InventoryDefinition inv = loader.load(file.getFileId(), file.getContents()); - Files.write(gson.toJson(inv), new File(outDir, inv.id + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, inv.id + ".json"), Charset.defaultCharset()).write(gson.toJson(inv)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/KitDumperTest.java b/cache/src/test/java/net/runelite/cache/KitDumperTest.java index 286ca6ea8e..4db1267506 100644 --- a/cache/src/test/java/net/runelite/cache/KitDumperTest.java +++ b/cache/src/test/java/net/runelite/cache/KitDumperTest.java @@ -78,7 +78,7 @@ public class KitDumperTest KitDefinition def = loader.load(file.getFileId(), b); - Files.write(gson.toJson(def), new File(dumpDir, file.getFileId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(dumpDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(def)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/OverlayDumper.java b/cache/src/test/java/net/runelite/cache/OverlayDumper.java index 4ac4b53a7c..51457192b7 100644 --- a/cache/src/test/java/net/runelite/cache/OverlayDumper.java +++ b/cache/src/test/java/net/runelite/cache/OverlayDumper.java @@ -77,7 +77,7 @@ public class OverlayDumper OverlayLoader loader = new OverlayLoader(); OverlayDefinition overlay = loader.load(file.getFileId(), file.getContents()); - Files.write(gson.toJson(overlay), new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(overlay)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/SequenceDumper.java b/cache/src/test/java/net/runelite/cache/SequenceDumper.java index 94dd175bbb..485bd3d84f 100644 --- a/cache/src/test/java/net/runelite/cache/SequenceDumper.java +++ b/cache/src/test/java/net/runelite/cache/SequenceDumper.java @@ -77,7 +77,7 @@ public class SequenceDumper SequenceLoader loader = new SequenceLoader(); SequenceDefinition seq = loader.load(file.getFileId(), file.getContents()); - Files.write(gson.toJson(seq), new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(seq)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java b/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java index c2a420c0de..5ac0c9e1c5 100644 --- a/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java +++ b/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java @@ -71,7 +71,7 @@ public class SoundEffectsDumperTest SoundEffectLoader soundEffectLoader = new SoundEffectLoader(); SoundEffectDefinition soundEffect = soundEffectLoader.load(contents); - Files.write(gson.toJson(soundEffect), new File(dumpDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(dumpDir, archive.getArchiveId() + ".json"), Charset.defaultCharset()).write(gson.toJson(soundEffect)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/StructManagerTest.java b/cache/src/test/java/net/runelite/cache/StructManagerTest.java index 470df61bc0..f1a1fb22ca 100644 --- a/cache/src/test/java/net/runelite/cache/StructManagerTest.java +++ b/cache/src/test/java/net/runelite/cache/StructManagerTest.java @@ -64,7 +64,7 @@ public class StructManagerTest { StructDefinition def = struct.getValue(); - Files.write(gson.toJson(def), new File(dumpDir, struct.getKey() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(dumpDir, struct.getKey() + ".json"), Charset.defaultCharset()).write(gson.toJson(def)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/TextureDumper.java b/cache/src/test/java/net/runelite/cache/TextureDumper.java index cdcdbd9f6a..0aba683504 100644 --- a/cache/src/test/java/net/runelite/cache/TextureDumper.java +++ b/cache/src/test/java/net/runelite/cache/TextureDumper.java @@ -64,7 +64,7 @@ public class TextureDumper for (TextureDefinition texture : tm.getTextures()) { - Files.write(gson.toJson(texture), new File(outDir, texture.getId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, texture.getId() + ".json"), Charset.defaultCharset()).write(gson.toJson(texture)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/UnderlayDumper.java b/cache/src/test/java/net/runelite/cache/UnderlayDumper.java index db735d40cf..04f2997530 100644 --- a/cache/src/test/java/net/runelite/cache/UnderlayDumper.java +++ b/cache/src/test/java/net/runelite/cache/UnderlayDumper.java @@ -77,7 +77,7 @@ public class UnderlayDumper UnderlayLoader loader = new UnderlayLoader(); UnderlayDefinition underlay = loader.load(file.getFileId(), file.getContents()); - Files.write(gson.toJson(underlay), new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(underlay)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/VarbitDumper.java b/cache/src/test/java/net/runelite/cache/VarbitDumper.java index 5f75c7a157..9bcdcf9237 100644 --- a/cache/src/test/java/net/runelite/cache/VarbitDumper.java +++ b/cache/src/test/java/net/runelite/cache/VarbitDumper.java @@ -77,7 +77,7 @@ public class VarbitDumper VarbitLoader loader = new VarbitLoader(); VarbitDefinition varbit = loader.load(file.getFileId(), file.getContents()); - Files.write(gson.toJson(varbit), new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(varbit)); ++count; } } diff --git a/cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java b/cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java index 8d8dd956c4..92b2582a91 100644 --- a/cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java +++ b/cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java @@ -77,7 +77,7 @@ public class WorldMapDumperTest WorldMapLoader loader = new WorldMapLoader(); WorldMapDefinition def = loader.load(file.getContents(), file.getFileId()); - Files.write(gson.toJson(def), new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()); + Files.asCharSink(new File(outDir, file.getFileId() + ".json"), Charset.defaultCharset()).write(gson.toJson(def)); ++count; } } From 6e1a7d74cc0c1da4bb19d5f918de83481f19d76c Mon Sep 17 00:00:00 2001 From: winterdaze <35933468+winterdaze-rs@users.noreply.github.com> Date: Thu, 27 Jun 2019 08:43:48 -0500 Subject: [PATCH 08/10] Add tooltips to DevTools buttons (#9224) --- .../net/runelite/client/plugins/devtools/DevToolsButton.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java index 52de0309a9..e21af75f5a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsButton.java @@ -37,6 +37,7 @@ class DevToolsButton extends JButton { super(title); addActionListener((ev) -> setActive(!active)); + this.setToolTipText(title); } void setActive(boolean active) From 8757d25bd3f3d88e634542396e557ca5199b3de5 Mon Sep 17 00:00:00 2001 From: Jacob McElroy Date: Thu, 27 Jun 2019 08:50:32 -0400 Subject: [PATCH 09/10] chat commands: add ba high gamble command --- .../runelite/http/api/chat/ChatClient.java | 42 +++++++++++ .../http/service/chat/ChatController.java | 22 ++++++ .../http/service/chat/ChatService.java | 18 +++++ .../main/java/net/runelite/api/Varbits.java | 1 + .../chatcommands/ChatCommandsConfig.java | 11 +++ .../chatcommands/ChatCommandsPlugin.java | 72 +++++++++++++++++++ 6 files changed, 166 insertions(+) diff --git a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java index 1de7d524f1..2ab1d0c8ed 100644 --- a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java +++ b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java @@ -216,4 +216,46 @@ public class ChatClient return Integer.parseInt(response.body().string()); } } + + public boolean submitGc(String username, int gc) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("gc") + .addQueryParameter("name", username) + .addQueryParameter("gc", Integer.toString(gc)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public int getGc(String username) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("gc") + .addQueryParameter("name", username) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up gamble count!"); + } + return Integer.parseInt(response.body().string()); + } + } } diff --git a/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java b/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java index 2f7a6b8740..f0a9fba213 100644 --- a/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java +++ b/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java @@ -107,6 +107,28 @@ public class ChatController return kc; } + @PostMapping("/gc") + public void submitGc(@RequestParam String name, @RequestParam int gc) + { + if (gc < 0) + { + return; + } + + chatService.setGc(name, gc); + } + + @GetMapping("/gc") + public int getKc(@RequestParam String name) + { + Integer gc = chatService.getGc(name); + if (gc == null) + { + throw new NotFoundException(); + } + return gc; + } + @PostMapping("/task") public void submitTask(@RequestParam String name, @RequestParam("task") String taskName, @RequestParam int amount, @RequestParam int initialAmount, @RequestParam String location) diff --git a/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java b/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java index 07f68b95cf..70830889bc 100644 --- a/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java +++ b/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java @@ -139,4 +139,22 @@ public class ChatService jedis.setex("pb." + boss + "." + name, (int) EXPIRE.getSeconds(), Integer.toString(pb)); } } + + public Integer getGc(String name) + { + String value; + try (Jedis jedis = jedisPool.getResource()) + { + value = jedis.get("gc." + name); + } + return value == null ? null : Integer.parseInt(value); + } + + public void setGc(String name, int gc) + { + try (Jedis jedis = jedisPool.getResource()) + { + jedis.setex("gc." + name, (int) EXPIRE.getSeconds(), Integer.toString(gc)); + } + } } diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 58cdc80380..b55956dd20 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -217,6 +217,7 @@ public enum Varbits * Barbarian Assault */ IN_GAME_BA(3923), + BA_GC(4768), /** * 0 = Outside wilderness diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java index 16c40d54b7..92987467d0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java @@ -99,6 +99,17 @@ public interface ChatCommandsConfig extends Config @ConfigItem( position = 6, + keyName = "gc", + name = "GC Command", + description = "Configures whether the Barbarian Assault High gamble count command is enabled
!gc" + ) + default boolean gc() + { + return true; + } + + @ConfigItem( + position = 7, keyName = "clearShortcuts", name = "Clear shortcuts", description = "Enable shortcuts (ctrl+w and backspace) for clearing the chatbox" diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index 141d72ab65..ffc54bbad7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -42,6 +42,7 @@ import net.runelite.api.IconID; import net.runelite.api.ItemComposition; import net.runelite.api.MessageNode; import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameTick; import net.runelite.api.events.VarbitChanged; @@ -95,6 +96,7 @@ public class ChatCommandsPlugin extends Plugin private static final String CMB_COMMAND_STRING = "!cmb"; private static final String QP_COMMAND_STRING = "!qp"; private static final String PB_COMMAND = "!pb"; + private static final String GC_COMMAND_STRING = "!gc"; private final HiscoreClient hiscoreClient = new HiscoreClient(); private final ChatClient chatClient = new ChatClient(); @@ -143,6 +145,7 @@ public class ChatCommandsPlugin extends Plugin chatCommandManager.registerCommandAsync(KILLCOUNT_COMMAND_STRING, this::killCountLookup, this::killCountSubmit); chatCommandManager.registerCommandAsync(QP_COMMAND_STRING, this::questPointsLookup, this::questPointsSubmit); chatCommandManager.registerCommandAsync(PB_COMMAND, this::personalBestLookup, this::personalBestSubmit); + chatCommandManager.registerCommandAsync(GC_COMMAND_STRING, this::gambleCountLookup, this::gambleCountSubmit); } @Override @@ -160,6 +163,7 @@ public class ChatCommandsPlugin extends Plugin chatCommandManager.unregisterCommand(KILLCOUNT_COMMAND_STRING); chatCommandManager.unregisterCommand(QP_COMMAND_STRING); chatCommandManager.unregisterCommand(PB_COMMAND); + chatCommandManager.unregisterCommand(GC_COMMAND_STRING); } @Provides @@ -570,6 +574,74 @@ public class ChatCommandsPlugin extends Plugin return true; } + private void gambleCountLookup(ChatMessage chatMessage, String message) + { + if (!config.gc()) + { + return; + } + + ChatMessageType type = chatMessage.getType(); + + final String player; + if (type == ChatMessageType.PRIVATECHATOUT) + { + player = client.getLocalPlayer().getName(); + } + else + { + player = sanitize(chatMessage.getName()); + } + + int gc; + try + { + gc = chatClient.getGc(player); + } + catch (IOException ex) + { + log.debug("unable to lookup gamble count", ex); + return; + } + + String response = new ChatMessageBuilder() + .append(ChatColorType.NORMAL) + .append("Barbarian Assault High-level gambles: ") + .append(ChatColorType.HIGHLIGHT) + .append(Integer.toString(gc)) + .build(); + + log.debug("Setting response {}", response); + final MessageNode messageNode = chatMessage.getMessageNode(); + messageNode.setRuneLiteFormatMessage(response); + chatMessageManager.update(messageNode); + client.refreshChat(); + } + + private boolean gambleCountSubmit(ChatInput chatInput, String value) + { + final int gc = client.getVar(Varbits.BA_GC); + final String playerName = client.getLocalPlayer().getName(); + + executor.execute(() -> + { + try + { + chatClient.submitGc(playerName, gc); + } + catch (Exception ex) + { + log.warn("unable to submit gamble count", ex); + } + finally + { + chatInput.resume(); + } + }); + + return true; + } + /** * Looks up the item price and changes the original message to the * response. From 8ee3e483f4112fbb51b5e9ad63256fd8dc502d9b Mon Sep 17 00:00:00 2001 From: Robert Alexander Date: Fri, 24 May 2019 21:45:27 +0200 Subject: [PATCH 10/10] chat commands: add duel arena chat command --- .../runelite/http/api/chat/ChatClient.java | 51 +++++++ .../net/runelite/http/api/chat/Duels.java | 36 +++++ .../http/service/chat/ChatController.java | 31 ++++ .../http/service/chat/ChatService.java | 41 ++++++ .../chatcommands/ChatCommandsConfig.java | 11 ++ .../chatcommands/ChatCommandsPlugin.java | 138 +++++++++++++++++- .../chatcommands/ChatCommandsPluginTest.java | 37 ++++- 7 files changed, 343 insertions(+), 2 deletions(-) create mode 100644 http-api/src/main/java/net/runelite/http/api/chat/Duels.java diff --git a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java index 2ab1d0c8ed..79c4a889ed 100644 --- a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java +++ b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java @@ -258,4 +258,55 @@ public class ChatClient return Integer.parseInt(response.body().string()); } } + + public boolean submitDuels(String username, int wins, int losses, int winningStreak, int losingStreak) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("duels") + .addQueryParameter("name", username) + .addQueryParameter("wins", Integer.toString(wins)) + .addQueryParameter("losses", Integer.toString(losses)) + .addQueryParameter("winningStreak", Integer.toString(winningStreak)) + .addQueryParameter("losingStreak", Integer.toString(losingStreak)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public Duels getDuels(String username) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("duels") + .addQueryParameter("name", username) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up duels!"); + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), Duels.class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } } diff --git a/http-api/src/main/java/net/runelite/http/api/chat/Duels.java b/http-api/src/main/java/net/runelite/http/api/chat/Duels.java new file mode 100644 index 0000000000..ba117a526a --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/chat/Duels.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2019, Adam + * 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.http.api.chat; + +import lombok.Data; + +@Data +public class Duels +{ + private int wins; + private int losses; + private int winningStreak; + private int losingStreak; +} diff --git a/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java b/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java index f0a9fba213..7b5132e47a 100644 --- a/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java +++ b/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java @@ -29,6 +29,7 @@ import com.google.common.cache.CacheBuilder; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.runelite.http.api.chat.Duels; import net.runelite.http.api.chat.Task; import net.runelite.http.service.util.exception.NotFoundException; import org.springframework.beans.factory.annotation.Autowired; @@ -177,4 +178,34 @@ public class ChatController } return pb; } + + @PostMapping("/duels") + public void submitDuels(@RequestParam String name, @RequestParam int wins, + @RequestParam int losses, + @RequestParam int winningStreak, @RequestParam int losingStreak) + { + if (wins < 0 || losses < 0 || winningStreak < 0 || losingStreak < 0) + { + return; + } + + Duels duels = new Duels(); + duels.setWins(wins); + duels.setLosses(losses); + duels.setWinningStreak(winningStreak); + duels.setLosingStreak(losingStreak); + + chatService.setDuels(name, duels); + } + + @GetMapping("/duels") + public Duels getDuels(@RequestParam String name) + { + Duels duels = chatService.getDuels(name); + if (duels == null) + { + throw new NotFoundException(); + } + return duels; + } } diff --git a/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java b/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java index 70830889bc..0b0762d3ea 100644 --- a/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java +++ b/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java @@ -28,6 +28,7 @@ import com.google.common.collect.ImmutableMap; import java.time.Duration; import java.util.Map; import net.runelite.http.api.chat.Task; +import net.runelite.http.api.chat.Duels; import net.runelite.http.service.util.redis.RedisPool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -157,4 +158,44 @@ public class ChatService jedis.setex("gc." + name, (int) EXPIRE.getSeconds(), Integer.toString(gc)); } } + + public Duels getDuels(String name) + { + Map map; + + try (Jedis jedis = jedisPool.getResource()) + { + map = jedis.hgetAll("duels." + name); + } + + if (map.isEmpty()) + { + return null; + } + + Duels duels = new Duels(); + duels.setWins(Integer.parseInt(map.get("wins"))); + duels.setLosses(Integer.parseInt(map.get("losses"))); + duels.setWinningStreak(Integer.parseInt(map.get("winningStreak"))); + duels.setLosingStreak(Integer.parseInt(map.get("losingStreak"))); + return duels; + } + + public void setDuels(String name, Duels duels) + { + Map duelsMap = ImmutableMap.builderWithExpectedSize(4) + .put("wins", Integer.toString(duels.getWins())) + .put("losses", Integer.toString(duels.getLosses())) + .put("winningStreak", Integer.toString(duels.getWinningStreak())) + .put("losingStreak", Integer.toString(duels.getLosingStreak())) + .build(); + + String key = "duels." + name; + + try (Jedis jedis = jedisPool.getResource()) + { + jedis.hmset(key, duelsMap); + jedis.expire(key, (int) EXPIRE.getSeconds()); + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java index 92987467d0..5a08937345 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsConfig.java @@ -110,6 +110,17 @@ public interface ChatCommandsConfig extends Config @ConfigItem( position = 7, + keyName = "duels", + name = "Duels Command", + description = "Configures whether the duel arena command is enabled
!duels" + ) + default boolean duels() + { + return true; + } + + @ConfigItem( + position = 8, keyName = "clearShortcuts", name = "Clear shortcuts", description = "Enable shortcuts (ctrl+w and backspace) for clearing the chatbox" diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index ffc54bbad7..694542636f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -65,6 +65,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.util.StackFormatter; import static net.runelite.client.util.Text.sanitize; import net.runelite.http.api.chat.ChatClient; +import net.runelite.http.api.chat.Duels; import net.runelite.http.api.hiscore.HiscoreClient; import net.runelite.http.api.hiscore.HiscoreEndpoint; import net.runelite.http.api.hiscore.HiscoreResult; @@ -88,6 +89,9 @@ public class ChatCommandsPlugin extends Plugin private static final Pattern BARROWS_PATTERN = Pattern.compile("Your Barrows chest count is: (\\d+)"); private static final Pattern KILL_DURATION_PATTERN = Pattern.compile("Fight duration: [0-9:]+. Personal best: ([0-9:]+)"); private static final Pattern NEW_PB_PATTERN = Pattern.compile("Fight duration: ([0-9:]+) \\(new personal best\\)"); + private static final Pattern DUEL_ARENA_WINS_PATTERN = Pattern.compile("You (were defeated|won)! You have(?: now)? won (\\d+) duels?"); + private static final Pattern DUEL_ARENA_LOSSES_PATTERN = Pattern.compile("You have(?: now)? lost (\\d+) duels?"); + private static final String TOTAL_LEVEL_COMMAND_STRING = "!total"; private static final String PRICE_COMMAND_STRING = "!price"; private static final String LEVEL_COMMAND_STRING = "!lvl"; @@ -97,6 +101,7 @@ public class ChatCommandsPlugin extends Plugin private static final String QP_COMMAND_STRING = "!qp"; private static final String PB_COMMAND = "!pb"; private static final String GC_COMMAND_STRING = "!gc"; + private static final String DUEL_ARENA_COMMAND = "!duels"; private final HiscoreClient hiscoreClient = new HiscoreClient(); private final ChatClient chatClient = new ChatClient(); @@ -146,6 +151,7 @@ public class ChatCommandsPlugin extends Plugin chatCommandManager.registerCommandAsync(QP_COMMAND_STRING, this::questPointsLookup, this::questPointsSubmit); chatCommandManager.registerCommandAsync(PB_COMMAND, this::personalBestLookup, this::personalBestSubmit); chatCommandManager.registerCommandAsync(GC_COMMAND_STRING, this::gambleCountLookup, this::gambleCountSubmit); + chatCommandManager.registerCommandAsync(DUEL_ARENA_COMMAND, this::duelArenaLookup, this::duelArenaSubmit); } @Override @@ -164,6 +170,7 @@ public class ChatCommandsPlugin extends Plugin chatCommandManager.unregisterCommand(QP_COMMAND_STRING); chatCommandManager.unregisterCommand(PB_COMMAND); chatCommandManager.unregisterCommand(GC_COMMAND_STRING); + chatCommandManager.unregisterCommand(DUEL_ARENA_COMMAND); } @Provides @@ -201,7 +208,9 @@ public class ChatCommandsPlugin extends Plugin @Subscribe public void onChatMessage(ChatMessage chatMessage) { - if (chatMessage.getType() != ChatMessageType.GAMEMESSAGE && chatMessage.getType() != ChatMessageType.SPAM) + if (chatMessage.getType() != ChatMessageType.TRADE + && chatMessage.getType() != ChatMessageType.GAMEMESSAGE + && chatMessage.getType() != ChatMessageType.SPAM) { return; } @@ -237,6 +246,43 @@ public class ChatCommandsPlugin extends Plugin return; } + matcher = DUEL_ARENA_WINS_PATTERN.matcher(message); + if (matcher.find()) + { + final int oldWins = getKc("Duel Arena Wins"); + final int wins = Integer.parseInt(matcher.group(2)); + final String result = matcher.group(1); + int winningStreak = getKc("Duel Arena Win Streak"); + int losingStreak = getKc("Duel Arena Lose Streak"); + + if (result.equals("won") && wins > oldWins) + { + losingStreak = 0; + winningStreak += 1; + } + else if (result.equals("were defeated")) + { + losingStreak += 1; + winningStreak = 0; + } + else + { + log.warn("unrecognized duel streak chat message: {}", message); + } + + setKc("Duel Arena Wins", wins); + setKc("Duel Arena Win Streak", winningStreak); + setKc("Duel Arena Lose Streak", losingStreak); + } + + matcher = DUEL_ARENA_LOSSES_PATTERN.matcher(message); + if (matcher.find()) + { + int losses = Integer.parseInt(matcher.group(1)); + + setKc("Duel Arena Losses", losses); + } + matcher = BARROWS_PATTERN.matcher(message); if (matcher.find()) { @@ -417,6 +463,96 @@ public class ChatCommandsPlugin extends Plugin client.refreshChat(); } + private boolean duelArenaSubmit(ChatInput chatInput, String value) + { + final int wins = getKc("Duel Arena Wins"); + final int losses = getKc("Duel Arena Losses"); + final int winningStreak = getKc("Duel Arena Win Streak"); + final int losingStreak = getKc("Duel Arena Lose Streak"); + + if (wins <= 0 && losses <= 0 && winningStreak <= 0 && losingStreak <= 0) + { + return false; + } + + final String playerName = client.getLocalPlayer().getName(); + + executor.execute(() -> + { + try + { + chatClient.submitDuels(playerName, wins, losses, winningStreak, losingStreak); + } + catch (Exception ex) + { + log.warn("unable to submit duels", ex); + } + finally + { + chatInput.resume(); + } + }); + + return true; + } + + private void duelArenaLookup(ChatMessage chatMessage, String message) + { + if (!config.duels()) + { + return; + } + + ChatMessageType type = chatMessage.getType(); + + final String player; + if (type == ChatMessageType.PRIVATECHATOUT) + { + player = client.getLocalPlayer().getName(); + } + else + { + player = sanitize(chatMessage.getName()); + } + + Duels duels; + try + { + duels = chatClient.getDuels(player); + } + catch (IOException ex) + { + log.debug("unable to lookup duels", ex); + return; + } + + final int wins = duels.getWins(); + final int losses = duels.getLosses(); + final int winningStreak = duels.getWinningStreak(); + final int losingStreak = duels.getLosingStreak(); + + String response = new ChatMessageBuilder() + .append(ChatColorType.NORMAL) + .append("Duel Arena wins: ") + .append(ChatColorType.HIGHLIGHT) + .append(Integer.toString(wins)) + .append(ChatColorType.NORMAL) + .append(" losses: ") + .append(ChatColorType.HIGHLIGHT) + .append(Integer.toString(losses)) + .append(ChatColorType.NORMAL) + .append(" streak: ") + .append(ChatColorType.HIGHLIGHT) + .append(Integer.toString((winningStreak != 0 ? winningStreak : -losingStreak))) + .build(); + + log.debug("Setting response {}", response); + final MessageNode messageNode = chatMessage.getMessageNode(); + messageNode.setRuneLiteFormatMessage(response); + chatMessageManager.update(messageNode); + client.refreshChat(); + } + private void questPointsLookup(ChatMessage chatMessage, String message) { if (!config.qp()) diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java index 922b8fed25..ea96a7caec 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java @@ -30,6 +30,7 @@ import com.google.inject.testing.fieldbinder.BoundFieldModule; import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; import static net.runelite.api.ChatMessageType.GAMEMESSAGE; +import static net.runelite.api.ChatMessageType.TRADE; import net.runelite.api.Client; import net.runelite.api.events.ChatMessage; import net.runelite.client.config.ChatColorConfig; @@ -191,4 +192,38 @@ public class ChatCommandsPluginTest verify(configManager).setConfiguration(eq("personalbest.adam"), eq("kree'arra"), eq(181)); } -} \ No newline at end of file + + @Test + public void testDuelArenaWin() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, TRADE, "", "You won! You have now won 27 duels.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "duel arena wins", 27); + verify(configManager).setConfiguration("killcount.adam", "duel arena win streak", 1); + } + + @Test + public void testDuelArenaWin2() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, TRADE, "", "You were defeated! You have won 22 duels.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "duel arena wins", 22); + } + + @Test + public void testDuelArenaLose() + { + when(client.getUsername()).thenReturn("Adam"); + + ChatMessage chatMessageEvent = new ChatMessage(null, TRADE, "", "You have now lost 999 duels.", null, 0); + chatCommandsPlugin.onChatMessage(chatMessageEvent); + + verify(configManager).setConfiguration("killcount.adam", "duel arena losses", 999); + } +}