From 3c2551f208acf34159bed9c91f53896c9de9b2c7 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Sun, 19 Apr 2020 00:01:31 +0100 Subject: [PATCH 01/29] idle notifier: add support for enchanting bolts --- runelite-api/src/main/java/net/runelite/api/AnimationID.java | 1 + .../runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java | 1 + 2 files changed, 2 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java index 8a9af4d5aa..c4ba1f6163 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -153,6 +153,7 @@ public final class AnimationID public static final int MAGIC_ENCHANTING_AMULET_1 = 719; // sapphire, opal, diamond public static final int MAGIC_ENCHANTING_AMULET_2 = 720; // emerald, jade, dragonstone public static final int MAGIC_ENCHANTING_AMULET_3 = 721; // ruby, topaz, onyx, zenyte + public static final int MAGIC_ENCHANTING_BOLTS = 4462; public static final int BURYING_BONES = 827; public static final int USING_GILDED_ALTAR = 3705; public static final int LOOKING_INTO = 832; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java index 06ca132cd8..6dddea5d78 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java @@ -243,6 +243,7 @@ public class IdleNotifierPlugin extends Plugin case MAGIC_ENCHANTING_AMULET_1: case MAGIC_ENCHANTING_AMULET_2: case MAGIC_ENCHANTING_AMULET_3: + case MAGIC_ENCHANTING_BOLTS: /* Prayer */ case USING_GILDED_ALTAR: /* Farming */ From ab06a14311a0b45be13bc5d29202ed5bff236fcc Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 19 Apr 2020 18:33:13 +0200 Subject: [PATCH 02/29] Prevent screen marker overlays from being reset Fixes #11318 Signed-off-by: Tomas Slusny --- .../client/plugins/screenmarkers/ScreenMarkerOverlay.java | 1 + .../main/java/net/runelite/client/ui/overlay/Overlay.java | 1 + .../java/net/runelite/client/ui/overlay/OverlayRenderer.java | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java index e5f110c0c2..c82ac2aee8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java @@ -49,6 +49,7 @@ public class ScreenMarkerOverlay extends Overlay setLayer(OverlayLayer.ALWAYS_ON_TOP); setPriority(OverlayPriority.HIGH); setResizable(true); + setResettable(false); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java index 57d5164a8d..771278185d 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java @@ -50,6 +50,7 @@ public abstract class Overlay implements LayoutableRenderableEntity private OverlayLayer layer = OverlayLayer.UNDER_WIDGETS; private final List menuEntries = new ArrayList<>(); private boolean resizable; + private boolean resettable = true; protected Overlay() { diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index 21d6993871..ddf0a44bd4 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -334,7 +334,10 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener if (SwingUtilities.isRightMouseButton(mouseEvent)) { - overlayManager.resetOverlay(currentManagedOverlay); + if (currentManagedOverlay.isResettable()) + { + overlayManager.resetOverlay(currentManagedOverlay); + } } else if (SwingUtilities.isLeftMouseButton(mouseEvent)) { From a888519e1c8d4a43a3c4313eef2630c5de2bdac9 Mon Sep 17 00:00:00 2001 From: skyblownet <63957499+skyblownet@users.noreply.github.com> Date: Sun, 19 Apr 2020 18:33:54 +0200 Subject: [PATCH 03/29] skill challenge clue: Fix DRAGONSTONE_BRACELET item requirement --- .../client/plugins/cluescrolls/clues/SkillChallengeClue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java index 1764111b28..ab0b7d0606 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java @@ -127,7 +127,7 @@ public class SkillChallengeClue extends ClueScroll implements NpcClueScroll, Nam xOfItem(ItemID.COSMIC_RUNE, 1), any("Water Rune x15", xOfItem(ItemID.WATER_RUNE, 15), xOfItem(ItemID.MIST_RUNE, 15), xOfItem(ItemID.MUD_RUNE, 15), xOfItem(ItemID.STEAM_RUNE, 15), item(ItemID.STAFF_OF_WATER), item(ItemID.WATER_BATTLESTAFF), item(ItemID.MYSTIC_WATER_STAFF), item(ItemID.MUD_BATTLESTAFF), item(ItemID.MYSTIC_MUD_STAFF), item(ItemID.MIST_BATTLESTAFF), item(ItemID.MYSTIC_MIST_STAFF), item(ItemID.STEAM_BATTLESTAFF), item(ItemID.MYSTIC_STEAM_STAFF), item(ItemID.STEAM_BATTLESTAFF_12795), item(ItemID.MYSTIC_STEAM_STAFF_12796), item(ItemID.KODAI_WAND)), any("Earth Rune x15", xOfItem(ItemID.EARTH_RUNE, 15), xOfItem(ItemID.DUST_RUNE, 15), xOfItem(ItemID.MUD_RUNE, 15), xOfItem(ItemID.LAVA_RUNE, 15), item(ItemID.STAFF_OF_EARTH), item(ItemID.EARTH_BATTLESTAFF), item(ItemID.MYSTIC_EARTH_STAFF), item(ItemID.MUD_BATTLESTAFF), item(ItemID.MYSTIC_MUD_STAFF), item(ItemID.DUST_BATTLESTAFF), item(ItemID.MYSTIC_DUST_STAFF), item(ItemID.LAVA_BATTLESTAFF), item(ItemID.MYSTIC_LAVA_STAFF), item(ItemID.LAVA_BATTLESTAFF_21198), item(ItemID.MYSTIC_LAVA_STAFF_21200)), - any("Unenchanted Dragonstone Jewellery", item(ItemID.DRAGONSTONE_RING), item(ItemID.DRAGON_NECKLACE), item(ItemID.DRAGON_BRACELET), item(ItemID.DRAGONSTONE_AMULET))), + any("Unenchanted Dragonstone Jewellery", item(ItemID.DRAGONSTONE_RING), item(ItemID.DRAGON_NECKLACE), item(ItemID.DRAGONSTONE_BRACELET), item(ItemID.DRAGONSTONE_AMULET))), new SkillChallengeClue("Craft a nature rune.", item(ItemID.PURE_ESSENCE)), new SkillChallengeClue("Catch a mottled eel with aerial fishing in Lake Molch.", any("Fish chunks or King worms", item(ItemID.FISH_CHUNKS), item(ItemID.KING_WORM)), emptySlot("No Gloves", EquipmentInventorySlot.GLOVES), emptySlot("No Weapon", EquipmentInventorySlot.WEAPON), emptySlot("No Shield", EquipmentInventorySlot.SHIELD)), new SkillChallengeClue("Score a goal in skullball.", true, any("Ring of Charos", item(ItemID.RING_OF_CHAROS), item(ItemID.RING_OF_CHAROSA))), From 01bdbe5aabf4a14aa52b32acd2abc3f1270a2d34 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Mon, 20 Apr 2020 01:26:36 +0200 Subject: [PATCH 04/29] Prevent HotkeyListener from consuming input on login screen This prvent HotkeyListener from running on login screen without being explicitely enabled to do so. Signed-off-by: Tomas Slusny --- .../net/runelite/client/input/KeyManager.java | 50 +++++++++++++++++++ .../java/net/runelite/client/ui/ClientUI.java | 1 + .../runelite/client/util/HotkeyListener.java | 6 +++ 3 files changed, 57 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/input/KeyManager.java b/runelite-client/src/main/java/net/runelite/client/input/KeyManager.java index f9e2c4f07d..066f8089c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/input/KeyManager.java +++ b/runelite-client/src/main/java/net/runelite/client/input/KeyManager.java @@ -27,11 +27,24 @@ package net.runelite.client.input; import java.awt.event.KeyEvent; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import javax.annotation.Nullable; +import javax.inject.Inject; import javax.inject.Singleton; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.client.util.HotkeyListener; @Singleton public class KeyManager { + private final Client client; + + @Inject + private KeyManager(@Nullable final Client client) + { + this.client = client; + } + private final List keyListeners = new CopyOnWriteArrayList<>(); public void registerKeyListener(KeyListener keyListener) @@ -56,6 +69,11 @@ public class KeyManager for (KeyListener keyListener : keyListeners) { + if (!shouldProcess(keyListener)) + { + continue; + } + keyListener.keyPressed(keyEvent); if (keyEvent.isConsumed()) { @@ -73,6 +91,11 @@ public class KeyManager for (KeyListener keyListener : keyListeners) { + if (!shouldProcess(keyListener)) + { + continue; + } + keyListener.keyReleased(keyEvent); if (keyEvent.isConsumed()) { @@ -90,6 +113,11 @@ public class KeyManager for (KeyListener keyListener : keyListeners) { + if (!shouldProcess(keyListener)) + { + continue; + } + keyListener.keyTyped(keyEvent); if (keyEvent.isConsumed()) { @@ -97,4 +125,26 @@ public class KeyManager } } } + + private boolean shouldProcess(final KeyListener keyListener) + { + if (client == null) + { + return true; + } + + if (!(keyListener instanceof HotkeyListener)) + { + return true; + } + + final HotkeyListener hotkeyListener = (HotkeyListener) keyListener; + + if (hotkeyListener.isEnabledOnLogin()) + { + return true; + } + + return client.getGameState() != GameState.LOGIN_SCREEN; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 9820dc645e..2dd8b030a5 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -384,6 +384,7 @@ public class ClientUI } }; + sidebarListener.setEnabledOnLogin(true); keyManager.registerKeyListener(sidebarListener); // Add mouse listener diff --git a/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java b/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java index 810f8dc386..6dd2d88aba 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java +++ b/runelite-client/src/main/java/net/runelite/client/util/HotkeyListener.java @@ -26,7 +26,9 @@ package net.runelite.client.util; import java.awt.event.KeyEvent; import java.util.function.Supplier; +import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import net.runelite.client.config.Keybind; import net.runelite.client.input.KeyListener; @@ -39,6 +41,10 @@ public abstract class HotkeyListener implements KeyListener private boolean isConsumingTyped = false; + @Setter + @Getter + private boolean isEnabledOnLogin = false; + @Override public void keyTyped(KeyEvent e) { From 76fb24caeca34b48bb010f252cdd5ce6bd46cf24 Mon Sep 17 00:00:00 2001 From: Flightkick Date: Mon, 20 Apr 2020 14:29:11 +0200 Subject: [PATCH 05/29] Properly address Grand Exchange price as 'GE' instead of 'EX' (#11317) --- .../main/java/net/runelite/client/plugins/bank/BankPlugin.java | 2 +- .../runelite/client/plugins/grounditems/GroundItemsOverlay.java | 2 +- .../runelite/client/plugins/itemprices/ItemPricesOverlay.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java index e9040d1f47..a9a6161d78 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java @@ -259,7 +259,7 @@ public class BankPlugin extends Plugin if (config.showHA()) { - strCurrentTab += "EX: "; + strCurrentTab += "GE: "; } if (config.showExact()) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java index 67b4cb8467..044ccb3002 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java @@ -243,7 +243,7 @@ public class GroundItemsOverlay extends Overlay { if (item.getGePrice() > 0) { - itemStringBuilder.append(" (EX: ") + itemStringBuilder.append(" (GE: ") .append(QuantityFormatter.quantityToStackSize(item.getGePrice())) .append(" gp)"); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java index 6b4cefddd0..e7c4f915c1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java @@ -245,7 +245,7 @@ class ItemPricesOverlay extends Overlay { if (gePrice > 0) { - itemStringBuilder.append("EX: ") + itemStringBuilder.append("GE: ") .append(QuantityFormatter.quantityToStackSize((long) gePrice * qty)) .append(" gp"); if (config.showEA() && qty > 1) From 1e06b4dc58e9097740029caf205607dcf0ad8789 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 19 Apr 2020 12:56:33 -0400 Subject: [PATCH 06/29] api: add key script event fields --- .../main/java/net/runelite/api/ScriptEvent.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java index b9fa224ea5..e97061f1f9 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java @@ -66,4 +66,18 @@ public interface ScriptEvent * Parent relative x coordinate for mouse related events */ int getMouseX(); + + /** + * Jagex typed keycode + * + * @return + */ + int getTypedKeyCode(); + + /** + * Get the typed character, ascii. + * + * @return + */ + int getTypedKeyChar(); } From 3422a7cfc8c293493e98c76cd780cdc0ba3a156a Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 19 Apr 2020 12:56:49 -0400 Subject: [PATCH 07/29] api: add widget getOnOpListener --- .../java/net/runelite/api/widgets/Widget.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java index 5a827a8ed6..d2aa872e46 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java @@ -693,15 +693,31 @@ public interface Widget void revalidateScroll(); /** - * Array of widget key listeners + * Gets the script and arguments to be ran when a menu action is clicked. + * + * @return + */ + Object[] getOnOpListener(); + + /** + * Gets the script and arguments to be ran when a key is pressed. + * + * @return */ Object[] getOnKeyListener(); /** - * Array of widget load listeners + * Gets the script and arguments to be ran when a interface is loaded. + * + * @return */ Object[] getOnLoadListener(); + /** + * Gets the script and arguments to be ran when one of the listened for inventories changes. + * + * @return + */ Object[] getOnInvTransmitListener(); /** From c1fdec9d2ed44302cbc93df4fcc7caba17bdfd9c Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 19 Apr 2020 12:57:01 -0400 Subject: [PATCH 08/29] bank plugin: add option to input bankpin with keyboard --- .../client/plugins/bank/BankConfig.java | 11 ++ .../client/plugins/bank/BankPlugin.java | 40 ++++++ .../src/main/scripts/BankpinButtonSetup.hash | 1 + .../main/scripts/BankpinButtonSetup.rs2asm | 121 ++++++++++++++++++ 4 files changed, 173 insertions(+) create mode 100644 runelite-client/src/main/scripts/BankpinButtonSetup.hash create mode 100644 runelite-client/src/main/scripts/BankpinButtonSetup.rs2asm diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java index b73869ed57..f51625bff5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankConfig.java @@ -108,4 +108,15 @@ public interface BankConfig extends Config { return true; } + + @ConfigItem( + keyName = "bankPinKeyboard", + name = "Keyboard Bankpin", + description = "Allows using the keyboard keys for bank pin input", + position = 8 + ) + default boolean bankPinKeyboard() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java index a9a6161d78..0153dbb5e2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java @@ -37,6 +37,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import static net.runelite.api.Constants.HIGH_ALCHEMY_MULTIPLIER; import net.runelite.api.InventoryID; @@ -54,9 +55,12 @@ import net.runelite.api.events.MenuShouldLeftClick; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.ScriptPostFired; import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; +import static net.runelite.api.widgets.WidgetInfo.TO_CHILD; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; @@ -71,6 +75,7 @@ import net.runelite.client.util.QuantityFormatter; description = "Modifications to the banking interface", tags = {"grand", "exchange", "high", "alchemy", "prices", "deposit"} ) +@Slf4j public class BankPlugin extends Plugin { private static final List TAB_VARBITS = ImmutableList.of( @@ -200,6 +205,41 @@ public class BankPlugin extends Plugin } break; + case "bankpinButtonSetup": + { + if (!config.bankPinKeyboard()) + { + return; + } + + final int compId = intStack[intStackSize - 2]; + final int buttonId = intStack[intStackSize - 1]; + Widget button = client.getWidget(TO_GROUP(compId), TO_CHILD(compId)); + Widget buttonRect = button.getChild(0); + + final Object[] onOpListener = buttonRect.getOnOpListener(); + buttonRect.setOnKeyListener((JavaScriptCallback) e -> + { + int typedChar = e.getTypedKeyChar() - '0'; + if (typedChar != buttonId) + { + return; + } + + log.debug("Bank pin keypress"); + + final String input = client.getVar(VarClientStr.CHATBOX_TYPED_TEXT); + clientThread.invokeLater(() -> + { + // reset chatbox input to avoid pin going to chatbox.. + client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, input); + client.runScript(ScriptID.CHAT_PROMPT_INIT); + + client.runScript(onOpListener); + }); + }); + break; + } } } diff --git a/runelite-client/src/main/scripts/BankpinButtonSetup.hash b/runelite-client/src/main/scripts/BankpinButtonSetup.hash new file mode 100644 index 0000000000..7d72d3140b --- /dev/null +++ b/runelite-client/src/main/scripts/BankpinButtonSetup.hash @@ -0,0 +1 @@ +48C575A71CD8CDDBFC8A7C0D2F8915A5EE263731213FFC23BEFFF39B6441A9FF \ No newline at end of file diff --git a/runelite-client/src/main/scripts/BankpinButtonSetup.rs2asm b/runelite-client/src/main/scripts/BankpinButtonSetup.rs2asm new file mode 100644 index 0000000000..4f783cfe53 --- /dev/null +++ b/runelite-client/src/main/scripts/BankpinButtonSetup.rs2asm @@ -0,0 +1,121 @@ +.id 679 +.int_stack_count 21 +.string_stack_count 0 +.int_var_count 21 +.string_var_count 0 + iload 0 + cc_deleteall + iload 0 + iconst 3 + iconst 0 + cc_create + iconst 64 + iconst 64 + iconst 0 + iconst 0 + cc_setsize + iconst 0 + iconst 0 + iconst 0 + iconst 0 + cc_setposition + iconst 16777215 + cc_setcolour + iconst 1 + cc_setfill + iconst 255 + cc_settrans + iload 0 + iconst 4 + iconst 1 + cc_create 1 + iconst 10 + iconst 15 + iconst 0 + iconst 0 + cc_setsize 1 + iconst 5 + iload 0 + if_getwidth + iconst 15 + sub + randominc + add + iconst 5 + iload 0 + if_getheight + iconst 20 + sub + randominc + add + iconst 0 + iconst 0 + cc_setposition 1 + iconst 1 + iconst 1 + iconst 0 + cc_settextalign 1 + iconst 496 + cc_settextfont 1 + iconst 16744192 + cc_setcolour 1 + iconst 0 + cc_settextshadow 1 + sconst "" + cc_settext 1 + iconst 683 + iconst -2147483645 + iconst -2147483643 + iload 1 + clientclock + iconst 5 + add + sconst "Iiii" + cc_setontimer 1 + iconst 684 + iconst 0 + iconst -2147483645 + iconst -2147483643 + cc_getid 1 + sconst "1Iii" + cc_setonmouserepeat + iconst 684 + iconst 1 + iconst -2147483645 + iconst -2147483643 + cc_getid 1 + sconst "1Iii" + cc_setonmouseleave + iconst 1 + sconst "Select" + cc_setop + iconst 685 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + iload 11 + iload 12 + iload 13 + iload 14 + iload 15 + iload 16 + iload 17 + iload 18 + iload 19 + iload 20 + sconst "iiiIIIIIIIIIIIIIIIII" + cc_setonop + iload 0 ; button component id + iload 1 ; 0-9 + sconst "bankpinButtonSetup" + runelite_callback + pop_int ; 0-9 + pop_int ; button component id + return From ed53771295432547344db33d7d0b350c543c811d Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 17 Apr 2020 10:35:52 -0400 Subject: [PATCH 09/29] gpu: fix one-off in model buffer selection The small compute shader will sort up to 512 faces --- .../main/java/net/runelite/client/plugins/gpu/GpuPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 83d717e60a..ae05a9682e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -1417,7 +1417,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks */ private GpuIntBuffer bufferForTriangles(int triangles) { - if (triangles < SMALL_TRIANGLE_COUNT) + if (triangles <= SMALL_TRIANGLE_COUNT) { ++smallModels; return modelBufferSmall; From 319e257af3c9da0155f1b2fb2e1b0f76ee7493e6 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 17 Apr 2020 10:37:16 -0400 Subject: [PATCH 10/29] gpu: add a couple missing Override annotations --- .../main/java/net/runelite/client/plugins/gpu/GpuPlugin.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index ae05a9682e..1ca792e821 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -742,6 +742,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks scene.setDrawDistance(drawDistance); } + @Override public void drawScenePaint(int orientation, int pitchSin, int pitchCos, int yawSin, int yawCos, int x, int y, int z, SceneTilePaint paint, int tileZ, int tileX, int tileY, int zoom, int centerX, int centerY) @@ -768,6 +769,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks } } + @Override public void drawSceneModel(int orientation, int pitchSin, int pitchCos, int yawSin, int yawCos, int x, int y, int z, SceneTileModel model, int tileZ, int tileX, int tileY, int zoom, int centerX, int centerY) From af36b46aab0ef3d7487410140c60cb91492c953b Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 17 Apr 2020 12:28:02 -0400 Subject: [PATCH 11/29] gpu plugin: remove unnecessary buffer check This buffer is initialized in initBuffers now and is never -1 --- .../main/java/net/runelite/client/plugins/gpu/GpuPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 1ca792e821..f5de69b6d8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -932,7 +932,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks // Draw 3d scene final TextureProvider textureProvider = client.getTextureProvider(); - if (textureProvider != null && this.bufferId != -1) + if (textureProvider != null) { gl.glUniformBlockBinding(glSmallComputeProgram, uniBlockSmall, 0); gl.glUniformBlockBinding(glComputeProgram, uniBlockLarge, 0); From 18ba6a54d01e41fdd6eda9b4bb48ca98fdcfadaa Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 17 Apr 2020 13:21:49 -0400 Subject: [PATCH 12/29] hsl_to_rgb: remove unnecessary check for rgb 0 The client internally uses rgb 0 for alpha pixels, and so will use rgb 1 for things which are actually black. We don't do this. --- .../net/runelite/client/plugins/gpu/hsl_to_rgb.glsl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl index 762d1ea591..600044a6ab 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/hsl_to_rgb.glsl @@ -91,10 +91,5 @@ vec3 hslToRgb(int hsl) { pow(var17, brightness) ); - // I don't think we actually need this - if (rgb == vec3(0, 0, 0)) { - rgb = vec3(0, 0, 1/255.f); - } - return rgb; } \ No newline at end of file From 3b0bb050923b12a44e28febe77cfcf3b464d3eb7 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 17 Apr 2020 14:52:41 -0400 Subject: [PATCH 13/29] gpu: small refactor of compute shaders split get_face into get_face + add_face_prio_distance, as the ssbo reading did not need to be behind the first barrier used to initialize the shared variables. The rest of this is just code style cleanups --- .../runelite/client/plugins/gpu/common.glsl | 2 +- .../net/runelite/client/plugins/gpu/comp.glsl | 30 +++-- .../client/plugins/gpu/comp_small.glsl | 14 ++- .../client/plugins/gpu/priority_render.glsl | 117 ++++++++---------- 4 files changed, 79 insertions(+), 84 deletions(-) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl index 55c3b9e6c3..37516d851e 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/common.glsl @@ -67,7 +67,7 @@ int face_distance(ivec4 vA, ivec4 vB, ivec4 vC, int cameraYaw, int cameraPitch) /* * Test if a face is visible (not backward facing) */ -bool face_visible(ivec4 vA, ivec4 vB, ivec4 vC, ivec4 position, int cameraYaw, int cameraPitch, int centerX, int centerY, int zoom) { +bool face_visible(ivec4 vA, ivec4 vB, ivec4 vC, ivec4 position) { // Move model to scene location, and account for camera offset ivec4 cameraPos = ivec4(cameraX, cameraY, cameraZ, 0); vA += position - cameraPos; diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl index 7c7f948ea3..a0ceb4935e 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp.glsl @@ -44,7 +44,7 @@ void main() { uint groupId = gl_WorkGroupID.x; uint localId = gl_LocalInvocationID.x * 4; modelinfo minfo = ol[groupId]; - int length = minfo.size; + ivec4 pos = ivec4(minfo.x, minfo.y, minfo.z, 0); if (localId == 0) { min10 = 1600; @@ -57,29 +57,35 @@ void main() { } } - memoryBarrierShared(); - barrier(); - - int prio1, dis1, prio1Adj; + int prio1, dis1; ivec4 vA1, vA2, vA3; - int prio2, dis2, prio2Adj; + int prio2, dis2; ivec4 vB1, vB2, vB3; - int prio3, dis3, prio3Adj; + int prio3, dis3; ivec4 vC1, vC2, vC3; - int prio4, dis4, prio4Adj; + int prio4, dis4; ivec4 vD1, vD2, vD3; - get_face(localId, minfo, cameraYaw, cameraPitch, centerX, centerY, zoom, prio1, dis1, vA1, vA2, vA3); - get_face(localId + 1, minfo, cameraYaw, cameraPitch, centerX, centerY, zoom, prio2, dis2, vB1, vB2, vB3); - get_face(localId + 2, minfo, cameraYaw, cameraPitch, centerX, centerY, zoom, prio3, dis3, vC1, vC2, vC3); - get_face(localId + 3, minfo, cameraYaw, cameraPitch, centerX, centerY, zoom, prio4, dis4, vD1, vD2, vD3); + get_face(localId, minfo, cameraYaw, cameraPitch, prio1, dis1, vA1, vA2, vA3); + get_face(localId + 1, minfo, cameraYaw, cameraPitch, prio2, dis2, vB1, vB2, vB3); + get_face(localId + 2, minfo, cameraYaw, cameraPitch, prio3, dis3, vC1, vC2, vC3); + get_face(localId + 3, minfo, cameraYaw, cameraPitch, prio4, dis4, vD1, vD2, vD3); memoryBarrierShared(); barrier(); + add_face_prio_distance(localId , minfo, vA1, vA2, vA3, prio1, dis1, pos); + add_face_prio_distance(localId + 1, minfo, vB1, vB2, vB3, prio2, dis2, pos); + add_face_prio_distance(localId + 2, minfo, vC1, vC2, vC3, prio3, dis3, pos); + add_face_prio_distance(localId + 3, minfo, vD1, vD2, vD3, prio4, dis4, pos); + + memoryBarrierShared(); + barrier(); + + int prio1Adj, prio2Adj, prio3Adj, prio4Adj; int idx1 = map_face_priority(localId, minfo, prio1, dis1, prio1Adj); int idx2 = map_face_priority(localId + 1, minfo, prio2, dis2, prio2Adj); int idx3 = map_face_priority(localId + 2, minfo, prio3, dis3, prio3Adj); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl index edb8375900..579dd7e1ad 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_small.glsl @@ -44,6 +44,7 @@ void main() { uint groupId = gl_WorkGroupID.x; uint localId = gl_LocalInvocationID.x; modelinfo minfo = ol[groupId]; + ivec4 pos = ivec4(minfo.x, minfo.y, minfo.z, 0); if (localId == 0) { min10 = 1600; @@ -56,17 +57,20 @@ void main() { } } - memoryBarrierShared(); - barrier(); - - int prio1, dis1, prio1Adj; + int prio1, dis1; ivec4 vA1, vA2, vA3; - get_face(localId, minfo, cameraYaw, cameraPitch, centerX, centerY, zoom, prio1, dis1, vA1, vA2, vA3); + get_face(localId, minfo, cameraYaw, cameraPitch, prio1, dis1, vA1, vA2, vA3); memoryBarrierShared(); barrier(); + add_face_prio_distance(localId, minfo, vA1, vA2, vA3, prio1, dis1, pos); + + memoryBarrierShared(); + barrier(); + + int prio1Adj; int idx1 = map_face_priority(localId, minfo, prio1, dis1, prio1Adj); memoryBarrierShared(); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/priority_render.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/priority_render.glsl index 5077182e1a..8a3d4474d2 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/priority_render.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/priority_render.glsl @@ -110,69 +110,45 @@ int count_prio_offset(int priority) { } } -void get_face(uint localId, modelinfo minfo, int cameraYaw, int cameraPitch, int centerX, int centerY, int zoom, +void get_face(uint localId, modelinfo minfo, int cameraYaw, int cameraPitch, out int prio, out int dis, out ivec4 o1, out ivec4 o2, out ivec4 o3) { - int offset = minfo.offset; int size = minfo.size; - int flags = minfo.flags; - int radius = (flags & 0x7fffffff) >> 12; - int orientation = flags & 0x7ff; - ivec4 pos = ivec4(minfo.x, minfo.y, minfo.z, 0); - - uint ssboOffset; if (localId < size) { - ssboOffset = localId; - } else { - ssboOffset = 0; - } + int offset = minfo.offset; + int flags = minfo.flags; + int radius = (flags & 0x7fffffff) >> 12; + int orientation = flags & 0x7ff; - ivec4 thisA; - ivec4 thisB; - ivec4 thisC; + ivec4 thisA; + ivec4 thisB; + ivec4 thisC; - // Grab triangle vertices from the correct buffer - if (flags < 0) { - thisA = vb[offset + ssboOffset * 3 ]; - thisB = vb[offset + ssboOffset * 3 + 1]; - thisC = vb[offset + ssboOffset * 3 + 2]; - } else { - thisA = tempvb[offset + ssboOffset * 3 ]; - thisB = tempvb[offset + ssboOffset * 3 + 1]; - thisC = tempvb[offset + ssboOffset * 3 + 2]; - } + // Grab triangle vertices from the correct buffer + if (flags < 0) { + thisA = vb[offset + localId * 3]; + thisB = vb[offset + localId * 3 + 1]; + thisC = vb[offset + localId * 3 + 2]; + } else { + thisA = tempvb[offset + localId * 3]; + thisB = tempvb[offset + localId * 3 + 1]; + thisC = tempvb[offset + localId * 3 + 2]; + } - ivec4 thisrvA; - ivec4 thisrvB; - ivec4 thisrvC; - - int thisPriority, thisDistance; - - if (localId < size) { // rotate for model orientation - thisrvA = rotate(thisA, orientation); - thisrvB = rotate(thisB, orientation); - thisrvC = rotate(thisC, orientation); + ivec4 thisrvA = rotate(thisA, orientation); + ivec4 thisrvB = rotate(thisB, orientation); + ivec4 thisrvC = rotate(thisC, orientation); // calculate distance to face - thisPriority = (thisA.w >> 16) & 0xff; // all vertices on the face have the same priority + int thisPriority = (thisA.w >> 16) & 0xff;// all vertices on the face have the same priority + int thisDistance; if (radius == 0) { thisDistance = 0; } else { thisDistance = face_distance(thisrvA, thisrvB, thisrvC, cameraYaw, cameraPitch) + radius; } - // if the face is not culled, it is calculated into priority distance averages - if (face_visible(thisrvA, thisrvB, thisrvC, pos, cameraYaw, cameraPitch, centerX, centerY, zoom)) { - atomicAdd(totalNum[thisPriority], 1); - atomicAdd(totalDistance[thisPriority], thisDistance); - - // calculate minimum distance to any face of priority 10 for positioning the 11 faces later - if (thisPriority == 10) { - atomicMin(min10, thisDistance); - } - } - o1 = thisrvA; o2 = thisrvB; o3 = thisrvC; @@ -180,19 +156,34 @@ void get_face(uint localId, modelinfo minfo, int cameraYaw, int cameraPitch, int prio = thisPriority; dis = thisDistance; } else { + o1 = ivec4(0); + o2 = ivec4(0); + o3 = ivec4(0); prio = 0; dis = 0; } } +void add_face_prio_distance(uint localId, modelinfo minfo, ivec4 thisrvA, ivec4 thisrvB, ivec4 thisrvC, int thisPriority, int thisDistance, ivec4 pos) { + if (localId < minfo.size) { + // if the face is not culled, it is calculated into priority distance averages + if (face_visible(thisrvA, thisrvB, thisrvC, pos)) { + atomicAdd(totalNum[thisPriority], 1); + atomicAdd(totalDistance[thisPriority], thisDistance); + + // calculate minimum distance to any face of priority 10 for positioning the 11 faces later + if (thisPriority == 10) { + atomicMin(min10, thisDistance); + } + } + } +} + int map_face_priority(uint localId, modelinfo minfo, int thisPriority, int thisDistance, out int prio) { int size = minfo.size; // Compute average distances for 0/2, 3/4, and 6/8 - int adjPrio; - int prioIdx; - if (localId < size) { int avg1 = 0; int avg2 = 0; @@ -210,16 +201,14 @@ int map_face_priority(uint localId, modelinfo minfo, int thisPriority, int thisD avg3 = (totalDistance[6] + totalDistance[8]) / (totalNum[6] + totalNum[8]); } - int _min10 = min10; - adjPrio = priority_map(thisPriority, thisDistance, _min10, avg1, avg2, avg3); - + int adjPrio = priority_map(thisPriority, thisDistance, min10, avg1, avg2, avg3); int prioIdx = atomicAdd(totalMappedNum[adjPrio], 1); prio = adjPrio; - return prioIdx; } + prio = 0; return 0; } @@ -237,23 +226,19 @@ void insert_dfs(uint localId, modelinfo minfo, int adjPrio, int distance, int pr void sort_and_insert(uint localId, modelinfo minfo, int thisPriority, int thisDistance, ivec4 thisrvA, ivec4 thisrvB, ivec4 thisrvC) { /* compute face distance */ int size = minfo.size; - int outOffset = minfo.idx; - int uvOffset = minfo.uvOffset; - int flags = minfo.flags; - ivec4 pos = ivec4(minfo.x, minfo.y, minfo.z, 0); - int start, end, myOffset; if (localId < size) { + int outOffset = minfo.idx; + int uvOffset = minfo.uvOffset; + int flags = minfo.flags; + ivec4 pos = ivec4(minfo.x, minfo.y, minfo.z, 0); + const int priorityOffset = count_prio_offset(thisPriority); const int numOfPriority = totalMappedNum[thisPriority]; - start = priorityOffset; // index of first face with this priority - end = priorityOffset + numOfPriority; // index of last face with this priority - myOffset = priorityOffset; - } else { - start = end = myOffset = 0; - } + int start = priorityOffset; // index of first face with this priority + int end = priorityOffset + numOfPriority; // index of last face with this priority + int myOffset = priorityOffset; - if (localId < size) { // we only have to order faces against others of the same priority // calculate position this face will be in for (int i = start; i < end; ++i) { From fe1772031a9ae13bb19f2174ab307ebfb249f323 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 20 Apr 2020 10:22:27 -0400 Subject: [PATCH 14/29] api: add drawFace callback --- .../src/main/java/net/runelite/api/hooks/DrawCallbacks.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java b/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java index b76caecd44..989cc45dd2 100644 --- a/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java +++ b/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java @@ -24,6 +24,7 @@ */ package net.runelite.api.hooks; +import net.runelite.api.Model; import net.runelite.api.Renderable; import net.runelite.api.SceneTileModel; import net.runelite.api.SceneTilePaint; @@ -44,6 +45,8 @@ public interface DrawCallbacks void draw(); + boolean drawFace(Model model, int face); + void drawScene(int cameraX, int cameraY, int cameraZ, int cameraPitch, int cameraYaw, int plane); void animate(Texture texture, int diff); From 035c119f8551268b878c853e23d57bb4baebeff6 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 20 Apr 2020 10:30:50 -0400 Subject: [PATCH 15/29] gpu: add option to disable compute shaders This still gives a noticible performance boost over software rendering as the rasterizing is entirely done on GPU --- .../client/plugins/gpu/GpuPlugin.java | 204 +++++++++++++----- .../client/plugins/gpu/GpuPluginConfig.java | 11 + .../client/plugins/gpu/SceneUploader.java | 90 ++++++-- 3 files changed, 233 insertions(+), 72 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index f5de69b6d8..d7fc8f56d0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.gpu; +import com.google.common.primitives.Ints; import com.google.inject.Provides; import com.jogamp.nativewindow.awt.AWTGraphicsConfiguration; import com.jogamp.nativewindow.awt.JAWTWindow; @@ -74,7 +75,17 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginInstantiationException; import net.runelite.client.plugins.PluginManager; -import static net.runelite.client.plugins.gpu.GLUtil.*; +import static net.runelite.client.plugins.gpu.GLUtil.glDeleteBuffer; +import static net.runelite.client.plugins.gpu.GLUtil.glDeleteFrameBuffer; +import static net.runelite.client.plugins.gpu.GLUtil.glDeleteRenderbuffers; +import static net.runelite.client.plugins.gpu.GLUtil.glDeleteTexture; +import static net.runelite.client.plugins.gpu.GLUtil.glDeleteVertexArrays; +import static net.runelite.client.plugins.gpu.GLUtil.glGenBuffers; +import static net.runelite.client.plugins.gpu.GLUtil.glGenFrameBuffer; +import static net.runelite.client.plugins.gpu.GLUtil.glGenRenderbuffer; +import static net.runelite.client.plugins.gpu.GLUtil.glGenTexture; +import static net.runelite.client.plugins.gpu.GLUtil.glGenVertexArrays; +import static net.runelite.client.plugins.gpu.GLUtil.glGetInteger; import net.runelite.client.plugins.gpu.config.AntiAliasingMode; import net.runelite.client.plugins.gpu.config.UIScalingMode; import net.runelite.client.plugins.gpu.template.Template; @@ -94,6 +105,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private static final int MAX_TRIANGLE = 4096; private static final int SMALL_TRIANGLE_COUNT = 512; private static final int FLAG_SCENE_BUFFER = Integer.MIN_VALUE; + private static final int DEFAULT_DISTANCE = 25; static final int MAX_DISTANCE = 90; static final int MAX_FOG_DEPTH = 100; @@ -118,6 +130,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks @Inject private PluginManager pluginManager; + private boolean useComputeShaders; + private Canvas canvas; private JAWTWindow jawtWindow; private GL4 gl; @@ -231,6 +245,10 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private int centerY; private int yaw; private int pitch; + // fields for non-compute draw + private boolean drawingModel; + private int modelX, modelY, modelZ; + private int modelOrientation; // Uniforms private int uniUseFog; @@ -259,6 +277,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks { bufferId = uvBufferId = uniformBufferId = tmpBufferId = tmpUvBufferId = tmpModelBufferId = tmpModelBufferSmallId = tmpModelBufferUnorderedId = tmpOutBufferId = tmpOutUvBufferId = -1; unorderedModels = smallModels = largeModels = 0; + drawingModel = false; canvas = client.getCanvas(); @@ -267,6 +286,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks return false; } + useComputeShaders = config.useComputeShaders(); + canvas.setIgnoreRepaint(true); vertexBuffer = new GpuIntBuffer(); @@ -461,11 +482,15 @@ public class GpuPlugin extends Plugin implements DrawCallbacks template.addInclude(GpuPlugin.class); glProgram = PROGRAM.compile(gl, template); - glComputeProgram = COMPUTE_PROGRAM.compile(gl, template); - glSmallComputeProgram = SMALL_COMPUTE_PROGRAM.compile(gl, template); - glUnorderedComputeProgram = UNORDERED_COMPUTE_PROGRAM.compile(gl, template); glUiProgram = UI_PROGRAM.compile(gl, template); + if (useComputeShaders) + { + glComputeProgram = COMPUTE_PROGRAM.compile(gl, template); + glSmallComputeProgram = SMALL_COMPUTE_PROGRAM.compile(gl, template); + glUnorderedComputeProgram = UNORDERED_COMPUTE_PROGRAM.compile(gl, template); + } + initUniforms(); } @@ -738,8 +763,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks pitch = client.getCameraPitch(); final Scene scene = client.getScene(); - final int drawDistance = Math.max(0, Math.min(MAX_DISTANCE, config.drawDistance())); - scene.setDrawDistance(drawDistance); + scene.setDrawDistance(getDrawDistance()); } @Override @@ -747,7 +771,17 @@ public class GpuPlugin extends Plugin implements DrawCallbacks SceneTilePaint paint, int tileZ, int tileX, int tileY, int zoom, int centerX, int centerY) { - if (paint.getBufferLen() > 0) + if (!useComputeShaders) + { + targetBufferOffset += sceneUploader.upload(paint, + tileZ, tileX, tileY, + vertexBuffer, uvBuffer, + Perspective.LOCAL_TILE_SIZE * tileX, + Perspective.LOCAL_TILE_SIZE * tileY, + true + ); + } + else if (paint.getBufferLen() > 0) { x = tileX * Perspective.LOCAL_TILE_SIZE; y = 0; @@ -774,7 +808,14 @@ public class GpuPlugin extends Plugin implements DrawCallbacks SceneTileModel model, int tileZ, int tileX, int tileY, int zoom, int centerX, int centerY) { - if (model.getBufferLen() > 0) + if (!useComputeShaders) + { + targetBufferOffset += sceneUploader.upload(model, + tileX, tileY, + vertexBuffer, uvBuffer, + tileX << Perspective.LOCAL_COORD_BITS, tileY << Perspective.LOCAL_COORD_BITS, true); + } + else if (model.getBufferLen() > 0) { x = tileX * Perspective.LOCAL_TILE_SIZE; y = 0; @@ -913,7 +954,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks null, gl.GL_STREAM_DRAW); - // UBO + // UBO. Only the first 32 bytes get modified here, the rest is the constant sin/cos table. gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, uniformBufferId); uniformBuffer.clear(); uniformBuffer @@ -930,60 +971,63 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glBufferSubData(gl.GL_UNIFORM_BUFFER, 0, uniformBuffer.limit() * Integer.BYTES, uniformBuffer); gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, 0); + gl.glBindBufferBase(gl.GL_UNIFORM_BUFFER, 0, uniformBufferId); + // Draw 3d scene final TextureProvider textureProvider = client.getTextureProvider(); if (textureProvider != null) { - gl.glUniformBlockBinding(glSmallComputeProgram, uniBlockSmall, 0); - gl.glUniformBlockBinding(glComputeProgram, uniBlockLarge, 0); + if (useComputeShaders) + { + gl.glUniformBlockBinding(glSmallComputeProgram, uniBlockSmall, 0); + gl.glUniformBlockBinding(glComputeProgram, uniBlockLarge, 0); - gl.glBindBufferBase(gl.GL_UNIFORM_BUFFER, 0, uniformBufferId); + /* + * Compute is split into two separate programs 'small' and 'large' to + * save on GPU resources. Small will sort <= 512 faces, large will do <= 4096. + */ - /* - * Compute is split into two separate programs 'small' and 'large' to - * save on GPU resources. Small will sort <= 512 faces, large will do <= 4096. - */ + // unordered + gl.glUseProgram(glUnorderedComputeProgram); - // unordered - gl.glUseProgram(glUnorderedComputeProgram); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferUnorderedId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferUnorderedId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); + gl.glDispatchCompute(unorderedModels, 1, 1); - gl.glDispatchCompute(unorderedModels, 1, 1); + // small + gl.glUseProgram(glSmallComputeProgram); - // small - gl.glUseProgram(glSmallComputeProgram); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferSmallId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferSmallId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); + gl.glDispatchCompute(smallModels, 1, 1); - gl.glDispatchCompute(smallModels, 1, 1); + // large + gl.glUseProgram(glComputeProgram); - // large - gl.glUseProgram(glComputeProgram); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); + gl.glDispatchCompute(largeModels, 1, 1); - gl.glDispatchCompute(largeModels, 1, 1); - - gl.glMemoryBarrier(gl.GL_SHADER_STORAGE_BARRIER_BIT); + gl.glMemoryBarrier(gl.GL_SHADER_STORAGE_BARRIER_BIT); + } if (textureArrayId == -1) { @@ -1023,7 +1067,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glUseProgram(glProgram); - final int drawDistance = Math.max(0, Math.min(MAX_DISTANCE, config.drawDistance())); + final int drawDistance = getDrawDistance(); final int fogDepth = config.fogDepth(); gl.glUniform1i(uniUseFog, fogDepth > 0 ? 1 : 0); gl.glUniform4f(uniFogColor, (sky >> 16 & 0xFF) / 255f, (sky >> 8 & 0xFF) / 255f, (sky & 0xFF) / 255f, 1f); @@ -1061,15 +1105,17 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glEnable(gl.GL_BLEND); gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA); - // Draw output of compute shaders + // Draw buffers gl.glBindVertexArray(vaoHandle); + // When using compute shaders, draw using the output buffer of the compute. Otherwise + // only use the temporary buffers, which will contain the full scene. gl.glEnableVertexAttribArray(0); - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpOutBufferId); + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, useComputeShaders ? tmpOutBufferId : tmpBufferId); gl.glVertexAttribIPointer(0, 4, gl.GL_INT, 0, 0); gl.glEnableVertexAttribArray(1); - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpOutUvBufferId); + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, useComputeShaders ? tmpOutUvBufferId : tmpUvBufferId); gl.glVertexAttribPointer(1, 4, gl.GL_FLOAT, false, 0, 0); gl.glDrawArrays(gl.GL_TRIANGLES, 0, targetBufferOffset); @@ -1236,7 +1282,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged) { - if (gameStateChanged.getGameState() != GameState.LOGGED_IN) + if (!useComputeShaders || gameStateChanged.getGameState() != GameState.LOGGED_IN) { return; } @@ -1328,8 +1374,38 @@ public class GpuPlugin extends Plugin implements DrawCallbacks @Override public void draw(Renderable renderable, int orientation, int pitchSin, int pitchCos, int yawSin, int yawCos, int x, int y, int z, long hash) { + if (!useComputeShaders) + { + Model model = renderable instanceof Model ? (Model) renderable : renderable.getModel(); + if (model != null) + { + model.calculateBoundsCylinder(); + model.calculateExtreme(orientation); + + if (!isVisible(model, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash)) + { + return; + } + + client.checkClickbox(model, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); + + modelX = x + client.getCameraX2(); + modelY = y + client.getCameraY2(); + modelZ = z + client.getCameraZ2(); + modelOrientation = orientation; + int triangleCount = model.getTrianglesCount(); + vertexBuffer.ensureCapacity(12 * triangleCount); + uvBuffer.ensureCapacity(12 * triangleCount); + + drawingModel = true; + + renderable.draw(orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); + + drawingModel = false; + } + } // Model may be in the scene buffer - if (renderable instanceof Model && ((Model) renderable).getSceneId() == sceneUploader.sceneId) + else if (renderable instanceof Model && ((Model) renderable).getSceneId() == sceneUploader.sceneId) { Model model = (Model) renderable; @@ -1386,7 +1462,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks int len = 0; for (int i = 0; i < faces; ++i) { - len += sceneUploader.pushFace(model, i, vertexBuffer, uvBuffer); + len += sceneUploader.pushFace(model, i, false, vertexBuffer, uvBuffer, 0, 0, 0, 0); } GpuIntBuffer b = bufferForTriangles(faces); @@ -1411,6 +1487,18 @@ public class GpuPlugin extends Plugin implements DrawCallbacks } } + @Override + public boolean drawFace(Model model, int face) + { + if (!drawingModel) + { + return false; + } + + targetBufferOffset += sceneUploader.pushFace(model, face, true, vertexBuffer, uvBuffer, modelX, modelY, modelZ, modelOrientation); + return true; + } + /** * returns the correct buffer based on triangle count and updates model count * @@ -1445,4 +1533,10 @@ public class GpuPlugin extends Plugin implements DrawCallbacks getScaledValue(t.getScaleX(), width), getScaledValue(t.getScaleY(), height)); } + + private int getDrawDistance() + { + final int limit = useComputeShaders ? MAX_DISTANCE : DEFAULT_DISTANCE; + return Ints.constrainToRange(config.drawDistance(), 0, limit); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java index bc37634f41..29396dfb11 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java @@ -96,4 +96,15 @@ public interface GpuPluginConfig extends Config { return 0; } + + @ConfigItem( + keyName = "useComputeShaders", + name = "Compute Shaders", + description = "Offloads face sorting to GPU, enabling extended draw distance. Requires plugin restart.", + position = 6 + ) + default boolean useComputeShaders() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java index 445f6c60d1..dc11fbc846 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java @@ -176,7 +176,10 @@ class SceneUploader sceneTilePaint.setUvBufferOffset(-1); } Point tilePoint = tile.getSceneLocation(); - int len = upload(sceneTilePaint, tile.getRenderLevel(), tilePoint.getX(), tilePoint.getY(), vertexBuffer, uvBuffer); + int len = upload(sceneTilePaint, + tile.getRenderLevel(), tilePoint.getX(), tilePoint.getY(), + vertexBuffer, uvBuffer, + 0, 0, false); sceneTilePaint.setBufferLen(len); offset += len; if (sceneTilePaint.getTexture() != -1) @@ -198,7 +201,10 @@ class SceneUploader sceneTileModel.setUvBufferOffset(-1); } Point tilePoint = tile.getSceneLocation(); - int len = upload(sceneTileModel, tilePoint.getX(), tilePoint.getY(), vertexBuffer, uvBuffer); + int len = upload(sceneTileModel, + tilePoint.getX(), tilePoint.getY(), + vertexBuffer, uvBuffer, + 0, 0, false); sceneTileModel.setBufferLen(len); offset += len; if (sceneTileModel.getTriangleTextureId() != null) @@ -265,12 +271,13 @@ class SceneUploader } } - private int upload(SceneTilePaint tile, int tileZ, int tileX, int tileY, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer) + int upload(SceneTilePaint tile, int tileZ, int tileX, int tileY, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer, + int offsetX, int offsetY, boolean padUvs) { final int[][][] tileHeights = client.getTileHeights(); - final int localX = 0; - final int localY = 0; + final int localX = offsetX; + final int localY = offsetY; int swHeight = tileHeights[tileZ][tileX][tileY]; int seHeight = tileHeights[tileZ][tileX + 1][tileY]; @@ -322,7 +329,7 @@ class SceneUploader vertexBuffer.put(vertexCx, vertexCz, vertexCy, c2); vertexBuffer.put(vertexBx, vertexBz, vertexBy, c4); - if (tile.getTexture() != -1) + if (padUvs || tile.getTexture() != -1) { float tex = tile.getTexture() + 1f; uvBuffer.put(tex, 1.0f, 1.0f, 0f); @@ -337,7 +344,8 @@ class SceneUploader return 6; } - private int upload(SceneTileModel sceneTileModel, int tileX, int tileY, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer) + int upload(SceneTileModel sceneTileModel, int tileX, int tileY, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer, + int offsetX, int offsetY, boolean padUvs) { final int[] faceX = sceneTileModel.getFaceX(); final int[] faceY = sceneTileModel.getFaceY(); @@ -379,6 +387,7 @@ class SceneUploader cnt += 3; + // vertexes are stored in scene local, convert to tile local int vertexXA = vertexX[triangleA] - baseX; int vertexZA = vertexZ[triangleA] - baseY; @@ -388,13 +397,13 @@ class SceneUploader int vertexXC = vertexX[triangleC] - baseX; int vertexZC = vertexZ[triangleC] - baseY; - vertexBuffer.put(vertexXA, vertexY[triangleA], vertexZA, colorA); - vertexBuffer.put(vertexXB, vertexY[triangleB], vertexZB, colorB); - vertexBuffer.put(vertexXC, vertexY[triangleC], vertexZC, colorC); + vertexBuffer.put(vertexXA + offsetX, vertexY[triangleA], vertexZA + offsetY, colorA); + vertexBuffer.put(vertexXB + offsetX, vertexY[triangleB], vertexZB + offsetY, colorB); + vertexBuffer.put(vertexXC + offsetX, vertexY[triangleC], vertexZC + offsetY, colorC); - if (triangleTextures != null) + if (padUvs || triangleTextures != null) { - if (triangleTextures[i] != -1) + if (triangleTextures != null && triangleTextures[i] != -1) { float tex = triangleTextures[i] + 1f; uvBuffer.put(tex, vertexXA / 128f, vertexZA / 128f, 0f); @@ -438,7 +447,7 @@ class SceneUploader int len = 0; for (int i = 0; i < triangleCount; ++i) { - len += pushFace(model, i, vertexBuffer, uvBuffer); + len += pushFace(model, i, false, vertexBuffer, uvBuffer, 0, 0, 0, 0); } offset += len; @@ -448,7 +457,8 @@ class SceneUploader } } - int pushFace(Model model, int face, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer) + int pushFace(Model model, int face, boolean padUvs, GpuIntBuffer vertexBuffer, GpuFloatBuffer uvBuffer, + int xOffset, int yOffset, int zOffset, int orientation) { final int[] vertexX = model.getVerticesX(); final int[] vertexY = model.getVerticesY(); @@ -485,6 +495,13 @@ class SceneUploader priority = (facePriorities[face] & 0xff) << 16; } + int sin = 0, cos = 0; + if (orientation != 0) + { + sin = Perspective.SINE[orientation]; + cos = Perspective.COSINE[orientation]; + } + if (color3 == -1) { color2 = color3 = color1; @@ -495,7 +512,7 @@ class SceneUploader vertexBuffer.put(0, 0, 0, 0); vertexBuffer.put(0, 0, 0, 0); - if (faceTextures != null) + if (padUvs || faceTextures != null) { uvBuffer.put(0, 0, 0, 0f); uvBuffer.put(0, 0, 0, 0f); @@ -510,26 +527,65 @@ class SceneUploader b = vertexY[triangleA]; c = vertexZ[triangleA]; + if (orientation != 0) + { + int x = c * sin + a * cos >> 16; + int z = c * cos - a * sin >> 16; + + a = x; + c = z; + } + + a += xOffset; + b += yOffset; + c += zOffset; + vertexBuffer.put(a, b, c, alpha | priority | color1); a = vertexX[triangleB]; b = vertexY[triangleB]; c = vertexZ[triangleB]; + if (orientation != 0) + { + int x = c * sin + a * cos >> 16; + int z = c * cos - a * sin >> 16; + + a = x; + c = z; + } + + a += xOffset; + b += yOffset; + c += zOffset; + vertexBuffer.put(a, b, c, alpha | priority | color2); a = vertexX[triangleC]; b = vertexY[triangleC]; c = vertexZ[triangleC]; + if (orientation != 0) + { + int x = c * sin + a * cos >> 16; + int z = c * cos - a * sin >> 16; + + a = x; + c = z; + } + + a += xOffset; + b += yOffset; + c += zOffset; + vertexBuffer.put(a, b, c, alpha | priority | color3); float[][] u = model.getFaceTextureUCoordinates(); float[][] v = model.getFaceTextureVCoordinates(); float[] uf, vf; - if (faceTextures != null) + if (padUvs || faceTextures != null) { - if (u != null && v != null && (uf = u[face]) != null && (vf = v[face]) != null) + if (faceTextures != null && u != null && v != null && (uf = u[face]) != null && (vf = v[face]) != null) { float texture = faceTextures[face] + 1f; uvBuffer.put(texture, uf[0], vf[0], 0f); From 8f12c2846d45e9354e82d792ea1b06dc160de39e Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 21 Apr 2020 17:16:32 -0400 Subject: [PATCH 16/29] api: add useful utility methods to itemcontainer --- .../java/net/runelite/api/ItemContainer.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/ItemContainer.java b/runelite-api/src/main/java/net/runelite/api/ItemContainer.java index e547ca03f8..81e2074106 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemContainer.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemContainer.java @@ -24,6 +24,9 @@ */ package net.runelite.api; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + /** * Represents an inventory that contains items. */ @@ -34,5 +37,34 @@ public interface ItemContainer extends Node * * @return the items held */ + @Nonnull Item[] getItems(); + + /** + * Gets an item from the container at the given slot. + * + * @param slot + * @return the item + * @see Item + */ + @Nullable + Item getItem(int slot); + + /** + * Check if this item container contains the given item + * + * @param itemId + * @return + * @see ItemID + */ + boolean contains(int itemId); + + /** + * Counts how many of an item this item container contains + * + * @param itemId + * @return + * @see ItemID + */ + int count(int itemId); } From 6f0a2c9069d189dd1a10bce2576683cac18ae2b5 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 21 Apr 2020 17:47:33 -0400 Subject: [PATCH 17/29] client: update itemcontainer api usage Use new api methods if appropriate --- .../BlastFurnaceClickBoxOverlay.java | 13 +-------- .../plugins/cluescrolls/ClueScrollPlugin.java | 9 +++--- .../clues/ThreeStepCrypticClue.java | 25 ++++++----------- .../customcursor/CustomCursorPlugin.java | 9 ++---- .../client/plugins/fishing/FishingPlugin.java | 4 --- .../plugins/itemcharges/ItemChargePlugin.java | 4 +-- .../plugins/itemprices/ItemPricesOverlay.java | 5 ++-- .../plugins/itemstats/ItemStatOverlay.java | 10 ++----- .../plugins/itemstats/ItemStatPlugin.java | 13 ++------- .../itemstats/potions/PrayerPotion.java | 28 ++++++++++--------- .../itemstats/special/CastleWarsBandage.java | 6 ++-- .../plugins/roguesden/RoguesDenPlugin.java | 16 +++-------- .../plugins/runecraft/RunecraftPlugin.java | 18 ++++++++++-- .../plugins/runenergy/RunEnergyPlugin.java | 5 ---- .../specialcounter/SpecialCounterPlugin.java | 8 ++---- .../client/plugins/timers/TimersPlugin.java | 10 +------ .../itemcharges/ItemChargePluginTest.java | 7 +---- .../itemstats/ItemStatOverlayTest.java | 2 -- .../SpecialCounterPluginTest.java | 4 +-- 19 files changed, 66 insertions(+), 130 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java index ea09b36e63..43fc8b2c69 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceClickBoxOverlay.java @@ -30,10 +30,8 @@ import java.awt.Graphics2D; import java.awt.Shape; import javax.inject.Inject; import net.runelite.api.Client; -import net.runelite.api.EquipmentInventorySlot; import net.runelite.api.GameObject; import net.runelite.api.InventoryID; -import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.ItemID; import net.runelite.api.Point; @@ -89,16 +87,7 @@ class BlastFurnaceClickBoxOverlay extends Overlay return false; } - Item[] items = equipmentContainer.getItems(); - int idx = EquipmentInventorySlot.GLOVES.getSlotIdx(); - - if (items == null || idx >= items.length) - { - return false; - } - - Item glove = items[idx]; - return glove != null && glove.getId() == ItemID.ICE_GLOVES; + return equipmentContainer.contains(ItemID.ICE_GLOVES); } private void renderObject(GameObject object, Graphics2D graphics, Color color) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 6087d683ee..1cca0adfb3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -36,12 +36,10 @@ import java.awt.Rectangle; import java.awt.geom.Area; import java.awt.image.BufferedImage; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; -import java.util.stream.Stream; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.inject.Inject; @@ -56,6 +54,7 @@ import net.runelite.api.GameState; import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemComposition; +import net.runelite.api.ItemContainer; import net.runelite.api.ItemID; import net.runelite.api.MenuAction; import net.runelite.api.NPC; @@ -321,10 +320,10 @@ public class ClueScrollPlugin extends Plugin // Check if item was removed from inventory if (clue != null && clueItemId != null) { - final Stream items = Arrays.stream(event.getItemContainer().getItems()); + ItemContainer itemContainer = event.getItemContainer(); // Check if clue was removed from inventory - if (items.noneMatch(item -> itemManager.getItemComposition(item.getId()).getId() == clueItemId)) + if (!itemContainer.contains(clueItemId)) { resetClue(true); } @@ -333,7 +332,7 @@ public class ClueScrollPlugin extends Plugin // if three step clue check for clue scroll pieces if (clue instanceof ThreeStepCrypticClue) { - if (((ThreeStepCrypticClue) clue).update(client, event, itemManager)) + if (((ThreeStepCrypticClue) clue).update(event.getContainerId(), event.getItemContainer())) { worldMapPointsSet = false; npcsToMark.clear(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java index 995c6b90e0..52c78d94c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ThreeStepCrypticClue.java @@ -28,21 +28,16 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.util.AbstractMap; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.stream.Stream; import lombok.Getter; import lombok.RequiredArgsConstructor; -import net.runelite.api.Client; import net.runelite.api.InventoryID; -import net.runelite.api.Item; +import net.runelite.api.ItemContainer; import static net.runelite.api.ItemID.TORN_CLUE_SCROLL_PART_1; import static net.runelite.api.ItemID.TORN_CLUE_SCROLL_PART_2; import static net.runelite.api.ItemID.TORN_CLUE_SCROLL_PART_3; import net.runelite.api.coords.WorldPoint; -import net.runelite.api.events.ItemContainerChanged; -import net.runelite.client.game.ItemManager; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import net.runelite.client.ui.overlay.components.LineComponent; @@ -122,26 +117,22 @@ public class ThreeStepCrypticClue extends ClueScroll implements TextClueScroll, } } - public boolean update(Client client, final ItemContainerChanged event, ItemManager itemManager) + public boolean update(int containerId, final ItemContainer itemContainer) { - if (event.getItemContainer() == client.getItemContainer(InventoryID.INVENTORY)) + if (containerId == InventoryID.INVENTORY.getId()) { - boolean success = false; - success |= checkForPart(event, itemManager, TORN_CLUE_SCROLL_PART_1, 0); - success |= checkForPart(event, itemManager, TORN_CLUE_SCROLL_PART_2, 1); - success |= checkForPart(event, itemManager, TORN_CLUE_SCROLL_PART_3, 2); - return success; + return checkForPart(itemContainer, TORN_CLUE_SCROLL_PART_1, 0) || + checkForPart(itemContainer, TORN_CLUE_SCROLL_PART_2, 1) || + checkForPart(itemContainer, TORN_CLUE_SCROLL_PART_3, 2); } return false; } - private boolean checkForPart(final ItemContainerChanged event, ItemManager itemManager, int clueScrollPart, int index) + private boolean checkForPart(final ItemContainer itemContainer, int clueScrollPart, int index) { - final Stream items = Arrays.stream(event.getItemContainer().getItems()); - // If we have the part then that step is done - if (items.anyMatch(item -> itemManager.getItemComposition(item.getId()).getId() == clueScrollPart)) + if (itemContainer.contains(clueScrollPart)) { final Map.Entry entry = clueSteps.get(index); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java index e1472ca26d..dfe3f23d60 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java @@ -31,10 +31,10 @@ import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; -import net.runelite.api.EquipmentInventorySlot; import net.runelite.api.events.ItemContainerChanged; import net.runelite.client.RuneLite; import net.runelite.client.callback.ClientThread; @@ -147,16 +147,13 @@ public class CustomCursorPlugin extends Plugin return; } - final Item[] items = equipment.getItems(); - final int weaponIdx = EquipmentInventorySlot.WEAPON.getSlotIdx(); - - if (items == null || weaponIdx >= items.length) + Item weapon = equipment.getItem(EquipmentInventorySlot.WEAPON.getSlotIdx()); + if (weapon == null) { clientUI.resetCursor(); return; } - final Item weapon = items[EquipmentInventorySlot.WEAPON.getSlotIdx()]; final BufferedImage image = itemManager.getImage(weapon.getId()); if (weapon.getQuantity() > 0) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java index 91e8242b0a..27a7bd3f32 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java @@ -251,10 +251,6 @@ public class FishingPlugin extends Plugin for (Item item : itemContainer.getItems()) { - if (item == null) - { - continue; - } switch (item.getId()) { case ItemID.DRAGON_HARPOON: diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java index d99e6fdaa2..b4714f096d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java @@ -320,9 +320,7 @@ public class ItemChargePlugin extends Plugin return; } - Item[] items = equipment.getItems(); - if (EquipmentInventorySlot.RING.getSlotIdx() < items.length - && items[EquipmentInventorySlot.RING.getSlotIdx()].getId() == ItemID.RING_OF_FORGING) + if (equipment.contains(ItemID.RING_OF_FORGING)) { int charges = Ints.constrainToRange(config.ringOfForging() - 1, 0, MAX_RING_OF_FORGING_CHARGES); updateRingOfForgingCharges(charges); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java index e7c4f915c1..a972ae1f6e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java @@ -176,11 +176,10 @@ class ItemPricesOverlay extends Overlay } // Find the item in the container to get stack size - final Item[] items = container.getItems(); final int index = menuEntry.getParam0(); - if (index < items.length) + final Item item = container.getItem(index); + if (item != null) { - final Item item = items[index]; return getItemStackValueText(item); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java index 38b8a11c17..c574c4dbb2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java @@ -245,16 +245,12 @@ public class ItemStatOverlay extends Overlay ItemContainer c = client.getItemContainer(InventoryID.EQUIPMENT); if (s.isEquipable() && currentEquipment != null && c != null) { - final Item[] items = c.getItems(); final int slot = currentEquipment.getSlot(); - if (slot != -1 && slot < items.length) + final Item item = c.getItem(slot); + if (item != null) { - final Item item = items[slot]; - if (item != null) - { - other = itemManager.getItemStats(item.getId(), false); - } + other = itemManager.getItemStats(item.getId(), false); } if (other == null && slot == EquipmentInventorySlot.WEAPON.getSlotIdx()) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java index 2ee90497df..62271135d9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatPlugin.java @@ -38,14 +38,12 @@ import net.runelite.api.Client; import net.runelite.api.Constants; import net.runelite.api.FontID; import net.runelite.api.InventoryID; -import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.ItemID; import net.runelite.api.ScriptID; import net.runelite.api.SpriteID; import net.runelite.api.VarPlayer; import net.runelite.api.Varbits; -import net.runelite.client.events.ConfigChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.ScriptPostFired; import net.runelite.api.events.VarbitChanged; @@ -57,6 +55,7 @@ import net.runelite.api.widgets.WidgetType; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -407,15 +406,7 @@ public class ItemStatPlugin extends Plugin return 0; } - for (final Item item : inventory.getItems()) - { - if (item.getId() == ItemID.COINS_995) - { - return item.getQuantity(); - } - } - - return 0; + return inventory.count(ItemID.COINS_995); } private Widget getInventoryContainer() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java index 4c0bfff6a1..a0d17db24b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/potions/PrayerPotion.java @@ -25,6 +25,7 @@ package net.runelite.client.plugins.itemstats.potions; import net.runelite.api.Client; +import net.runelite.api.EquipmentInventorySlot; import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; @@ -42,8 +43,8 @@ public class PrayerPotion extends StatBoost this.delta = delta; } - private static final int RING_SLOT = 12; - private static final int CAPE_SLOT = 1; + private static final int RING_SLOT = EquipmentInventorySlot.RING.getSlotIdx(); + private static final int CAPE_SLOT = EquipmentInventorySlot.CAPE.getSlotIdx(); @Override public int heals(Client client) @@ -53,18 +54,19 @@ public class PrayerPotion extends StatBoost ItemContainer equipContainer = client.getItemContainer(InventoryID.EQUIPMENT); if (equipContainer != null) { - Item[] equip = equipContainer.getItems(); + Item cape = equipContainer.getItem(CAPE_SLOT); + Item ring = equipContainer.getItem(RING_SLOT); - hasHolyWrench |= equip.length > RING_SLOT && equip[RING_SLOT].getId() == ItemID.RING_OF_THE_GODS_I; - if (equip.length > CAPE_SLOT) + hasHolyWrench = ring != null && ring.getId() == ItemID.RING_OF_THE_GODS_I; + if (cape != null) { - int cape = equip[CAPE_SLOT].getId(); - hasHolyWrench |= cape == ItemID.PRAYER_CAPE; - hasHolyWrench |= cape == ItemID.PRAYER_CAPET; - hasHolyWrench |= cape == ItemID.PRAYER_CAPE_10643; // No idea what this is - hasHolyWrench |= cape == ItemID.MAX_CAPE; - hasHolyWrench |= cape == ItemID.MAX_CAPE_13282; // Or these - hasHolyWrench |= cape == ItemID.MAX_CAPE_13342; + int capeId = cape.getId(); + hasHolyWrench |= capeId == ItemID.PRAYER_CAPE; + hasHolyWrench |= capeId == ItemID.PRAYER_CAPET; + hasHolyWrench |= capeId == ItemID.PRAYER_CAPE_10643; // No idea what this is + hasHolyWrench |= capeId == ItemID.MAX_CAPE; + hasHolyWrench |= capeId == ItemID.MAX_CAPE_13282; // Or these + hasHolyWrench |= capeId == ItemID.MAX_CAPE_13342; } } if (!hasHolyWrench) @@ -75,7 +77,7 @@ public class PrayerPotion extends StatBoost for (Item itemStack : invContainer.getItems()) { int item = itemStack.getId(); - hasHolyWrench |= item == ItemID.HOLY_WRENCH; + hasHolyWrench = item == ItemID.HOLY_WRENCH; hasHolyWrench |= item == ItemID.PRAYER_CAPE; hasHolyWrench |= item == ItemID.PRAYER_CAPET; hasHolyWrench |= item == ItemID.PRAYER_CAPE_10643; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java index e66f9ed709..7da51c034a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/special/CastleWarsBandage.java @@ -73,11 +73,11 @@ public class CastleWarsBandage implements Effect return false; } - final Item[] equipment = equipmentContainer.getItems(); + final Item gloves = equipmentContainer.getItem(EquipmentInventorySlot.GLOVES.getSlotIdx()); - if (equipment.length > EquipmentInventorySlot.GLOVES.getSlotIdx()) + if (gloves != null) { - return BRACELETS.contains(equipment[EquipmentInventorySlot.GLOVES.getSlotIdx()].getId()); + return BRACELETS.contains(gloves.getId()); } return false; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java index 9a3908f7d3..1a1d415d06 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/roguesden/RoguesDenPlugin.java @@ -31,7 +31,7 @@ import lombok.Getter; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.InventoryID; -import net.runelite.api.Item; +import net.runelite.api.ItemContainer; import net.runelite.api.ItemID; import net.runelite.api.Tile; import net.runelite.api.TileObject; @@ -91,21 +91,13 @@ public class RoguesDenPlugin extends Plugin @Subscribe public void onItemContainerChanged(ItemContainerChanged event) { - if (event.getItemContainer() != client.getItemContainer(InventoryID.INVENTORY)) + if (event.getContainerId() != InventoryID.INVENTORY.getId()) { return; } - for (Item item : event.getItemContainer().getItems()) - { - if (item.getId() == ItemID.MYSTIC_JEWEL) - { - hasGem = true; - return; - } - } - - hasGem = false; + ItemContainer itemContainer = event.getItemContainer(); + hasGem = itemContainer.contains(ItemID.MYSTIC_JEWEL); } @Subscribe diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java index 56fb09a390..64d73b8a18 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java @@ -43,7 +43,6 @@ import net.runelite.api.ItemID; import net.runelite.api.NPC; import net.runelite.api.NpcID; import net.runelite.api.events.ChatMessage; -import net.runelite.client.events.ConfigChanged; import net.runelite.api.events.DecorativeObjectDespawned; import net.runelite.api.events.DecorativeObjectSpawned; import net.runelite.api.events.GameStateChanged; @@ -53,9 +52,22 @@ import net.runelite.api.events.NpcSpawned; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import static net.runelite.client.plugins.runecraft.AbyssRifts.*; +import static net.runelite.client.plugins.runecraft.AbyssRifts.AIR_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.BLOOD_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.BODY_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.CHAOS_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.COSMIC_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.DEATH_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.EARTH_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.FIRE_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.LAW_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.MIND_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.NATURE_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.SOUL_RIFT; +import static net.runelite.client.plugins.runecraft.AbyssRifts.WATER_RIFT; import net.runelite.client.ui.overlay.OverlayManager; @PluginDescriptor( @@ -190,7 +202,7 @@ public class RunecraftPlugin extends Plugin @Subscribe public void onItemContainerChanged(ItemContainerChanged event) { - if (event.getItemContainer() != client.getItemContainer(InventoryID.INVENTORY)) + if (event.getContainerId() != InventoryID.INVENTORY.getId()) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java index bf911c2f35..ad7a888b50 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runenergy/RunEnergyPlugin.java @@ -234,11 +234,6 @@ public class RunEnergyPlugin extends Plugin final Item[] items = equipment.getItems(); - if (items == null) - { - return 0; - } - int boost = 0; for (final GracefulEquipmentSlot slot : GracefulEquipmentSlot.values()) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java index c33384f7fb..c6862d0745 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java @@ -280,16 +280,12 @@ public class SpecialCounterPlugin extends Plugin return null; } - Item[] items = equipment.getItems(); - int weaponIdx = EquipmentInventorySlot.WEAPON.getSlotIdx(); - - if (items == null || weaponIdx >= items.length) + Item weapon = equipment.getItem(EquipmentInventorySlot.WEAPON.getSlotIdx()); + if (weapon == null) { return null; } - Item weapon = items[weaponIdx]; - for (SpecialWeapon specialWeapon : SpecialWeapon.values()) { if (specialWeapon.getItemID() == weapon.getId()) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java index fac58b3487..a28a3fac5f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java @@ -798,16 +798,8 @@ public class TimersPlugin extends Plugin ItemContainer container = itemContainerChanged.getItemContainer(); if (container == client.getItemContainer(InventoryID.EQUIPMENT)) { - Item[] items = container.getItems(); - int weaponIdx = EquipmentInventorySlot.WEAPON.getSlotIdx(); + Item weapon = container.getItem(EquipmentInventorySlot.WEAPON.getSlotIdx()); - if (items == null || weaponIdx >= items.length) - { - removeGameTimer(STAFF_OF_THE_DEAD); - return; - } - - Item weapon = items[weaponIdx]; if (weapon == null) { removeGameTimer(STAFF_OF_THE_DEAD); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java index a769cc3784..c5eea10375 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java @@ -31,9 +31,7 @@ import com.google.inject.testing.fieldbinder.BoundFieldModule; import java.util.concurrent.ScheduledExecutorService; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; -import net.runelite.api.EquipmentInventorySlot; import net.runelite.api.InventoryID; -import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.ItemID; import net.runelite.api.events.ChatMessage; @@ -134,10 +132,7 @@ public class ItemChargePluginTest // Create equipment inventory with ring of forging ItemContainer equipmentItemContainer = mock(ItemContainer.class); when(client.getItemContainer(eq(InventoryID.EQUIPMENT))).thenReturn(equipmentItemContainer); - Item[] items = new Item[EquipmentInventorySlot.RING.getSlotIdx() + 1]; - when(equipmentItemContainer.getItems()).thenReturn(items); - Item ring = new Item(ItemID.RING_OF_FORGING, 1); - items[EquipmentInventorySlot.RING.getSlotIdx()] = ring; + when(equipmentItemContainer.contains(ItemID.RING_OF_FORGING)).thenReturn(true); // Run message chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", USED_RING_OF_FORGING, "", 0); itemChargePlugin.onChatMessage(chatMessage); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java index b3826df992..9b96f02643 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java @@ -32,7 +32,6 @@ import java.awt.Color; import net.runelite.api.Client; import net.runelite.api.EquipmentInventorySlot; import net.runelite.api.InventoryID; -import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.client.game.ItemManager; import net.runelite.client.util.Text; @@ -129,7 +128,6 @@ public class ItemStatOverlayTest { // Empty equipment (fully unarmed) final ItemContainer equipment = mock(ItemContainer.class); - when(equipment.getItems()).thenReturn(new Item[0]); when(client.getItemContainer(InventoryID.EQUIPMENT)).thenReturn(equipment); String tooltip; diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/specialcounter/SpecialCounterPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/specialcounter/SpecialCounterPluginTest.java index c090e7e865..e25f75b6cf 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/specialcounter/SpecialCounterPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/specialcounter/SpecialCounterPluginTest.java @@ -86,9 +86,7 @@ public class SpecialCounterPluginTest // Set up spec weapon ItemContainer equipment = mock(ItemContainer.class); - Item[] items = new Item[EquipmentInventorySlot.WEAPON.getSlotIdx() + 1]; - items[EquipmentInventorySlot.WEAPON.getSlotIdx()] = new Item(ItemID.BANDOS_GODSWORD, 1); - when(equipment.getItems()).thenReturn(items); + when(equipment.getItem(EquipmentInventorySlot.WEAPON.getSlotIdx())).thenReturn(new Item(ItemID.BANDOS_GODSWORD, 1)); when(client.getItemContainer(InventoryID.EQUIPMENT)).thenReturn(equipment); // Set up special attack energy From a626e97176a872425a9209ca03eaa0325e277c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petter=20S=C3=A6ther=20Moen?= Date: Wed, 22 Apr 2020 12:20:47 -0400 Subject: [PATCH 18/29] agility plugin: add laps per hour to lap counter overlay Co-authored-by: Adam --- .../client/plugins/agility/AgilityConfig.java | 31 +++++++++++----- .../plugins/agility/AgilitySession.java | 37 ++++++++++++++++++- .../plugins/agility/LapCounterOverlay.java | 8 ++++ 3 files changed, 64 insertions(+), 12 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java index a2302ad05b..c75b77b068 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java @@ -78,11 +78,22 @@ public interface AgilityConfig extends Config return true; } + @ConfigItem( + keyName = "lapsPerHour", + name = "Show Laps Per Hour", + description = "Shows how many laps you can expect to complete per hour.", + position = 4 + ) + default boolean lapsPerHour() + { + return true; + } + @ConfigItem( keyName = "overlayColor", name = "Overlay Color", description = "Color of Agility overlay", - position = 4 + position = 5 ) default Color getOverlayColor() { @@ -93,7 +104,7 @@ public interface AgilityConfig extends Config keyName = "highlightMarks", name = "Highlight Marks of Grace", description = "Enable/disable the highlighting of retrievable Marks of Grace", - position = 5 + position = 6 ) default boolean highlightMarks() { @@ -104,7 +115,7 @@ public interface AgilityConfig extends Config keyName = "markHighlight", name = "Mark Highlight Color", description = "Color of highlighted Marks of Grace", - position = 6 + position = 7 ) default Color getMarkColor() { @@ -115,7 +126,7 @@ public interface AgilityConfig extends Config keyName = "highlightShortcuts", name = "Highlight Agility Shortcuts", description = "Enable/disable the highlighting of Agility shortcuts", - position = 7 + position = 8 ) default boolean highlightShortcuts() { @@ -126,7 +137,7 @@ public interface AgilityConfig extends Config keyName = "trapOverlay", name = "Show Trap Overlay", description = "Enable/disable the highlighting of traps on Agility courses", - position = 8 + position = 9 ) default boolean showTrapOverlay() { @@ -137,7 +148,7 @@ public interface AgilityConfig extends Config keyName = "trapHighlight", name = "Trap Overlay Color", description = "Color of Agility trap overlay", - position = 9 + position = 10 ) default Color getTrapColor() { @@ -148,7 +159,7 @@ public interface AgilityConfig extends Config keyName = "agilityArenaNotifier", name = "Agility Arena notifier", description = "Notify on ticket location change in Agility Arena", - position = 10 + position = 11 ) default boolean notifyAgilityArena() { @@ -159,7 +170,7 @@ public interface AgilityConfig extends Config keyName = "agilityArenaTimer", name = "Agility Arena timer", description = "Configures whether Agility Arena timer is displayed", - position = 11 + position = 12 ) default boolean showAgilityArenaTimer() { @@ -170,7 +181,7 @@ public interface AgilityConfig extends Config keyName = "highlightStick", name = "Highlight Stick", description = "Highlight the retrievable stick in the Werewolf Agility Course", - position = 12 + position = 13 ) default boolean highlightStick() { @@ -181,7 +192,7 @@ public interface AgilityConfig extends Config keyName = "stickHighlightColor", name = "Stick Highlight Color", description = "Color of highlighted stick", - position = 13 + position = 14 ) default Color stickHighlightColor() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java index c42b8fc250..ea466a1c5b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilitySession.java @@ -24,12 +24,14 @@ */ package net.runelite.client.plugins.agility; -import java.time.Instant; +import com.google.common.collect.EvictingQueue; import lombok.Getter; import lombok.Setter; import net.runelite.api.Client; import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; +import java.time.Duration; +import java.time.Instant; @Getter @Setter @@ -39,6 +41,8 @@ class AgilitySession private Instant lastLapCompleted; private int totalLaps; private int lapsTillGoal; + private final EvictingQueue lastLapTimes = EvictingQueue.create(10); + private int lapsPerHour; AgilitySession(Courses course) { @@ -47,7 +51,8 @@ class AgilitySession void incrementLapCount(Client client, XpTrackerService xpTrackerService) { - lastLapCompleted = Instant.now(); + calculateLapsPerHour(); + ++totalLaps; final int currentExp = client.getSkillExperience(Skill.AGILITY); @@ -64,9 +69,37 @@ class AgilitySession lapsTillGoal = goalRemainingXp > 0 ? (int) Math.ceil(goalRemainingXp / courseTotalExp) : 0; } + void calculateLapsPerHour() + { + Instant now = Instant.now(); + + if (lastLapCompleted != null) + { + Duration timeSinceLastLap = Duration.between(lastLapCompleted, now); + + if (!timeSinceLastLap.isNegative()) + { + lastLapTimes.add(timeSinceLastLap); + + Duration sum = Duration.ZERO; + for (Duration lapTime : lastLapTimes) + { + sum = sum.plus(lapTime); + } + + Duration averageLapTime = sum.dividedBy(lastLapTimes.size()); + lapsPerHour = (int) (Duration.ofHours(1).toMillis() / averageLapTime.toMillis()); + } + } + + lastLapCompleted = now; + } + void resetLapCount() { totalLaps = 0; lapsTillGoal = 0; + lastLapTimes.clear(); + lapsPerHour = 0; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java index b6bdd132d0..15ae21223d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java @@ -89,6 +89,14 @@ class LapCounterOverlay extends OverlayPanel .build()); } + if (config.lapsPerHour() && session.getLapsPerHour() > 0) + { + panelComponent.getChildren().add(LineComponent.builder() + .left("Laps per hour:") + .right(Integer.toString(session.getLapsPerHour())) + .build()); + } + return super.render(graphics); } } From 03511a4e0051d2ebf6cc627e1e54b2d4c18c8a17 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sat, 11 Apr 2020 10:32:27 -0600 Subject: [PATCH 19/29] interfacestyles: update widget bounds before every render this reverts commit abaf45092b9f20d1068698da3ed726db6b35bce2 We need to run this every frame because the client can update the widget bounds cache without calling [proc,toplevel_resize]. This is easily reproducible by resizing the client in fixed mode, which causes the the tli to be revalidated, but because its in fixed mode it doesn't run the resize listener because the bounds don't actually change. We use BeforeRender instead of ClientTick because ClientTick is posted before cs2s are evaluated each tick, so if [proc,toplevel_resize] (or any other cs2 that can touch these widgets) is called the widget would be in the vanilla position for the next frame. --- .../src/main/java/net/runelite/api/ScriptID.java | 6 ------ .../interfacestyles/InterfaceStylesPlugin.java | 12 ++++-------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java index 5cc976e3d2..8aaff6d5ef 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -234,12 +234,6 @@ public final class ScriptID @ScriptArguments(integer = 3) public static final int QUESTLIST_PROGRESS_LIST_SHOW = 1354; - /** - * Procedure called when the toplevel interface is resized - */ - @ScriptArguments(integer = 2) - public static final int TOPLEVEL_RESIZE = 909; - /** * Called when the friends list is updated *
    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 bb22274aa0..a93206f1eb 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 @@ -33,20 +33,19 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.HealthBar; -import net.runelite.api.ScriptID; import net.runelite.api.SpriteID; import net.runelite.api.SpritePixels; import net.runelite.api.events.BeforeMenuRender; +import net.runelite.api.events.BeforeRender; +import net.runelite.client.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.PostHealthBar; import net.runelite.api.events.ScriptCallbackEvent; -import net.runelite.api.events.ScriptPostFired; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.events.ConfigChanged; import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -120,12 +119,9 @@ public class InterfaceStylesPlugin extends Plugin } @Subscribe - public void onScriptPostFired(ScriptPostFired scriptPostFired) + public void onBeforeRender(BeforeRender event) { - if (scriptPostFired.getScriptId() == ScriptID.TOPLEVEL_RESIZE) - { - adjustWidgetDimensions(); - } + adjustWidgetDimensions(); } @Subscribe From 188a9414ff99bce4b51b3c234ade754d673cb289 Mon Sep 17 00:00:00 2001 From: Trevor Date: Sat, 11 Apr 2020 18:57:27 -0400 Subject: [PATCH 20/29] hitsplats: add missing multihitsplat varients --- .../main/java/net/runelite/api/Hitsplat.java | 72 +++++++++++++++++++ .../plugins/dpscounter/DpsCounterPlugin.java | 59 +++++++-------- .../specialcounter/SpecialCounterPlugin.java | 2 +- 3 files changed, 103 insertions(+), 30 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Hitsplat.java b/runelite-api/src/main/java/net/runelite/api/Hitsplat.java index c44bf2dd1b..9d51a03918 100644 --- a/runelite-api/src/main/java/net/runelite/api/Hitsplat.java +++ b/runelite-api/src/main/java/net/runelite/api/Hitsplat.java @@ -52,6 +52,38 @@ public class Hitsplat * Taking damage by others (red). */ DAMAGE_OTHER, + /** + * Taking damage by me (cyan). + */ + DAMAGE_ME_CYAN, + /** + * Taking damage by others (cyan). + */ + DAMAGE_OTHER_CYAN, + /** + * Taking damage by me (orange). + */ + DAMAGE_ME_ORANGE, + /** + * Taking damage by others (orange). + */ + DAMAGE_OTHER_ORANGE, + /** + * Taking damage by me (yellow). + */ + DAMAGE_ME_YELLOW, + /** + * Taking damage by others (yellow). + */ + DAMAGE_OTHER_YELLOW, + /** + * Taking damage by me (white). + */ + DAMAGE_ME_WHITE, + /** + * Taking damage by others (white/black). + */ + DAMAGE_OTHER_WHITE, /** * Damage from poison (green). */ @@ -88,6 +120,14 @@ public class Hitsplat case 4: return DISEASE; case 5: return VENOM; case 6: return HEAL; + case 18: return DAMAGE_ME_CYAN; + case 19: return DAMAGE_OTHER_CYAN; + case 20: return DAMAGE_ME_ORANGE; + case 21: return DAMAGE_OTHER_ORANGE; + case 22: return DAMAGE_ME_YELLOW; + case 23: return DAMAGE_OTHER_YELLOW; + case 24: return DAMAGE_ME_WHITE; + case 25: return DAMAGE_OTHER_WHITE; } return null; } @@ -117,4 +157,36 @@ public class Hitsplat this.amount = amount; this.disappearsOnGameCycle = disappearsOnGameCycle; } + + public boolean isMine() + { + switch (this.getHitsplatType()) + { + case BLOCK_ME: + case DAMAGE_ME: + case DAMAGE_ME_CYAN: + case DAMAGE_ME_YELLOW: + case DAMAGE_ME_ORANGE: + case DAMAGE_ME_WHITE: + return true; + default: + return false; + } + } + + public boolean isOthers() + { + switch (this.getHitsplatType()) + { + case BLOCK_OTHER: + case DAMAGE_OTHER: + case DAMAGE_OTHER_CYAN: + case DAMAGE_OTHER_YELLOW: + case DAMAGE_OTHER_ORANGE: + case DAMAGE_OTHER_WHITE: + return true; + default: + return false; + } + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java index 186c52d561..fcdec4bfa0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java @@ -163,38 +163,39 @@ public class DpsCounterPlugin extends Plugin Hitsplat hitsplat = hitsplatApplied.getHitsplat(); - switch (hitsplat.getHitsplatType()) + if (hitsplat.isMine()) { - case DAMAGE_ME: - int hit = hitsplat.getAmount(); - // Update local member - PartyMember localMember = partyService.getLocalMember(); - // If not in a party, user local player name - final String name = localMember == null ? player.getName() : localMember.getName(); - DpsMember dpsMember = members.computeIfAbsent(name, DpsMember::new); - dpsMember.addDamage(hit); + int hit = hitsplat.getAmount(); + // Update local member + PartyMember localMember = partyService.getLocalMember(); + // If not in a party, user local player name + final String name = localMember == null ? player.getName() : localMember.getName(); + DpsMember dpsMember = members.computeIfAbsent(name, DpsMember::new); + dpsMember.addDamage(hit); - // broadcast damage - if (localMember != null) - { - final DpsUpdate specialCounterUpdate = new DpsUpdate(hit); - specialCounterUpdate.setMemberId(localMember.getMemberId()); - wsClient.send(specialCounterUpdate); - } - // apply to total - break; - case DAMAGE_OTHER: - final int npcId = ((NPC) actor).getId(); - boolean isBoss = BOSSES.contains(npcId); - if (actor != player.getInteracting() && !isBoss) - { - // only track damage to npcs we are attacking, or is a nearby common boss - return; - } - // apply to total - break; - default: + // broadcast damage + if (localMember != null) + { + final DpsUpdate specialCounterUpdate = new DpsUpdate(hit); + specialCounterUpdate.setMemberId(localMember.getMemberId()); + wsClient.send(specialCounterUpdate); + } + // apply to total + } + else if (hitsplat.isOthers()) + { + final int npcId = ((NPC) actor).getId(); + boolean isBoss = BOSSES.contains(npcId); + if (actor != player.getInteracting() && !isBoss) + { + // only track damage to npcs we are attacking, or is a nearby common boss return; + } + // apply to total + } + else + { + return; } unpause(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java index c6862d0745..af4f5ec5b9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java @@ -168,7 +168,7 @@ public class SpecialCounterPlugin extends Plugin Hitsplat hitsplat = hitsplatApplied.getHitsplat(); Hitsplat.HitsplatType hitsplatType = hitsplat.getHitsplatType(); // Ignore all hitsplats other than mine - if ((hitsplatType != Hitsplat.HitsplatType.DAMAGE_ME && hitsplatType != Hitsplat.HitsplatType.BLOCK_ME) || target == client.getLocalPlayer()) + if (!hitsplat.isMine() || target == client.getLocalPlayer()) { return; } From 15b3d394464edd014dc96d664a402607b606c61b Mon Sep 17 00:00:00 2001 From: Mitchell Kovacs <33374903+Mitchell-Kovacs@users.noreply.github.com> Date: Wed, 22 Apr 2020 17:48:39 -0400 Subject: [PATCH 21/29] timers plugin: add option to loop timers --- .../plugins/timetracking/clocks/ClockManager.java | 5 +++++ .../timetracking/clocks/ClockTabPanel.java | 10 ++++++++++ .../client/plugins/timetracking/clocks/Timer.java | 3 +++ .../plugins/timetracking/clocks/TimerPanel.java | 12 ++++++++++++ .../client/plugins/timetracking/loop_icon.png | Bin 0 -> 375 bytes .../plugins/timetracking/loop_selected_icon.png | Bin 0 -> 388 bytes 6 files changed, 30 insertions(+) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_icon.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_selected_icon.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java index 1f01e1c3c1..720c5633e9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java @@ -122,6 +122,11 @@ public class ClockManager { notifier.notify("[" + timer.getName() + "] has finished counting down."); } + + if (timer.isLoop()) + { + timer.start(); + } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java index cd1b1a5a2e..e3ce75f631 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java @@ -57,6 +57,10 @@ public class ClockTabPanel extends TabContentPanel static final ImageIcon RESET_ICON_HOVER; static final ImageIcon START_ICON; static final ImageIcon START_ICON_HOVER; + static final ImageIcon LOOP_ICON; + static final ImageIcon LOOP_ICON_HOVER; + static final ImageIcon LOOP_SELECTED_ICON; + static final ImageIcon LOOP_SELECTED_ICON_HOVER; private static final ImageIcon ADD_ICON; private static final ImageIcon ADD_ICON_HOVER; @@ -73,6 +77,8 @@ public class ClockTabPanel extends TabContentPanel BufferedImage resetIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "reset_icon.png"); BufferedImage startIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "start_icon.png"); BufferedImage addIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "add_icon.png"); + BufferedImage loopIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "loop_icon.png"); + BufferedImage loopSelectedIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "loop_selected_icon.png"); DELETE_ICON = new ImageIcon(deleteIcon); DELETE_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(deleteIcon, -80)); @@ -86,6 +92,10 @@ public class ClockTabPanel extends TabContentPanel START_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(startIcon, -80)); ADD_ICON = new ImageIcon(addIcon); ADD_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(addIcon, 0.53f)); + LOOP_ICON = new ImageIcon(loopIcon); + LOOP_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(loopIcon, -80)); + LOOP_SELECTED_ICON = new ImageIcon(loopSelectedIcon); + LOOP_SELECTED_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(loopSelectedIcon, -80)); } ClockTabPanel(ClockManager clockManager) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java index 48adf0e768..de21af9e5e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java @@ -45,6 +45,9 @@ class Timer extends Clock @Getter(AccessLevel.NONE) private transient boolean warning; + // whether this timer should loop or not + private boolean loop; + Timer(String name, long duration) { super(name); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java index af65253480..abe3778428 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.timetracking.clocks; import java.awt.Color; import java.awt.Dimension; import javax.swing.JButton; +import javax.swing.JToggleButton; import net.runelite.client.ui.ColorScheme; import net.runelite.client.util.SwingUtil; @@ -38,6 +39,17 @@ class TimerPanel extends ClockPanel { super(clockManager, timer, "timer", true); + JToggleButton loopButton = new JToggleButton(ClockTabPanel.LOOP_ICON); + loopButton.setRolloverIcon(ClockTabPanel.LOOP_ICON_HOVER); + loopButton.setSelectedIcon(ClockTabPanel.LOOP_SELECTED_ICON); + loopButton.setRolloverSelectedIcon(ClockTabPanel.LOOP_SELECTED_ICON_HOVER); + SwingUtil.removeButtonDecorations(loopButton); + loopButton.setPreferredSize(new Dimension(16, 14)); + loopButton.setToolTipText("Loop timer"); + loopButton.addActionListener(e -> timer.setLoop(!timer.isLoop())); + loopButton.setSelected(timer.isLoop()); + leftActions.add(loopButton); + JButton deleteButton = new JButton(ClockTabPanel.DELETE_ICON); SwingUtil.removeButtonDecorations(deleteButton); deleteButton.setRolloverIcon(ClockTabPanel.DELETE_ICON_HOVER); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..112b3bf4892eb4030bee8964094b6df9abd64606 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8!1) zj({-ZRBb+KprB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt*3XT^vI+ zCf*I)=yfDOU`}ml*B+Ma+`XGW$#1#jC&==bq5jDqF8c%TELuM6z&r~J^5*~SFO6osKC&$ zdp=V{yTCVO-u>SyU-^0-s2qmrMvGLw=hIa3O=sPuzRCSx&6d13NJ67>0=ZzJa&3s zG~QiTL9ZnoFG-o~L~iOs@HL@s;bjp9}}QW3Rt`-~Y@0GcV`MskL03 SUnc~}U&3=E8no-U3d z8WXQx+^^kQD02Mc_3wr3rT89L3{Vw_ZWeWmIBr19juFWt^{8@6%m9gkra^9kSx_386Y20GFc=qNT zQH|8HjjeSP(&XwGT@=rTT=oh5b1?Ir@4nB|gO;s67`;(!rEAv9eOIe$w=9y@=RNk& zcBw#)TNzVrMsAW#$DYMf5givV{hV{Ut#@Kq-=E7BLN>g2EVK5#3hh5RBilb}&YZI= f{yxq99~tlbA}ZNo=d=015M%Ik^>bP0l+XkKzOJE+ literal 0 HcmV?d00001 From c746af58c302494408039e5608f67927f538ab0c Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 23 Apr 2020 10:32:22 +0000 Subject: [PATCH 22/29] Update Item IDs to 2020-04-23-rev182 --- .../main/java/net/runelite/api/ItemID.java | 26 ++++++++++++++++ .../java/net/runelite/api/NullItemID.java | 30 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/ItemID.java b/runelite-api/src/main/java/net/runelite/api/ItemID.java index f97f06ad6c..003ee5ed8f 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemID.java @@ -11432,5 +11432,31 @@ public final class ItemID public static final int TANGLEROOT_24559 = 24559; public static final int TANGLEROOT_24561 = 24561; public static final int TANGLEROOT_24563 = 24563; + public static final int ANTIQUE_EMBLEM_TIER_1 = 24565; + public static final int ANTIQUE_EMBLEM_TIER_2 = 24567; + public static final int ANTIQUE_EMBLEM_TIER_3 = 24569; + public static final int ANTIQUE_EMBLEM_TIER_4 = 24571; + public static final int ANTIQUE_EMBLEM_TIER_5 = 24573; + public static final int ANTIQUE_EMBLEM_TIER_6 = 24575; + public static final int ANTIQUE_EMBLEM_TIER_7 = 24577; + public static final int ANTIQUE_EMBLEM_TIER_8 = 24579; + public static final int ANTIQUE_EMBLEM_TIER_9 = 24581; + public static final int ANTIQUE_EMBLEM_TIER_10 = 24583; + public static final int LOOTING_BAG_NOTE = 24585; + public static final int RUNE_POUCH_NOTE = 24587; + public static final int BLIGHTED_MANTA_RAY = 24589; + public static final int BLIGHTED_ANGLERFISH = 24592; + public static final int BLIGHTED_KARAMBWAN = 24595; + public static final int BLIGHTED_SUPER_RESTORE4 = 24598; + public static final int BLIGHTED_SUPER_RESTORE3 = 24601; + public static final int BLIGHTED_SUPER_RESTORE2 = 24603; + public static final int BLIGHTED_SUPER_RESTORE1 = 24605; + public static final int BLIGHTED_ICE_BARRAGE_SACK = 24607; + public static final int BLIGHTED_BIND_SACK = 24609; + public static final int BLIGHTED_SNARE_SACK = 24611; + public static final int BLIGHTED_ENTANGLE_SACK = 24613; + public static final int BLIGHTED_TELEBLOCK_SACK = 24615; + public static final int VESTAS_BLIGHTED_LONGSWORD = 24617; + public static final int VESTAS_LONGSWORD_INACTIVE = 24619; /* This file is automatically generated. Do not edit. */ } diff --git a/runelite-api/src/main/java/net/runelite/api/NullItemID.java b/runelite-api/src/main/java/net/runelite/api/NullItemID.java index 2f5a108d49..f72aec5012 100644 --- a/runelite-api/src/main/java/net/runelite/api/NullItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/NullItemID.java @@ -12922,5 +12922,35 @@ public final class NullItemID public static final int NULL_24560 = 24560; public static final int NULL_24562 = 24562; public static final int NULL_24564 = 24564; + public static final int NULL_24566 = 24566; + public static final int NULL_24568 = 24568; + public static final int NULL_24570 = 24570; + public static final int NULL_24572 = 24572; + public static final int NULL_24574 = 24574; + public static final int NULL_24576 = 24576; + public static final int NULL_24578 = 24578; + public static final int NULL_24580 = 24580; + public static final int NULL_24582 = 24582; + public static final int NULL_24584 = 24584; + public static final int NULL_24586 = 24586; + public static final int NULL_24588 = 24588; + public static final int NULL_24590 = 24590; + public static final int NULL_24591 = 24591; + public static final int NULL_24593 = 24593; + public static final int NULL_24594 = 24594; + public static final int NULL_24596 = 24596; + public static final int NULL_24597 = 24597; + public static final int NULL_24599 = 24599; + public static final int NULL_24600 = 24600; + public static final int NULL_24602 = 24602; + public static final int NULL_24604 = 24604; + public static final int NULL_24606 = 24606; + public static final int NULL_24608 = 24608; + public static final int NULL_24610 = 24610; + public static final int NULL_24612 = 24612; + public static final int NULL_24614 = 24614; + public static final int NULL_24616 = 24616; + public static final int NULL_24618 = 24618; + public static final int NULL_24620 = 24620; /* This file is automatically generated. Do not edit. */ } From eba42992359536a213f58ae0739ad0b74049588b Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 23 Apr 2020 10:32:22 +0000 Subject: [PATCH 23/29] Update Item variations to 2020-04-23-rev182 --- .../src/main/resources/item_variations.json | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/resources/item_variations.json b/runelite-client/src/main/resources/item_variations.json index db3bcb9480..a520c584e7 100644 --- a/runelite-client/src/main/resources/item_variations.json +++ b/runelite-client/src/main/resources/item_variations.json @@ -9336,7 +9336,8 @@ ], "vestas longsword": [ 22613, - 23615 + 23615, + 24619 ], "statiuss warhammer": [ 22622, @@ -9730,5 +9731,23 @@ 24469, 24472, 24475 + ], + "antique emblem": [ + 24565, + 24567, + 24569, + 24571, + 24573, + 24575, + 24577, + 24579, + 24581, + 24583 + ], + "blighted super restore": [ + 24598, + 24601, + 24603, + 24605 ] } \ No newline at end of file From 2cbe76c2e84c8771ab9281e3352ff1a64e923726 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 23 Apr 2020 10:32:23 +0000 Subject: [PATCH 24/29] Update NPC IDs to 2020-04-23-rev182 --- runelite-api/src/main/java/net/runelite/api/NpcID.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-api/src/main/java/net/runelite/api/NpcID.java b/runelite-api/src/main/java/net/runelite/api/NpcID.java index ffc9db2501..6034a14c22 100644 --- a/runelite-api/src/main/java/net/runelite/api/NpcID.java +++ b/runelite-api/src/main/java/net/runelite/api/NpcID.java @@ -5993,6 +5993,7 @@ public final class NpcID public static final int SISTER_SCAROPHIA = 6590; public static final int LAVA_DRAGON = 6593; public static final int ENT = 6594; + public static final int PRIFDDINAS_GUARD = 6595; public static final int ZOMBIE_6596 = 6596; public static final int ZOMBIE_6597 = 6597; public static final int ZOMBIE_6598 = 6598; From cfef584e4327e146db1cc3d4a2e411a8fc8bfce3 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 23 Apr 2020 10:32:27 +0000 Subject: [PATCH 25/29] Update Scripts to 2020-04-23-rev182 --- .../src/main/scripts/PvpWidgetBuilder.hash | 2 +- .../src/main/scripts/PvpWidgetBuilder.rs2asm | 72 ++++++++++--------- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/runelite-client/src/main/scripts/PvpWidgetBuilder.hash b/runelite-client/src/main/scripts/PvpWidgetBuilder.hash index 144ac0aea6..3e4a898362 100644 --- a/runelite-client/src/main/scripts/PvpWidgetBuilder.hash +++ b/runelite-client/src/main/scripts/PvpWidgetBuilder.hash @@ -1 +1 @@ -08461B2A942D4D792EEB9D9BCCEB9B11256AD8B217B1EAF1BDBA71314F816D6F \ No newline at end of file +1DC252B93DF0D948329C4EAD151FA9406A17D3CF2C5C3EC0317BF4DCD1B3811A \ No newline at end of file diff --git a/runelite-client/src/main/scripts/PvpWidgetBuilder.rs2asm b/runelite-client/src/main/scripts/PvpWidgetBuilder.rs2asm index ba8bf2ec2f..4e85d37ecd 100644 --- a/runelite-client/src/main/scripts/PvpWidgetBuilder.rs2asm +++ b/runelite-client/src/main/scripts/PvpWidgetBuilder.rs2asm @@ -10,7 +10,7 @@ iload 2 iconst 1 if_icmpeq LABEL8 - jump LABEL74 + jump LABEL80 LABEL8: get_varp 1676 iconst 4 @@ -39,81 +39,87 @@ LABEL27: iload 0 if_settext LABEL30: - jump LABEL73 + jump LABEL79 LABEL31: get_varbit 4965 iconst 0 if_icmpgt LABEL35 - jump LABEL39 + jump LABEL45 LABEL35: sconst "Protection" iload 0 if_settext - jump LABEL73 -LABEL39: + iconst 0 + iconst 13 + iconst 1 + iconst 2 + iload 0 + if_setposition + jump LABEL79 +LABEL45: iload 1 iconst 0 - if_icmpgt LABEL43 - jump LABEL54 -LABEL43: + if_icmpgt LABEL49 + jump LABEL60 +LABEL49: get_varbit 5954 iconst 1 - if_icmpeq LABEL47 - jump LABEL54 -LABEL47: + if_icmpeq LABEL53 + jump LABEL60 +LABEL53: sconst "Level: " iload 1 tostring join_string 2 iload 0 if_settext - jump LABEL73 -LABEL54: + jump LABEL79 +LABEL60: get_varc_int 78 iconst 1 - if_icmpeq LABEL58 - jump LABEL62 -LABEL58: + if_icmpeq LABEL64 + jump LABEL68 +LABEL64: sconst "Guarded" iload 0 if_settext - jump LABEL73 -LABEL62: + jump LABEL79 +LABEL68: get_varc_int 78 iconst 2 - if_icmpeq LABEL66 - jump LABEL70 -LABEL66: + if_icmpeq LABEL72 + jump LABEL76 +LABEL72: sconst "No PvP" iload 0 if_settext - jump LABEL73 -LABEL70: + jump LABEL79 +LABEL76: sconst "Deadman" iload 0 if_settext -LABEL73: - jump LABEL88 -LABEL74: +LABEL79: + jump LABEL94 +LABEL80: iload 1 iconst 0 - if_icmpgt LABEL78 - jump LABEL85 -LABEL78: + if_icmpgt LABEL84 + jump LABEL91 +LABEL84: sconst "Level: " iload 1 tostring join_string 2 iload 0 if_settext - jump LABEL88 -LABEL85: + jump LABEL94 +LABEL91: sconst "" iload 0 if_settext -LABEL88: +LABEL94: iload 1 invoke 387 sconst "wildernessWidgetTextSet" ; set callback name - runelite_callback ; invoke callback + runelite_callback ; invoke callback return From c3c2a12c5658307180891cc259724b0c44a72ee4 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Thu, 23 Apr 2020 04:46:52 -0600 Subject: [PATCH 26/29] WidgetOverlay: remove bounty hunter info widget This doesn't layout properly anymore --- .../main/java/net/runelite/client/ui/overlay/WidgetOverlay.java | 1 - 1 file changed, 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java index ac9fc12518..4ab0ebe31c 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -52,7 +52,6 @@ public class WidgetOverlay extends Overlay .put(WidgetInfo.PEST_CONTROL_BOAT_INFO, OverlayPosition.TOP_LEFT) .put(WidgetInfo.PEST_CONTROL_INFO, OverlayPosition.TOP_LEFT) .put(WidgetInfo.ZEAH_MESS_HALL_COOKING_DISPLAY, OverlayPosition.TOP_LEFT) - .put(WidgetInfo.PVP_BOUNTY_HUNTER_INFO, OverlayPosition.TOP_RIGHT) .put(WidgetInfo.PVP_KILLDEATH_COUNTER, OverlayPosition.TOP_LEFT) .put(WidgetInfo.SKOTIZO_CONTAINER, OverlayPosition.TOP_LEFT) .put(WidgetInfo.KOUREND_FAVOUR_OVERLAY, OverlayPosition.TOP_CENTER) From 522da94369a8bf31a6f6f2064af61746bfa32768 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Thu, 23 Apr 2020 11:21:47 +0000 Subject: [PATCH 27/29] Release 1.6.12 --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 2a1095fca7..657600d4cc 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index a7a20b1a88..58c62236e5 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index d9be02b41e..03aa8af8a9 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 cache diff --git a/http-api/pom.xml b/http-api/pom.xml index 6f43eb3308..7750445e87 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index c49c48c1a6..75367a75d1 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 Web Service diff --git a/pom.xml b/pom.xml index a689e4b420..219c1c9688 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 pom RuneLite @@ -60,7 +60,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - HEAD + runelite-parent-1.6.12 diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index a41df42095..794eabcd76 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 2adeb0e03e..619a4bcf40 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 0b0a72a656..2a82b067c6 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12-SNAPSHOT + 1.6.12 script-assembler-plugin From 1c9c71ef7c93ccf4c479b7137635e5e266d07788 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Thu, 23 Apr 2020 11:21:55 +0000 Subject: [PATCH 28/29] Bump for 1.6.13-SNAPSHOT --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 657600d4cc..b75ef93d3b 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index 58c62236e5..ebcff640f4 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 03aa8af8a9..6530a9f5a7 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT cache diff --git a/http-api/pom.xml b/http-api/pom.xml index 7750445e87..fa8cefea51 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index 75367a75d1..5f31161607 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT Web Service diff --git a/pom.xml b/pom.xml index 219c1c9688..3502d14ca2 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT pom RuneLite @@ -60,7 +60,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - runelite-parent-1.6.12 + HEAD diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 794eabcd76..7dc379a815 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 619a4bcf40..7d8e35781d 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 2a82b067c6..579383aaf7 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.12 + 1.6.13-SNAPSHOT script-assembler-plugin From c507d0b4ff5bef434cccb2e137f5ec59e0c9df2d Mon Sep 17 00:00:00 2001 From: Tim Granata <40129993+Timmy-Jim@users.noreply.github.com> Date: Fri, 24 Apr 2020 16:05:03 -0400 Subject: [PATCH 29/29] clues: add twisted slayer helm to warrior's guild steps (#11350) --- .../runelite/client/plugins/cluescrolls/clues/EmoteClue.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java index bc8b58ed35..4706d16cf5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java @@ -138,8 +138,8 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu new EmoteClue("Panic by the pilot on White Wolf Mountain. Beware of double agents! Equip mithril platelegs, a ring of life and a rune axe.", "White Wolf Mountain", GNOME_GLIDER_ON_WHITE_WOLF_MOUNTAIN, new WorldPoint(2847, 3499, 0), PANIC, item(MITHRIL_PLATELEGS), item(RING_OF_LIFE), item(RUNE_AXE)), new EmoteClue("Panic by the big egg where no one dare goes and the ground is burnt. Beware of double agents! Equip a dragon med helm, a TokTz-Ket-Xil, a brine sabre, rune platebody and an uncharged amulet of glory.", "Lava dragon isle", SOUTHEAST_CORNER_OF_LAVA_DRAGON_ISLE, new WorldPoint(3227, 3831, 0), PANIC, item(DRAGON_MED_HELM), item(TOKTZKETXIL), item(BRINE_SABRE), item(RUNE_PLATEBODY), item(AMULET_OF_GLORY)), new EmoteClue("Panic at the area flowers meet snow. Equip Blue D'hide vambraces, a dragon spear and a rune plateskirt.", "Trollweiss mountain", HALFWAY_DOWN_TROLLWEISS_MOUNTAIN, new WorldPoint(2776, 3781, 0), PANIC, item(BLUE_DHIDE_VAMBRACES), item(DRAGON_SPEAR), item(RUNE_PLATESKIRT), item(SLED_4084)), - new EmoteClue("Do a push up at the bank of the Warrior's guild. Beware of double agents! Equip a dragon battleaxe, a dragon defender and a slayer helm of any kind.", "Warriors' guild", WARRIORS_GUILD_BANK_29047, new WorldPoint(2843, 3543, 0), PUSH_UP, item(DRAGON_BATTLEAXE), any("Dragon defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T)), any("Any slayer helmet", item(SLAYER_HELMET), item(BLACK_SLAYER_HELMET), item(GREEN_SLAYER_HELMET), item(PURPLE_SLAYER_HELMET), item(RED_SLAYER_HELMET), item(TURQUOISE_SLAYER_HELMET), item(SLAYER_HELMET_I), item(BLACK_SLAYER_HELMET_I), item(GREEN_SLAYER_HELMET_I), item(PURPLE_SLAYER_HELMET_I), item(RED_SLAYER_HELMET_I), item(TURQUOISE_SLAYER_HELMET_I), item(HYDRA_SLAYER_HELMET), item(HYDRA_SLAYER_HELMET_I))), - new EmoteClue("Blow a raspberry in the bank of the Warriors' Guild. Beware of double agents! Equip a dragon battleaxe, a slayer helm of any kind and a dragon defender or avernic defender.", "Warriors' guild", WARRIORS_GUILD_BANK_29047, new WorldPoint(2843, 3543, 0), RASPBERRY, item(DRAGON_BATTLEAXE), any("Dragon defender or Avernic defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T), item(AVERNIC_DEFENDER)), any("Any slayer helmet", item(SLAYER_HELMET), item(BLACK_SLAYER_HELMET), item(GREEN_SLAYER_HELMET), item(PURPLE_SLAYER_HELMET), item(RED_SLAYER_HELMET), item(TURQUOISE_SLAYER_HELMET), item(SLAYER_HELMET_I), item(BLACK_SLAYER_HELMET_I), item(GREEN_SLAYER_HELMET_I), item(PURPLE_SLAYER_HELMET_I), item(RED_SLAYER_HELMET_I), item(TURQUOISE_SLAYER_HELMET_I), item(HYDRA_SLAYER_HELMET), item(HYDRA_SLAYER_HELMET_I))), + new EmoteClue("Do a push up at the bank of the Warrior's guild. Beware of double agents! Equip a dragon battleaxe, a dragon defender and a slayer helm of any kind.", "Warriors' guild", WARRIORS_GUILD_BANK_29047, new WorldPoint(2843, 3543, 0), PUSH_UP, item(DRAGON_BATTLEAXE), any("Dragon defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T)), any("Any slayer helmet", item(SLAYER_HELMET), item(BLACK_SLAYER_HELMET), item(GREEN_SLAYER_HELMET), item(PURPLE_SLAYER_HELMET), item(RED_SLAYER_HELMET), item(TURQUOISE_SLAYER_HELMET), item(SLAYER_HELMET_I), item(BLACK_SLAYER_HELMET_I), item(GREEN_SLAYER_HELMET_I), item(PURPLE_SLAYER_HELMET_I), item(RED_SLAYER_HELMET_I), item(TURQUOISE_SLAYER_HELMET_I), item(HYDRA_SLAYER_HELMET), item(HYDRA_SLAYER_HELMET_I), item(TWISTED_SLAYER_HELMET), item(TWISTED_SLAYER_HELMET_I))), + new EmoteClue("Blow a raspberry in the bank of the Warriors' Guild. Beware of double agents! Equip a dragon battleaxe, a slayer helm of any kind and a dragon defender or avernic defender.", "Warriors' guild", WARRIORS_GUILD_BANK_29047, new WorldPoint(2843, 3543, 0), RASPBERRY, item(DRAGON_BATTLEAXE), any("Dragon defender or Avernic defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T), item(AVERNIC_DEFENDER)), any("Any slayer helmet", item(SLAYER_HELMET), item(BLACK_SLAYER_HELMET), item(GREEN_SLAYER_HELMET), item(PURPLE_SLAYER_HELMET), item(RED_SLAYER_HELMET), item(TURQUOISE_SLAYER_HELMET), item(SLAYER_HELMET_I), item(BLACK_SLAYER_HELMET_I), item(GREEN_SLAYER_HELMET_I), item(PURPLE_SLAYER_HELMET_I), item(RED_SLAYER_HELMET_I), item(TURQUOISE_SLAYER_HELMET_I), item(HYDRA_SLAYER_HELMET), item(HYDRA_SLAYER_HELMET_I), item(TWISTED_SLAYER_HELMET), item(TWISTED_SLAYER_HELMET_I))), new EmoteClue("Blow a raspberry at the monkey cage in Ardougne Zoo. Equip a studded leather body, bronze platelegs and a normal staff with no orb.", "Ardougne Zoo", NEAR_THE_PARROTS_IN_ARDOUGNE_ZOO, new WorldPoint(2607, 3282, 0), RASPBERRY, item(STUDDED_BODY), item(BRONZE_PLATELEGS), item(STAFF)), new EmoteClue("Blow raspberries outside the entrance to Keep Le Faye. Equip a coif, an iron platebody and leather gloves.", "Keep Le Faye", OUTSIDE_KEEP_LE_FAYE, new WorldPoint(2757, 3401, 0), RASPBERRY, item(COIF), item(IRON_PLATEBODY), item(LEATHER_GLOVES)), new EmoteClue("Blow a raspberry in the Fishing Guild bank. Beware of double agents! Equip an elemental shield, blue dragonhide chaps and a rune warhammer.", "Fishing Guild", FISHING_GUILD_BANK, new WorldPoint(2588, 3419, 0), RASPBERRY, item(ELEMENTAL_SHIELD), item(BLUE_DHIDE_CHAPS), item(RUNE_WARHAMMER)),