diff --git a/runelite-api/src/main/java/net/runelite/api/InventoryID.java b/runelite-api/src/main/java/net/runelite/api/InventoryID.java index 8fc1d4a3b9..cde3c7e323 100644 --- a/runelite-api/src/main/java/net/runelite/api/InventoryID.java +++ b/runelite-api/src/main/java/net/runelite/api/InventoryID.java @@ -57,6 +57,10 @@ public enum InventoryID * Looting Bag inventory */ LOOTING_BAG(516), + /** + * Kingdom Of Miscellania reward inventory. + */ + KINGDOM_OF_MISCELLANIA(390), /** * Chambers of Xeric chest inventory. */ 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 a7e1a3505c..b2acc3f74f 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 @@ -215,6 +215,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private int centerX; private int centerY; + private int yaw; + private int pitch; // Uniforms private int uniUseFog; @@ -746,6 +748,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks { centerX = client.getCenterX(); centerY = client.getCenterY(); + yaw = client.getCameraYaw(); + pitch = client.getCameraPitch(); final Scene scene = client.getScene(); final int drawDistance = Math.max(0, Math.min(MAX_DISTANCE, this.drawDistance)); @@ -945,8 +949,8 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, uniformBufferId); uniformBuffer.clear(); uniformBuffer - .put(client.getCameraYaw()) - .put(client.getCameraPitch()) + .put(yaw) + .put(pitch) .put(centerX) .put(centerY) .put(client.getScale()) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java index 8d8437ec71..da4e023a00 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java @@ -209,6 +209,7 @@ public class HunterPlugin extends Plugin case ObjectID.SHAKING_BOX: // Black chinchompa caught case ObjectID.SHAKING_BOX_9382: // Grey chinchompa caught case ObjectID.SHAKING_BOX_9383: // Red chinchompa caught + case ObjectID.SHAKING_BOX_9384: // Ferret caught case ObjectID.BOULDER_20648: // Prickly kebbit caught case ObjectID.BOULDER_20649: // Sabre-tooth kebbit caught case ObjectID.BOULDER_20650: // Barb-tailed kebbit caught @@ -261,25 +262,30 @@ public class HunterPlugin extends Plugin // Imp entering box case ObjectID.MAGIC_BOX_19225: - // Black chin shaking box + // Black chin shaking box case ObjectID.BOX_TRAP: case ObjectID.BOX_TRAP_2026: case ObjectID.BOX_TRAP_2028: case ObjectID.BOX_TRAP_2029: - // Red chin shaking box + // Red chin shaking box case ObjectID.BOX_TRAP_9381: case ObjectID.BOX_TRAP_9390: case ObjectID.BOX_TRAP_9391: case ObjectID.BOX_TRAP_9392: case ObjectID.BOX_TRAP_9393: - // Grey chin shaking box + // Grey chin shaking box case ObjectID.BOX_TRAP_9386: case ObjectID.BOX_TRAP_9387: case ObjectID.BOX_TRAP_9388: - // Bird traps + // Ferret shaking box + case ObjectID.BOX_TRAP_9394: + case ObjectID.BOX_TRAP_9396: + case ObjectID.BOX_TRAP_9397: + + // Bird traps case ObjectID.BIRD_SNARE_9346: case ObjectID.BIRD_SNARE_9347: case ObjectID.BIRD_SNARE_9349: @@ -287,7 +293,7 @@ public class HunterPlugin extends Plugin case ObjectID.BIRD_SNARE_9376: case ObjectID.BIRD_SNARE_9378: - // Deadfall trap + // Deadfall trap case ObjectID.DEADFALL_19218: case ObjectID.DEADFALL_19851: case ObjectID.DEADFALL_20128: @@ -295,7 +301,7 @@ public class HunterPlugin extends Plugin case ObjectID.DEADFALL_20130: case ObjectID.DEADFALL_20131: - // Net trap + // Net trap case ObjectID.NET_TRAP_9003: case ObjectID.NET_TRAP_9005: case ObjectID.NET_TRAP_8972: @@ -305,7 +311,7 @@ public class HunterPlugin extends Plugin case ObjectID.NET_TRAP_8993: case ObjectID.NET_TRAP_8997: - // Maniacal monkey boulder trap + // Maniacal monkey boulder trap case ObjectID.MONKEY_TRAP_28828: case ObjectID.MONKEY_TRAP_28829: if (myTrap != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridOverlay.java index 4e86d634ff..5f22b7e46c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventorygrid/InventoryGridOverlay.java @@ -77,6 +77,14 @@ class InventoryGridOverlay extends Overlay final net.runelite.api.Point mouse = client.getMouseCanvasPosition(); final Point mousePoint = new Point(mouse.getX(), mouse.getY()); + final int if1DraggedItemIndex = client.getIf1DraggedItemIndex(); + final WidgetItem draggedItem = inventoryWidget.getWidgetItem(if1DraggedItemIndex); + final int itemId = draggedItem.getId(); + + if (itemId == -1) + { + return null; + } for (int i = 0; i < INVENTORY_SIZE; ++i) { @@ -87,8 +95,7 @@ class InventoryGridOverlay extends Overlay if (plugin.isShowItem() && inBounds) { - final WidgetItem draggedItem = inventoryWidget.getWidgetItem(client.getIf1DraggedItemIndex()); - final BufferedImage draggedItemImage = itemManager.getImage(draggedItem.getId()); + final BufferedImage draggedItemImage = itemManager.getImage(itemId); final int x = (int) bounds.getX(); final int y = (int) bounds.getY(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java index 22ee17d8bc..d7e2aa22b5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java @@ -136,6 +136,12 @@ public class ItemStatChanges add(boost(MAGIC, perc(.15, 5)), SUPER_MAGIC_POTION_1, SUPER_MAGIC_POTION_2, SUPER_MAGIC_POTION_3, SUPER_MAGIC_POTION_4); add(combo(2, boost(RANGED, perc(0.1, 4)), boost(DEFENCE, perc(0.15, 5))), BASTION_POTION1, BASTION_POTION2, BASTION_POTION3, BASTION_POTION4); add(combo(2, boost(MAGIC, 4), boost(DEFENCE, perc(0.15, 5))), BATTLEMAGE_POTION1, BATTLEMAGE_POTION2, BATTLEMAGE_POTION3, BATTLEMAGE_POTION4); + add(combo(boost(MAGIC, 4), heal(HITPOINTS, -10)), DIVINE_MAGIC_POTION1, DIVINE_MAGIC_POTION2, DIVINE_MAGIC_POTION3, DIVINE_MAGIC_POTION4); + add(combo(boost(RANGED, perc(.10, 4)), heal(HITPOINTS, -10)), DIVINE_RANGING_POTION1, DIVINE_RANGING_POTION2, DIVINE_RANGING_POTION3, DIVINE_RANGING_POTION4); + add(combo(boost(ATTACK, perc(.15, 5)), heal(HITPOINTS, -10)), DIVINE_SUPER_ATTACK_POTION1, DIVINE_SUPER_ATTACK_POTION2, DIVINE_SUPER_ATTACK_POTION3, DIVINE_SUPER_ATTACK_POTION4); + add(combo(boost(STRENGTH, perc(.15, 5)), heal(HITPOINTS, -10)), DIVINE_SUPER_STRENGTH_POTION1, DIVINE_SUPER_STRENGTH_POTION2, DIVINE_SUPER_STRENGTH_POTION3, DIVINE_SUPER_STRENGTH_POTION4); + add(combo(boost(DEFENCE, perc(.15, 5)), heal(HITPOINTS, -10)), DIVINE_SUPER_DEFENCE_POTION1, DIVINE_SUPER_DEFENCE_POTION2, DIVINE_SUPER_DEFENCE_POTION3, DIVINE_SUPER_DEFENCE_POTION4); + add(combo(3, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5)), heal(HITPOINTS, -10)), DIVINE_SUPER_COMBAT_POTION1, DIVINE_SUPER_COMBAT_POTION2, DIVINE_SUPER_COMBAT_POTION3, DIVINE_SUPER_COMBAT_POTION4); // Regular overload (NMZ) add(combo(5, boost(ATTACK, perc(.15, 5)), boost(STRENGTH, perc(.15, 5)), boost(DEFENCE, perc(.15, 5)), boost(RANGED, perc(.15, 5)), boost(MAGIC, perc(.15, 5)), heal(HITPOINTS, -50)), OVERLOAD_1, OVERLOAD_2, OVERLOAD_3, OVERLOAD_4); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java index cdff5fcd62..bdf20cffed 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java @@ -181,10 +181,16 @@ class KeyRemappingListener extends MouseAdapter implements KeyListener switch (e.getKeyCode()) { case KeyEvent.VK_ESCAPE: - // When existing typing mode, block the escape key + // When exiting typing mode, block the escape key // so that it doesn't trigger the in-game hotkeys e.consume(); - // FALLTHROUGH + plugin.setTyping(false); + clientThread.invoke(() -> + { + client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); + plugin.lockChat(); + }); + break; case KeyEvent.VK_ENTER: plugin.setTyping(false); clientThread.invoke(plugin::lockChat); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java index 3de235562c..7aba2d3831 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java @@ -141,6 +141,8 @@ public class KeyRemappingPlugin extends Plugin if (client.getGameState() == GameState.LOGGED_IN) { lockChat(); + // Clear any typed text + client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); } }); } @@ -255,8 +257,6 @@ public class KeyRemappingPlugin extends Plugin if (chatboxInput != null) { chatboxInput.setText(getWaitingText()); - // Typed text can be non-empty on plugin start, so clear it now - client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index 1c53f27aff..948773ed20 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -28,6 +28,7 @@ package net.runelite.client.plugins.loottracker; import com.google.common.base.Strings; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Component; import java.awt.GridLayout; import java.awt.image.BufferedImage; import java.text.DateFormat; @@ -62,6 +63,8 @@ class LootTrackerBox extends JPanel private final JLabel priceLabel = new JLabel(); private final JLabel subTitleLabel = new JLabel(); private final JLabel dateLabel = new JLabel(); + private final JPanel logTitle = new JPanel(new BorderLayout(5, 0)); + private final JLabel titleLabel = new JLabel(); private final ItemManager itemManager; @Getter(AccessLevel.PACKAGE) private final String id; @@ -92,11 +95,10 @@ class LootTrackerBox extends JPanel setLayout(new BorderLayout(0, 1)); setBorder(new EmptyBorder(5, 0, 0, 0)); - final JPanel logTitle = new JPanel(new BorderLayout(5, 0)); logTitle.setBorder(new EmptyBorder(7, 7, 7, 7)); logTitle.setBackground(ColorScheme.DARKER_GRAY_COLOR.darker()); - final JLabel titleLabel = new JLabel(Text.removeTags(id)); + titleLabel.setText(Text.removeTags(id)); titleLabel.setFont(FontManager.getRunescapeSmallFont()); titleLabel.setForeground(Color.WHITE); @@ -201,6 +203,39 @@ class LootTrackerBox extends JPanel repaint(); } + void collapse() + { + if (!isCollapsed()) + { + itemContainer.setVisible(false); + applyDimmer(false, logTitle); + } + } + + void expand() + { + if (isCollapsed()) + { + itemContainer.setVisible(true); + applyDimmer(true, logTitle); + } + } + + boolean isCollapsed() + { + return !itemContainer.isVisible(); + } + + private void applyDimmer(boolean brighten, JPanel panel) + { + for (Component component : panel.getComponents()) + { + Color color = component.getForeground(); + + component.setForeground(brighten ? color.brighter() : color.darker()); + } + } + /** * This method creates stacked items from the item list, calculates total price and then * displays all the items in the UI. diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index 454a9c0812..a096673519 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -84,6 +84,8 @@ class LootTrackerPanel extends PluginPanel private static final ImageIcon RESET_ICON; private static final ImageIcon RESET_ICON_FADED; private static final ImageIcon RESET_ICON_HOVER; + private static final ImageIcon COLLAPSE_ICON; + private static final ImageIcon EXPAND_ICON; private static final String HTML_LABEL_TEMPLATE = @@ -109,7 +111,8 @@ class LootTrackerPanel extends PluginPanel private final JLabel singleLootBtn = new JLabel(); private final JLabel groupedLootBtn = new JLabel(); private final JLabel resetIcon = new JLabel(); - private JComboBox dateFilterComboBox = new JComboBox<>(new Vector(Arrays.asList(LootRecordDateFilter.values()))); + private final JLabel collapseBtn = new JLabel(); + private JComboBox dateFilterComboBox = new JComboBox<>(new Vector<>(Arrays.asList(LootRecordDateFilter.values()))); // Log collection private final List records = new ArrayList<>(); @@ -133,6 +136,8 @@ class LootTrackerPanel extends PluginPanel final BufferedImage visibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "visible_icon.png"); final BufferedImage invisibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "invisible_icon.png"); final BufferedImage resetImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "delete-white.png"); + final BufferedImage collapseImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "collapsed.png"); + final BufferedImage expandedImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "expanded.png"); SINGLE_LOOT_VIEW = new ImageIcon(singleLootImg); SINGLE_LOOT_VIEW_FADED = new ImageIcon(ImageUtil.alphaOffset(singleLootImg, -180)); @@ -155,9 +160,13 @@ class LootTrackerPanel extends PluginPanel INVISIBLE_ICON = new ImageIcon(invisibleImg); INVISIBLE_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(invisibleImg, -220)); + + COLLAPSE_ICON = new ImageIcon(collapseImg); + EXPAND_ICON = new ImageIcon(expandedImg); } - @Getter @Setter + @Getter + @Setter private LootRecordSortType lootRecordSortType = LootRecordSortType.TIMESTAMP; LootTrackerPanel(final LootTrackerPlugin plugin, final ItemManager itemManager, final LootTrackerConfig config) @@ -185,6 +194,16 @@ class LootTrackerPanel extends PluginPanel final JPanel viewControls = new JPanel(new GridLayout(1, 5, 5, 0)); viewControls.setBackground(ColorScheme.DARKER_GRAY_COLOR); + collapseBtn.setIcon(EXPAND_ICON); + collapseBtn.addMouseListener(new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent e) + { + changeCollapse(); + } + }); + singleLootBtn.setIcon(SINGLE_LOOT_VIEW); singleLootBtn.setToolTipText("Show each kill separately"); singleLootBtn.addMouseListener(new MouseAdapter() @@ -282,13 +301,14 @@ class LootTrackerPanel extends PluginPanel dateFilterComboBox.setMaximumSize(new Dimension(15, 0)); dateFilterComboBox.setMaximumRowCount(3); dateFilterComboBox.addItemListener(e -> - { - final LootRecordDateFilter dateFilterSelected = (LootRecordDateFilter) e.getItem(); - dateFilter = dateFilterSelected; - rebuild(); - } + { + final LootRecordDateFilter dateFilterSelected = (LootRecordDateFilter) e.getItem(); + dateFilter = dateFilterSelected; + rebuild(); + } ); + viewControls.add(collapseBtn); //viewControls.add(dateFilterComboBox); viewControls.add(resetIcon); viewControls.add(groupedLootBtn); @@ -332,8 +352,8 @@ class LootTrackerPanel extends PluginPanel leftTitleContainer.add(detailsTitle, BorderLayout.CENTER); actionsContainer.add(dateFilterComboBox); - actionsContainer.add(leftTitleContainer, BorderLayout.WEST); actionsContainer.add(viewControls, BorderLayout.EAST); + actionsContainer.add(leftTitleContainer, BorderLayout.WEST); // Create panel that will contain overall data overallPanel.setBorder(BorderFactory.createCompoundBorder( @@ -399,6 +419,27 @@ class LootTrackerPanel extends PluginPanel actionsContainer.setVisible(true); } + void updateCollapseText() + { + if (isAllCollapsed()) + { + collapseBtn.setToolTipText("Un-Collapse All"); + collapseBtn.setIcon(COLLAPSE_ICON); + } + else + { + collapseBtn.setToolTipText("Collapse All"); + collapseBtn.setIcon(EXPAND_ICON); + } + } + + private boolean isAllCollapsed() + { + return boxes.stream() + .filter(i -> i.isCollapsed()) + .count() == boxes.size(); + } + void loadHeaderIcon(BufferedImage img) { overallIcon.setIcon(new ImageIcon(img)); @@ -412,7 +453,7 @@ class LootTrackerPanel extends PluginPanel void add(final String eventName, final String localUsername, final int actorLevel, LootTrackerItem[] items) { final String subTitle = actorLevel > -1 ? "(lvl-" + actorLevel + ")" : ""; - final LootTrackerRecord record = new LootTrackerRecord( eventName, localUsername, subTitle, items, Instant.now()); + final LootTrackerRecord record = new LootTrackerRecord(eventName, localUsername, subTitle, items, Instant.now()); records.add(record); LootTrackerBox box = buildBox(record); if (box != null) @@ -468,6 +509,28 @@ class LootTrackerPanel extends PluginPanel plugin.deleteLocalRecords(); } + /** + * Changes the collapse status of loot entries + */ + private void changeCollapse() + { + boolean isAllCollapsed = isAllCollapsed(); + + for (LootTrackerBox box : boxes) + { + if (isAllCollapsed) + { + box.expand(); + } + else if (!box.isCollapsed()) + { + box.collapse(); + } + } + + updateCollapseText(); + } + /** * After an item changed it's ignored state, iterate all the records and make * sure all items of the same name also get updated @@ -477,11 +540,13 @@ class LootTrackerPanel extends PluginPanel for (LootTrackerRecord r : records) { if (plugin.isIgnoredNPC(r.getTitle())) - for (LootTrackerItem item : r.getItems()) { - if (plugin.isIgnored(item.getName()) != item.isIgnored()) + for (LootTrackerItem item : r.getItems()) { - item.setIgnored(plugin.isIgnored(item.getName())); + if (plugin.isIgnored(item.getName()) != item.isIgnored()) + { + item.setIgnored(plugin.isIgnored(item.getName())); + } } } } @@ -544,15 +609,11 @@ class LootTrackerPanel extends PluginPanel } - - } boxes.forEach(LootTrackerBox::rebuild); updateOverall(); logsContainer.revalidate(); logsContainer.repaint(); - - } /** @@ -606,7 +667,7 @@ class LootTrackerPanel extends PluginPanel overallPanel.setVisible(true); // Create box - final LootTrackerBox box = new LootTrackerBox(record.getTimestamp().toEpochMilli(), itemManager, record.getTitle(), record.getSubTitle(), + final LootTrackerBox box = new LootTrackerBox(record.getTimestamp().toEpochMilli(), itemManager, record.getTitle(), record.getSubTitle(), hideIgnoredItems, config.displayDate(), plugin::toggleItem); box.combine(record); @@ -615,6 +676,27 @@ class LootTrackerPanel extends PluginPanel popupMenu.setBorder(new EmptyBorder(5, 5, 5, 5)); box.setComponentPopupMenu(popupMenu); + // Create collapse event + box.addMouseListener(new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent e) + { + if (e.getButton() == MouseEvent.BUTTON1) + { + if (box.isCollapsed()) + { + box.expand(); + } + else + { + box.collapse(); + } + updateCollapseText(); + } + } + }); + // Create Hide Menu item final JMenuItem hide; @@ -737,7 +819,10 @@ class LootTrackerPanel extends PluginPanel overallKillsLabel.setText(htmlLabel("Total count: ", overallKills)); overallGpLabel.setText(htmlLabel("Total value: ", overallGp)); + + updateCollapseText(); } + private static String htmlLabel(String key, long value) { final String valueStr = StackFormatter.quantityToStackSize(value); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index cb833d4a3d..703db01347 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -629,6 +629,10 @@ public class LootTrackerPlugin extends Plugin // Clue Scrolls use same InventoryID as Barrows container = client.getItemContainer(InventoryID.BARROWS_REWARD); break; + case (WidgetID.KINGDOM_GROUP_ID): + eventType = "Kingdom of Miscellania"; + container = client.getItemContainer(InventoryID.KINGDOM_OF_MISCELLANIA); + break; default: return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 022f1b55c1..184231d8ca 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -1150,7 +1150,8 @@ public class SlayerPlugin extends Plugin } if (TASK_STRING_VALIDATION.matcher(task.getTask()).find() || task.getTask().length() > TASK_STRING_MAX_LENGTH || - TASK_STRING_VALIDATION.matcher(task.getLocation()).find() || task.getLocation().length() > TASK_STRING_MAX_LENGTH) + TASK_STRING_VALIDATION.matcher(task.getLocation()).find() || task.getLocation().length() > TASK_STRING_MAX_LENGTH || + Task.getTask(task.getTask()) == null || !Task.LOCATIONS.contains(task.getLocation())) { log.debug("Validation failed for task name or location: {}", task); return; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java index 351ad38b6f..ccf163c6e8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java @@ -26,6 +26,7 @@ package net.runelite.client.plugins.slayer; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import java.util.ArrayList; import static java.util.Arrays.asList; @@ -242,6 +243,48 @@ enum Task // private static final Map tasks; + static final List LOCATIONS = ImmutableList.of( + "", // no location is a valid location + "Abyss", + "Ancient Cavern", + "Asgarnian Ice Dungeon", + "Brimhaven Dungeon", + "Brine Rat Cavern", + "Catacombs of Kourend", + "Chasm of Fire", + "Clan Wars", + "Death Plateau", + "Evil Chicken's Lair", + "Fossil Island", + "Fremennik Slayer Dungeon", + "God Wars Dungeon", + "Iorwerth Dungeon", + "Kalphite Lair", + "Karuulm Slayer Dungeon", + "Keldagrim", + "Kraken Cove", + "Lighthouse", + "Lithkren Vault", + "Lizardman Canyon", + "Lizardman Settlement", + "Molch", + "Mount Quidamortem", + "Mourner Tunnels", + "Ogre Enclave", + "Slayer Tower", + "Smoke Devil Dungeon", + "Smoke Dungeon", + "Stronghold of Security", + "Stronghold Slayer Dungeon", + "task-only Kalphite Cave", + "Taverley Dungeon", + "Troll Stronghold", + "Waterbirth Island", + "Waterfall Dungeon", + "Wilderness", + "Witchaven Dungeon", + "Zanaris" + ); private final String name; private final int itemSpriteId; 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 8d138a26e9..53985eca45 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 @@ -26,12 +26,16 @@ package net.runelite.client.ui.overlay; import com.google.common.base.MoreObjects; import java.awt.Color; +import java.awt.Composite; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics2D; +import java.awt.Paint; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; +import java.awt.RenderingHints; +import java.awt.Stroke; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; @@ -145,7 +149,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener } } - protected void onClientTick(ClientTick t) + private void onClientTick(ClientTick t) { if (menuEntries == null) { @@ -499,11 +503,15 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener graphics.setFont(this.interfaceFont); } - // Reset the default color - graphics.setColor(Color.WHITE); + // Save graphics2d properties so we can restore them later + final AffineTransform transform = graphics.getTransform(); + final Stroke stroke = graphics.getStroke(); + final Composite composite = graphics.getComposite(); + final Paint paint = graphics.getPaint(); + final Color color = graphics.getColor(); + final RenderingHints renderingHints = graphics.getRenderingHints(); + final Color background = graphics.getBackground(); - // Get transform so we can reset it after drawing - AffineTransform transform = graphics.getTransform(); graphics.translate(point.x, point.y); final Dimension overlayDimension; @@ -518,7 +526,14 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener } finally { + // Restore graphics2d properties graphics.setTransform(transform); + graphics.setStroke(stroke); + graphics.setComposite(composite); + graphics.setPaint(paint); + graphics.setColor(color); + graphics.setRenderingHints(renderingHints); + graphics.setBackground(background); } final Dimension dimension = MoreObjects.firstNonNull(overlayDimension, new Dimension()); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json index 330ea4a0d1..afc007325d 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_limits.json @@ -4087,5 +4087,10 @@ "22622": 10, "22634": 100, "22636": 100, - "22647": 10 + "22647": 10, + "23499": 11000, + "23517": 100, + "23522": 70, + "23525": 4, + "23528": 70 } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/collapsed.png b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/collapsed.png new file mode 100644 index 0000000000..449f68ae6c Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/collapsed.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/expanded.png b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/expanded.png new file mode 100644 index 0000000000..df41d71bc9 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/loottracker/expanded.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json index 5a6f05161d..7da4e7236c 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json @@ -510,6 +510,12 @@ "name": "Amethyst Arrow", "xp": 13.5 }, + { + "level": 84, + "icon": 21930, + "name": "Dragon Bolts", + "xp": 12 + }, { "level": 84, "icon": 21318, diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json index c25cb8beda..242ca19943 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json @@ -276,6 +276,12 @@ "name": "Stamina Potion (3)", "xp": 76.5 }, + { + "level": 77, + "icon": 12625, + "name": "Stamina Potion (4)", + "xp": 102 + }, { "level": 78, "icon": 189, diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index 0191dbd499..5ba89b19ee 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -407,8 +407,8 @@ public class SlayerPluginTest public void testTaskLookup() throws IOException { net.runelite.http.api.chat.Task task = new net.runelite.http.api.chat.Task(); - task.setTask("task"); - task.setLocation("loc"); + task.setTask("Abyssal demons"); + task.setLocation("Abyss"); task.setAmount(42); task.setInitialAmount(42);