From cfeab2017933fe4a0fc0886493f50cb4d73135d5 Mon Sep 17 00:00:00 2001 From: sdburns1998 Date: Sat, 29 Jun 2019 00:30:28 +0200 Subject: [PATCH] chat commands: add duel arena chat command --- .../runelite/http/api/chat/ChatClient.java | 172 +++++++++----- .../net/runelite/http/api/chat/Duels.java | 36 +++ .../chatcommands/ChatCommandsConfig.java | 11 + .../chatcommands/ChatCommandsPlugin.java | 209 ++++++++++++------ .../InterfaceStylesPlugin.java | 10 +- .../MenuEntrySwapperPlugin.java | 4 - .../chatcommands/ChatCommandsPluginTest.java | 37 +++- .../java/net/runelite/rs/api/RSClient.java | 2 +- 8 files changed, 338 insertions(+), 143 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 532b56d158..bd8c83f5ef 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 @@ -39,8 +39,8 @@ import okhttp3.Response; public class ChatClient { private static final Predicate LAYOUT_VALIDATOR = Pattern - .compile("\\[[A-Z]+]:(\\s*\\w+\\s*(\\([A-Za-z]+\\))?,?)+") - .asPredicate(); + .compile("\\[[A-Z]+]:(\\s*\\w+\\s*(\\([A-Za-z]+\\))?,?)+") + .asPredicate(); public boolean submitKc(String username, String boss, int kc) throws IOException { @@ -225,7 +225,7 @@ public class ChatClient public boolean submitGc(String username, int gc) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() .addPathSegment("chat") .addPathSegment("gc") .addQueryParameter("name", username) @@ -245,7 +245,7 @@ public class ChatClient public int getGc(String username) throws IOException { - HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() .addPathSegment("chat") .addPathSegment("gc") .addQueryParameter("name", username) @@ -255,7 +255,7 @@ public class ChatClient .url(url) .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) { if (!response.isSuccessful()) { @@ -273,16 +273,16 @@ public class ChatClient } HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() - .addPathSegment("chat") - .addPathSegment("layout") - .addQueryParameter("name", username) - .addQueryParameter("layout", layout) - .build(); + .addPathSegment("chat") + .addPathSegment("layout") + .addQueryParameter("name", username) + .addQueryParameter("layout", layout) + .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) - .url(url) - .build(); + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) { @@ -290,17 +290,40 @@ public class ChatClient } } + 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 String getLayout(String username) throws IOException { HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() - .addPathSegment("chat") - .addPathSegment("layout") - .addQueryParameter("name", username) - .build(); + .addPathSegment("chat") + .addPathSegment("layout") + .addQueryParameter("name", username) + .build(); Request request = new Request.Builder() - .url(url) - .build(); + .url(url) + .build(); try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) { @@ -328,15 +351,15 @@ public class ChatClient public House[] getHosts(int world, String location) throws IOException { HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() - .addPathSegment("chat") - .addPathSegment("hosts") - .addQueryParameter("world", Integer.toString(world)) - .addQueryParameter("location", location) - .build(); + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .build(); Request request = new Request.Builder() - .url(url) - .build(); + .url(url) + .build(); try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) { @@ -347,6 +370,35 @@ public class ChatClient InputStream in = response.body().byteStream(); return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), House[].class); + + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + 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) { @@ -357,24 +409,24 @@ public class ChatClient public boolean submitHost(int world, String location, House house) throws IOException { HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() - .addPathSegment("chat") - .addPathSegment("hosts") - .addQueryParameter("world", Integer.toString(world)) - .addQueryParameter("location", location) - .addQueryParameter("owner", house.getOwner()) - .addQueryParameter("guildedAltar", Boolean.toString(house.isGuildedAltarPresent())) - .addQueryParameter("occultAltar", Boolean.toString(house.isOccultAltarPresent())) - .addQueryParameter("spiritTree", Boolean.toString(house.isSpiritTreePresent())) - .addQueryParameter("fairyRing", Boolean.toString(house.isFairyRingPresent())) - .addQueryParameter("wildernessObelisk", Boolean.toString(house.isWildernessObeliskPresent())) - .addQueryParameter("repairStand", Boolean.toString(house.isRepairStandPresent())) - .addQueryParameter("combatDummy", Boolean.toString(house.isCombatDummyPresent())) - .build(); + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .addQueryParameter("owner", house.getOwner()) + .addQueryParameter("guildedAltar", Boolean.toString(house.isGuildedAltarPresent())) + .addQueryParameter("occultAltar", Boolean.toString(house.isOccultAltarPresent())) + .addQueryParameter("spiritTree", Boolean.toString(house.isSpiritTreePresent())) + .addQueryParameter("fairyRing", Boolean.toString(house.isFairyRingPresent())) + .addQueryParameter("wildernessObelisk", Boolean.toString(house.isWildernessObeliskPresent())) + .addQueryParameter("repairStand", Boolean.toString(house.isRepairStandPresent())) + .addQueryParameter("combatDummy", Boolean.toString(house.isCombatDummyPresent())) + .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) - .url(url) - .build(); + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) { @@ -385,29 +437,29 @@ public class ChatClient public boolean removeHost(int world, String location, House house) throws IOException { HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder() - .addPathSegment("chat") - .addPathSegment("hosts") - .addQueryParameter("world", Integer.toString(world)) - .addQueryParameter("location", location) - .addQueryParameter("owner", house.getOwner()) - .addQueryParameter("guildedAltar", Boolean.toString(house.isGuildedAltarPresent())) - .addQueryParameter("occultAltar", Boolean.toString(house.isOccultAltarPresent())) - .addQueryParameter("spiritTree", Boolean.toString(house.isSpiritTreePresent())) - .addQueryParameter("fairyRing", Boolean.toString(house.isFairyRingPresent())) - .addQueryParameter("wildernessObelisk", Boolean.toString(house.isWildernessObeliskPresent())) - .addQueryParameter("repairStand", Boolean.toString(house.isRepairStandPresent())) - .addQueryParameter("combatDummy", Boolean.toString(house.isCombatDummyPresent())) - .addQueryParameter("remove", Boolean.toString(true)) - .build(); + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .addQueryParameter("owner", house.getOwner()) + .addQueryParameter("guildedAltar", Boolean.toString(house.isGuildedAltarPresent())) + .addQueryParameter("occultAltar", Boolean.toString(house.isOccultAltarPresent())) + .addQueryParameter("spiritTree", Boolean.toString(house.isSpiritTreePresent())) + .addQueryParameter("fairyRing", Boolean.toString(house.isFairyRingPresent())) + .addQueryParameter("wildernessObelisk", Boolean.toString(house.isWildernessObeliskPresent())) + .addQueryParameter("repairStand", Boolean.toString(house.isRepairStandPresent())) + .addQueryParameter("combatDummy", Boolean.toString(house.isCombatDummyPresent())) + .addQueryParameter("remove", Boolean.toString(true)) + .build(); Request request = new Request.Builder() - .post(RequestBody.create(null, new byte[0])) - .url(url) - .build(); + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute()) { return response.isSuccessful(); } } -} +} \ No newline at end of file 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/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 92bd2f588c..079f1cdba6 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 @@ -64,6 +64,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; @@ -89,6 +90,8 @@ 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"; @@ -98,7 +101,7 @@ public class ChatCommandsPlugin extends Plugin private static final String QP_COMMAND_STRING = "!qp"; private static final String GC_COMMAND_STRING = "!gc"; 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(); @@ -149,7 +152,7 @@ public class ChatCommandsPlugin extends Plugin chatCommandManager.registerCommandAsync(QP_COMMAND_STRING, this::questPointsLookup, this::questPointsSubmit); chatCommandManager.registerCommandAsync(GC_COMMAND_STRING, this::gambleCountLookup, this::gambleCountSubmit); 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 @@ -168,6 +171,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 @@ -205,7 +209,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; } @@ -241,6 +247,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()) { @@ -421,6 +464,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()) @@ -649,74 +782,6 @@ 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. @@ -1301,4 +1366,4 @@ public class ChatCommandsPlugin extends Plugin return WordUtils.capitalize(boss); } } -} +} \ 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 17093f237e..6944a982d7 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 @@ -71,7 +71,7 @@ public class InterfaceStylesPlugin extends Plugin @Inject private SpriteManager spriteManager; - private SpritePixels[] defaultCrossSprites; + private Sprite[] defaultCrossSprites; @Provides InterfaceStylesConfig provideConfig(ConfigManager configManager) @@ -316,19 +316,19 @@ public class InterfaceStylesPlugin extends Plugin return; } - SpritePixels[] crossSprites = client.getCrossSprites(); + Sprite[] crossSprites = client.getCrossSprites(); if (crossSprites == null) { return; } - defaultCrossSprites = new SpritePixels[crossSprites.length]; + defaultCrossSprites = new Sprite[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"); + Sprite newSprite = getFileSpritePixels("rs3/cross_sprites/" + i + ".png"); if (newSprite == null) { @@ -351,7 +351,7 @@ public class InterfaceStylesPlugin extends Plugin return; } - SpritePixels[] crossSprites = client.getCrossSprites(); + Sprite[] crossSprites = client.getCrossSprites(); if (crossSprites != null && defaultCrossSprites.length == crossSprites.length) { 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 236ef2cdd7..c6eb0a7947 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 @@ -1181,10 +1181,6 @@ public class MenuEntrySwapperPlugin extends Plugin { swap(client, "quick-leave", 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(client, "teleport", option, target, true); 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 b6af13221d..de4e89299c 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); + } +} 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 17a61f3b48..17f88f3eb3 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 @@ -1037,5 +1037,5 @@ public interface RSClient extends RSGameShell, Client @Import("crossSprites") @Override - RSSpritePixels[] getCrossSprites(); + RSSprite[] getCrossSprites(); }