From c5a77efac1ba1f2654e13c22fa65f09536a5f24d Mon Sep 17 00:00:00 2001 From: Crow <40111569+000000653@users.noreply.github.com> Date: Wed, 8 Apr 2020 23:36:34 -0500 Subject: [PATCH 01/29] Add eternal teleport crystal value offset Fixes #11187 --- .../client/plugins/itemskeptondeath/FixedPriceItem.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java index ba5a1e08f5..04d731bb3d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java @@ -219,6 +219,8 @@ enum FixedPriceItem VERACS_FLAIL_100(ItemID.VERACS_FLAIL_100, 10000, ItemID.VERACS_FLAIL_0), AVERNIC_DEFENDER(ItemID.AVERNIC_DEFENDER, 4040000), + + ETERNAL_TELEPORT_CRYSTAL(ItemID.ETERNAL_TELEPORT_CRYSTAL, 78500), ; private final int itemId; From eb89319cc433296fe190d939bb4b7843b56f2af7 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Tue, 7 Apr 2020 13:01:44 -0600 Subject: [PATCH 02/29] runelite-api: add stopNow to cleanly shutdown the client --- runelite-api/src/main/java/net/runelite/api/Client.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index e43a067701..2353270e2c 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -140,6 +140,13 @@ public interface Client extends GameEngine */ void setGameState(GameState gameState); + /** + * Causes the client to shutdown. It is faster than + * {@link java.applet.Applet#stop()} because it doesn't wait for 4000ms. + * This will call {@link System#exit} when it is done + */ + void stopNow(); + /** * Gets the current logged in username. * From 42db64dc79609256638ad2709bcbaccf382975e7 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Tue, 7 Apr 2020 13:05:43 -0600 Subject: [PATCH 03/29] eventbus: make higher priority events fire first --- .../main/java/net/runelite/client/chat/ChatMessageManager.java | 2 +- .../src/main/java/net/runelite/client/eventbus/EventBus.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java index 2642dbb162..2f4d860c2c 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java @@ -107,7 +107,7 @@ public class ChatMessageManager } } - @Subscribe(priority = 1) // run after all plugins + @Subscribe(priority = -1) // run after all plugins public void onChatMessage(ChatMessage chatMessage) { MessageNode messageNode = chatMessage.getMessageNode(); diff --git a/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java index ec98ec6698..2340e306dd 100644 --- a/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java +++ b/runelite-client/src/main/java/net/runelite/client/eventbus/EventBus.java @@ -106,7 +106,7 @@ public class EventBus builder.putAll(subscribers); } - builder.orderValuesBy(Comparator.comparing(Subscriber::getPriority) + builder.orderValuesBy(Comparator.comparing(Subscriber::getPriority).reversed() .thenComparing(s -> s.object.getClass().getName())); for (Class clazz = object.getClass(); clazz != null; clazz = clazz.getSuperclass()) From e83d1e6b7269235726dd007e20a3b7e8b7bcdbb1 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Tue, 7 Apr 2020 13:04:57 -0600 Subject: [PATCH 04/29] runelite-client: add ClientShutdown event This should hopefully make the client not corrupt it's cache randomly, and prevents the config sets from racing shutdown --- .../http/api/config/ConfigClient.java | 17 +++- .../runelite/client/ClientSessionManager.java | 13 ++- .../java/net/runelite/client/RuneLite.java | 12 +-- .../runelite/client/config/ConfigManager.java | 29 +++++- .../client/events/ClientShutdown.java | 72 ++++++++++++++ .../java/net/runelite/client/ui/ClientUI.java | 93 ++++++++++++++++--- .../net/runelite/client/util/SwingUtil.java | 48 ---------- 7 files changed, 203 insertions(+), 81 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/events/ClientShutdown.java diff --git a/http-api/src/main/java/net/runelite/http/api/config/ConfigClient.java b/http-api/src/main/java/net/runelite/http/api/config/ConfigClient.java index 4d82976454..c82c7d0f22 100644 --- a/http-api/src/main/java/net/runelite/http/api/config/ConfigClient.java +++ b/http-api/src/main/java/net/runelite/http/api/config/ConfigClient.java @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import net.runelite.http.api.RuneLiteAPI; import okhttp3.Call; import okhttp3.Callback; @@ -77,8 +78,10 @@ public class ConfigClient } } - public void set(String key, String value) + public CompletableFuture set(String key, String value) { + CompletableFuture future = new CompletableFuture<>(); + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("config") .addPathSegment(key) @@ -98,6 +101,7 @@ public class ConfigClient public void onFailure(Call call, IOException e) { logger.warn("Unable to synchronize configuration item", e); + future.completeExceptionally(e); } @Override @@ -105,12 +109,17 @@ public class ConfigClient { response.close(); logger.debug("Synchronized configuration value '{}' to '{}'", key, value); + future.complete(null); } }); + + return future; } - public void unset(String key) + public CompletableFuture unset(String key) { + CompletableFuture future = new CompletableFuture<>(); + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("config") .addPathSegment(key) @@ -130,6 +139,7 @@ public class ConfigClient public void onFailure(Call call, IOException e) { logger.warn("Unable to unset configuration item", e); + future.completeExceptionally(e); } @Override @@ -137,7 +147,10 @@ public class ConfigClient { response.close(); logger.debug("Unset configuration value '{}'", key); + future.complete(null); } }); + + return future; } } diff --git a/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java index 7b19f36d62..a7d412b513 100644 --- a/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java @@ -35,6 +35,8 @@ import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ClientShutdown; import net.runelite.client.util.RunnableExceptionLogger; @Singleton @@ -70,9 +72,12 @@ public class ClientSessionManager scheduledFuture = executorService.scheduleWithFixedDelay(RunnableExceptionLogger.wrap(this::ping), 1, 10, TimeUnit.MINUTES); } - public void shutdown() + @Subscribe + private void onClientShutdown(ClientShutdown e) { - if (sessionId != null) + scheduledFuture.cancel(true); + + e.waitFor(executorService.submit(() -> { try { @@ -83,9 +88,7 @@ public class ClientSessionManager log.warn(null, ex); } sessionId = null; - } - - scheduledFuture.cancel(true); + })); } private void ping() diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index cf1b76b5ae..9a0c8f87d9 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -324,11 +324,12 @@ public class RuneLite // Start client session clientSessionManager.start(); + eventBus.register(clientSessionManager); SplashScreen.stage(.75, null, "Starting core interface"); // Initialize UI - clientUI.init(this); + clientUI.init(); // Initialize Discord service discordService.init(); @@ -341,6 +342,8 @@ public class RuneLite eventBus.register(drawManager); eventBus.register(infoBoxManager); eventBus.register(tooltipManager); + eventBus.register(configManager); + eventBus.register(discordService); if (!isOutdated) { @@ -373,13 +376,6 @@ public class RuneLite clientUI.show(); } - public void shutdown() - { - configManager.sendConfig(); - clientSessionManager.shutdown(); - discordService.close(); - } - @VisibleForTesting public static void setInjector(Injector injector) { diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index 8bf579d115..61c748047c 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -57,9 +57,12 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Properties; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -68,6 +71,8 @@ import net.runelite.api.coords.WorldPoint; import net.runelite.client.RuneLite; import net.runelite.client.account.AccountSession; import net.runelite.client.eventbus.EventBus; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ClientShutdown; import net.runelite.client.events.ConfigChanged; import net.runelite.client.util.ColorUtil; import net.runelite.http.api.config.ConfigClient; @@ -675,27 +680,39 @@ public class ConfigManager return object.toString(); } - public void sendConfig() + @Subscribe(priority = 100) + private void onClientShutdown(ClientShutdown e) { + Future f = sendConfig(); + if (f != null) + { + e.waitFor(f); + } + } + + @Nullable + private CompletableFuture sendConfig() + { + CompletableFuture future = null; boolean changed; synchronized (pendingChanges) { if (client != null) { - for (Map.Entry entry : pendingChanges.entrySet()) + future = CompletableFuture.allOf(pendingChanges.entrySet().stream().map(entry -> { String key = entry.getKey(); String value = entry.getValue(); if (Strings.isNullOrEmpty(value)) { - client.unset(key); + return client.unset(key); } else { - client.set(key, value); + return client.set(key, value); } - } + }).toArray(CompletableFuture[]::new)); } changed = !pendingChanges.isEmpty(); pendingChanges.clear(); @@ -712,5 +729,7 @@ public class ConfigManager log.warn("unable to save configuration file", ex); } } + + return future; } } diff --git a/runelite-client/src/main/java/net/runelite/client/events/ClientShutdown.java b/runelite-client/src/main/java/net/runelite/client/events/ClientShutdown.java new file mode 100644 index 0000000000..a4817c39ae --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/events/ClientShutdown.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2020 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.events; + +import java.time.Duration; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Value +@Slf4j +public class ClientShutdown +{ + private Queue> tasks = new ConcurrentLinkedQueue<>(); + + public void waitFor(Future future) + { + tasks.add(future); + } + + public void waitForAllConsumers(Duration totalTimeout) + { + long deadline = System.nanoTime() + totalTimeout.toNanos(); + for (Future task; (task = tasks.poll()) != null; ) + { + long timeout = deadline - System.nanoTime(); + if (timeout < 0) + { + log.warn("Timed out waiting for task completion"); + return; + } + + try + { + task.get(timeout, TimeUnit.NANOSECONDS); + } + catch (ThreadDeath d) + { + throw d; + } + catch (Throwable t) + { + log.warn("Error during shutdown: ", t); + } + } + } +} 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 2ae6cc56c2..41760fda8d 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 @@ -42,7 +42,10 @@ import java.awt.TrayIcon; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; +import java.time.Duration; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Provider; @@ -64,11 +67,12 @@ import net.runelite.api.Constants; import net.runelite.api.GameState; import net.runelite.api.Player; import net.runelite.api.Point; +import net.runelite.client.eventbus.EventBus; +import net.runelite.client.events.ClientShutdown; import net.runelite.client.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.RuneLite; import net.runelite.client.RuneLiteProperties; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; @@ -116,6 +120,8 @@ public class ClientUI private final Applet client; private final ConfigManager configManager; private final Provider clientThreadProvider; + private final EventBus eventBus; + private final CardLayout cardLayout = new CardLayout(); private final Rectangle sidebarButtonPosition = new Rectangle(); private boolean withTitleBar; @@ -141,7 +147,8 @@ public class ClientUI MouseManager mouseManager, @Nullable Applet client, ConfigManager configManager, - Provider clientThreadProvider) + Provider clientThreadProvider, + EventBus eventBus) { this.config = config; this.keyManager = keyManager; @@ -149,6 +156,7 @@ public class ClientUI this.client = client; this.configManager = configManager; this.clientThreadProvider = clientThreadProvider; + this.eventBus = eventBus; } @Subscribe @@ -289,10 +297,8 @@ public class ClientUI /** * Initialize UI. - * @param runelite runelite instance that will be shut down on exit - * @throws Exception exception that can occur during creation of the UI */ - public void init(final RuneLite runelite) throws Exception + public void init() throws Exception { SwingUtilities.invokeAndWait(() -> { @@ -317,14 +323,36 @@ public class ClientUI frame.setLocationRelativeTo(frame.getOwner()); frame.setResizable(true); - SwingUtil.addGracefulExitCallback(frame, - () -> + frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + frame.addWindowListener(new WindowAdapter() + { + @Override + public void windowClosing(WindowEvent event) { - saveClientBoundsConfig(); - runelite.shutdown(); - }, - this::showWarningOnExit - ); + int result = JOptionPane.OK_OPTION; + + if (showWarningOnExit()) + { + try + { + result = JOptionPane.showConfirmDialog( + frame, + "Are you sure you want to exit?", "Exit", + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + } + catch (Exception e) + { + log.warn("Unexpected exception occurred while check for confirm required", e); + } + } + + if (result == JOptionPane.OK_OPTION) + { + shutdownClient(); + } + } + }); container = new JPanel(); container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS)); @@ -541,6 +569,45 @@ public class ClientUI return false; } + private void shutdownClient() + { + saveClientBoundsConfig(); + ClientShutdown csev = new ClientShutdown(); + eventBus.post(csev); + new Thread(() -> + { + csev.waitForAllConsumers(Duration.ofSeconds(10)); + + if (client != null) + { + // The client can call System.exit when it's done shutting down + // if it doesn't though, we want to exit anyway, so race it + int clientShutdownWaitMS; + if (client instanceof Client) + { + ((Client) client).stopNow(); + clientShutdownWaitMS = 1000; + } + else + { + // it will continue rendering for about 4 seconds before attempting shutdown if its vanilla + client.stop(); + frame.setVisible(false); + clientShutdownWaitMS = 6000; + } + + try + { + Thread.sleep(clientShutdownWaitMS); + } + catch (InterruptedException ignored) + { + } + } + System.exit(0); + }, "RuneLite Shutdown").start(); + } + /** * Paint this component to target graphics * @@ -597,7 +664,7 @@ public class ClientUI } /** - * Changes cursor for client window. Requires ${@link ClientUI#init(RuneLite)} to be called first. + * Changes cursor for client window. Requires ${@link ClientUI#init()} to be called first. * FIXME: This is working properly only on Windows, Linux and Mac are displaying cursor incorrectly * @param image cursor image * @param name cursor name diff --git a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java index 2b5b5caf70..90723d9ade 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java @@ -39,27 +39,21 @@ import java.awt.Toolkit; import java.awt.TrayIcon; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.util.Enumeration; -import java.util.concurrent.Callable; import java.util.function.BiConsumer; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.swing.AbstractButton; import javax.swing.ImageIcon; import javax.swing.JButton; -import javax.swing.JFrame; import javax.swing.JMenuItem; -import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.LookAndFeel; import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; -import static javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE; import javax.swing.plaf.FontUIResource; import lombok.extern.slf4j.Slf4j; import net.runelite.client.ui.ColorScheme; @@ -189,48 +183,6 @@ public class SwingUtil return trayIcon; } - /** - * Add graceful exit callback. - * - * @param frame the frame - * @param callback the callback - * @param confirmRequired the confirm required - */ - public static void addGracefulExitCallback(@Nonnull final JFrame frame, @Nonnull final Runnable callback, @Nonnull final Callable confirmRequired) - { - frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - frame.addWindowListener(new WindowAdapter() - { - @Override - public void windowClosing(WindowEvent event) - { - int result = JOptionPane.OK_OPTION; - - try - { - if (confirmRequired.call()) - { - result = JOptionPane.showConfirmDialog( - frame, - "Are you sure you want to exit?", "Exit", - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE); - } - } - catch (Exception e) - { - log.warn("Unexpected exception occurred while check for confirm required", e); - } - - if (result == JOptionPane.OK_OPTION) - { - callback.run(); - System.exit(0); - } - } - }); - } - /** * Create swing button from navigation button. * From 22cee79ab96aca085ccfacc7afc529e1eebf366f Mon Sep 17 00:00:00 2001 From: trimbe <19672127+trimbe@users.noreply.github.com> Date: Sat, 3 Aug 2019 20:59:03 -0400 Subject: [PATCH 05/29] bank plugin: improve responsiveness of bank searches The client will normally layout the bank during a search only once every 40 client ticks, causing slow response times after the search input is updated. Instead, hook the search refresh script that is called every client tick, and if the bank hasn't been laid out on the current tick, and the search input has changed, lay it out early. --- .../main/java/net/runelite/api/ScriptID.java | 9 ++++++ .../client/plugins/bank/BankPlugin.java | 23 +++++++++++++ .../plugins/banktags/tabs/BankSearch.java | 32 +++++++++++-------- 3 files changed, 50 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 8d7898e3e7..5cc976e3d2 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -271,4 +271,13 @@ public final class ScriptID */ @ScriptArguments(integer = 7) public static final int IGNORE_UPDATE = 630; + + /** + * Called in an onTimer, determines whether to layout the bank during a search + *
    + *
  • int (WidgetID) * 16, various widgets making up the bank interface
  • + *
+ */ + @ScriptArguments(integer = 16) + public static final int BANKMAIN_SEARCH_REFRESH = 283; } 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 dafa61f630..e9040d1f47 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 @@ -45,11 +45,14 @@ import net.runelite.api.ItemComposition; import net.runelite.api.ItemContainer; import net.runelite.api.ItemID; import net.runelite.api.MenuEntry; +import net.runelite.api.ScriptID; +import net.runelite.api.VarClientStr; import net.runelite.api.Varbits; import net.runelite.api.events.ItemContainerChanged; import net.runelite.api.events.MenuEntryAdded; 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.Widget; import net.runelite.api.widgets.WidgetID; @@ -115,6 +118,7 @@ public class BankPlugin extends Plugin private boolean forceRightClickFlag; private Multiset itemQuantities; // bank item quantities for bank value search + private String searchString; @Provides BankConfig getConfig(ConfigManager configManager) @@ -128,6 +132,7 @@ public class BankPlugin extends Plugin clientThread.invokeLater(() -> bankSearch.reset(false)); forceRightClickFlag = false; itemQuantities = null; + searchString = null; } @Subscribe @@ -209,6 +214,24 @@ public class BankPlugin extends Plugin updateSeedVaultTotal(); } + @Subscribe + public void onScriptPostFired(ScriptPostFired event) + { + if (event.getScriptId() != ScriptID.BANKMAIN_SEARCH_REFRESH) + { + return; + } + + // vanilla only lays out the bank every 40 client ticks, so if the search input has changed, + // and the bank wasn't laid out this tick, lay it out early + final String inputText = client.getVar(VarClientStr.INPUT_TEXT); + if (searchString != inputText && client.getGameCycle() % 40 != 0) + { + clientThread.invokeLater(bankSearch::layoutBank); + searchString = inputText; + } + } + @Subscribe public void onItemContainerChanged(ItemContainerChanged event) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java index 10a1ed2004..34cd7e8244 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/BankSearch.java @@ -54,19 +54,6 @@ public class BankSearch { clientThread.invoke(() -> { - Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); - if (bankContainer == null || bankContainer.isHidden()) - { - return; - } - - Object[] scriptArgs = bankContainer.getOnInvTransmitListener(); - - if (scriptArgs == null) - { - return; - } - // This ensures that any chatbox input (e.g from search) will not remain visible when // selecting/changing tab if (closeInput) @@ -77,10 +64,27 @@ public class BankSearch client.setVar(VarClientInt.INPUT_TYPE, inputType.getType()); client.setVar(VarClientStr.INPUT_TEXT, search); - client.runScript(scriptArgs); + layoutBank(); }); } + public void layoutBank() + { + Widget bankContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); + if (bankContainer == null || bankContainer.isHidden()) + { + return; + } + + Object[] scriptArgs = bankContainer.getOnInvTransmitListener(); + if (scriptArgs == null) + { + return; + } + + client.runScript(scriptArgs); + } + public void reset(boolean closeChat) { search(InputType.NONE, "", closeChat); From fae69d4fd267f7b4000ee7c25cd137c7336923a1 Mon Sep 17 00:00:00 2001 From: Trevor Date: Fri, 10 Apr 2020 17:51:09 -0400 Subject: [PATCH 06/29] loot tracker plugin: submit loot on client shutdown (#11243) --- .../api/loottracker/LootTrackerClient.java | 9 ++++++- .../loottracker/LootTrackerPlugin.java | 24 +++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java index 793b661fdd..bc1b6de369 100644 --- a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java +++ b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java @@ -33,6 +33,7 @@ import java.io.InputStreamReader; import java.util.Collection; import java.util.List; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; @@ -52,8 +53,10 @@ public class LootTrackerClient private final UUID uuid; - public void submit(Collection lootRecords) + public CompletableFuture submit(Collection lootRecords) { + CompletableFuture future = new CompletableFuture<>(); + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("loottracker") .build(); @@ -70,6 +73,7 @@ public class LootTrackerClient public void onFailure(Call call, IOException e) { log.warn("unable to submit loot", e); + future.completeExceptionally(e); } @Override @@ -77,8 +81,11 @@ public class LootTrackerClient { log.debug("Submitted loot"); response.close(); + future.complete(null); } }); + + return future; } public Collection get() throws IOException 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 afad2d6af8..e10427eec3 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 @@ -46,10 +46,13 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.AccessLevel; @@ -80,6 +83,7 @@ import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ClientShutdown; import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.NpcLootReceived; import net.runelite.client.events.PlayerLootReceived; @@ -340,6 +344,16 @@ public class LootTrackerPlugin extends Plugin chestLooted = false; } + @Subscribe + public void onClientShutdown(ClientShutdown event) + { + Future future = submitLoot(); + if (future != null) + { + event.waitFor(future); + } + } + @Subscribe public void onGameStateChanged(final GameStateChanged event) { @@ -629,14 +643,15 @@ public class LootTrackerPlugin extends Plugin submitLoot(); } - private void submitLoot() + @Nullable + private CompletableFuture submitLoot() { List copy; synchronized (queuedLoots) { if (queuedLoots.isEmpty()) { - return; + return null; } copy = new ArrayList<>(queuedLoots); @@ -645,12 +660,13 @@ public class LootTrackerPlugin extends Plugin if (lootTrackerClient == null || !config.saveLoot()) { - return; + return null; } log.debug("Submitting {} loot records", copy.size()); - lootTrackerClient.submit(copy); + CompletableFuture future = lootTrackerClient.submit(copy); + return future; } private void takeInventorySnapshot() From 2c8c695736e6b7407b8185057a07518e65c5af3b Mon Sep 17 00:00:00 2001 From: SirGirion Date: Sun, 12 Apr 2020 13:35:24 -0400 Subject: [PATCH 07/29] emoteclue: Replace vamb with vambraces in clue text This follows a Jagex update where "vamb" and "vambs" was replaced with "vambraces" across all game text, including clue scrolls. --- .../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 da88eb517f..bc8b58ed35 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 @@ -113,7 +113,7 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu new EmoteClue("Dance in the dark caves beneath Lumbridge Swamp. Blow a kiss before you talk to me. Equip an air staff, Bronze full helm and an amulet of power.", "Lumbridge swamp caves", LUMBRIDGE_SWAMP_CAVES, new WorldPoint(3168, 9571, 0), DANCE, BLOW_KISS, Varbits.FIRE_PIT_LUMBRIDGE_SWAMP, item(STAFF_OF_AIR), item(BRONZE_FULL_HELM), item(AMULET_OF_POWER)), new EmoteClue("Dance at the cat-doored pyramid in Sophanem. Beware of double agents! Equip a ring of life, an uncharged amulet of glory and an adamant two-handed sword.", "Pyramid Of Sophanem", OUTSIDE_THE_GREAT_PYRAMID_OF_SOPHANEM, new WorldPoint(3294, 2781, 0), DANCE, item(RING_OF_LIFE), item(AMULET_OF_GLORY), item(ADAMANT_2H_SWORD)), new EmoteClue("Dance in the centre of Canifis. Bow before you talk to me. Equip a green gnome robe top, mithril plate legs and an iron two-handed sword.", "Canifis", CENTRE_OF_CANIFIS, new WorldPoint(3492, 3488, 0), DANCE, BOW, item(GREEN_ROBE_TOP), item(MITHRIL_PLATELEGS), item(IRON_2H_SWORD)), - new EmoteClue("Dance in the King Black Dragon's lair. Beware of double agents! Equip a black dragonhide body, black dragonhide vambs and a black dragon mask.", "King black dragon's lair", KING_BLACK_DRAGONS_LAIR, new WorldPoint(2271, 4680, 0), DANCE, item(BLACK_DHIDE_BODY), item(BLACK_DHIDE_VAMBRACES), item(BLACK_DRAGON_MASK)), + new EmoteClue("Dance in the King Black Dragon's lair. Beware of double agents! Equip a black dragonhide body, black dragonhide vambraces and a black dragon mask.", "King black dragon's lair", KING_BLACK_DRAGONS_LAIR, new WorldPoint(2271, 4680, 0), DANCE, item(BLACK_DHIDE_BODY), item(BLACK_DHIDE_VAMBRACES), item(BLACK_DRAGON_MASK)), new EmoteClue("Dance at the entrance to the Grand Exchange. Equip a pink skirt, pink robe top and a body tiara.", "Grand Exchange", SOUTH_OF_THE_GRAND_EXCHANGE, new WorldPoint(3165, 3467, 0), DANCE, item(PINK_SKIRT), item(PINK_ROBE_TOP), item(BODY_TIARA)), new EmoteClue("Goblin Salute in the Goblin Village. Beware of double agents! Equip a bandos godsword, a bandos cloak and a bandos platebody.", "Goblin Village", OUTSIDE_MUDKNUCKLES_HUT, new WorldPoint(2956, 3505, 0), GOBLIN_SALUTE, item(BANDOS_PLATEBODY), item(BANDOS_CLOAK), any("Bandos godsword", item(BANDOS_GODSWORD), item(BANDOS_GODSWORD_OR))), new EmoteClue("Headbang in the mine north of Al Kharid. Equip a desert shirt, leather gloves and leather boots.", "Al Kharid mine", AL_KHARID_SCORPION_MINE, new WorldPoint(3299, 3289, 0), HEADBANG, item(DESERT_SHIRT), item(LEATHER_GLOVES), item(LEATHER_BOOTS)), @@ -137,7 +137,7 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu new EmoteClue("Panic on the Wilderness volcano bridge. Beware of double agents! Equip any headband and crozier.", "Wilderness volcano", VOLCANO_IN_THE_NORTHEASTERN_WILDERNESS, new WorldPoint(3368, 3935, 0), PANIC, any("Any headband", range(RED_HEADBAND, BROWN_HEADBAND), range(WHITE_HEADBAND, GREEN_HEADBAND)), any("Any crozier", item(ANCIENT_CROZIER), item(ARMADYL_CROZIER), item(BANDOS_CROZIER), range(SARADOMIN_CROZIER, ZAMORAK_CROZIER))), 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 vambs, 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("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("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)), From ab365d17a1b7dc74b97ea58709d9bfca45d95475 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 12 Apr 2020 17:48:00 -0400 Subject: [PATCH 08/29] emoji plugin: load emojis on client thread --- .../net/runelite/client/plugins/emojis/EmojiPlugin.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java index 68b97817c3..06b97428bb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java @@ -40,6 +40,7 @@ import net.runelite.api.Player; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.OverheadTextChanged; +import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; @@ -60,6 +61,9 @@ public class EmojiPlugin extends Plugin @Inject private Client client; + @Inject + private ClientThread clientThread; + @Inject private ChatMessageManager chatMessageManager; @@ -68,7 +72,7 @@ public class EmojiPlugin extends Plugin @Override protected void startUp() { - loadEmojiIcons(); + clientThread.invoke(this::loadEmojiIcons); } @Subscribe From d676542dc2f741ba1d821e73d3e7cf9f67df9626 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Thu, 26 Jul 2018 17:55:11 +0200 Subject: [PATCH 09/29] Add support for resizable overlays Add mostly complete support for resizable overlays. Currently only screen markers are supported. Signed-off-by: Tomas Slusny --- .../screenmarkers/ScreenMarkerOverlay.java | 1 + .../java/net/runelite/client/ui/ClientUI.java | 32 +- .../runelite/client/ui/overlay/Overlay.java | 1 + .../client/ui/overlay/OverlayManager.java | 2 +- .../client/ui/overlay/OverlayRenderer.java | 324 +++++++++++++----- 5 files changed, 279 insertions(+), 81 deletions(-) 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 8635378738..e5f110c0c2 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 @@ -48,6 +48,7 @@ public class ScreenMarkerOverlay extends Overlay setPosition(OverlayPosition.DETACHED); setLayer(OverlayLayer.ALWAYS_ON_TOP); setPriority(OverlayPriority.HIGH); + setResizable(true); } @Override 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 41760fda8d..9820dc645e 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 @@ -139,6 +139,7 @@ public class ClientUI private NavigationButton sidebarNavigationButton; private JButton sidebarNavigationJButton; private Dimension lastClientSize; + private Cursor defaultCursor; @Inject private ClientUI( @@ -663,6 +664,24 @@ public class ClientUI giveClientFocus(); } + /** + * Returns current cursor set on game container + * @return awt cursor + */ + public Cursor getCurrentCursor() + { + return container.getCursor(); + } + + /** + * Returns current custom cursor or default system cursor if cursor is not set + * @return awt cursor + */ + public Cursor getDefaultCursor() + { + return defaultCursor != null ? defaultCursor : Cursor.getDefaultCursor(); + } + /** * Changes cursor for client window. Requires ${@link ClientUI#init()} to be called first. * FIXME: This is working properly only on Windows, Linux and Mac are displaying cursor incorrectly @@ -678,7 +697,17 @@ public class ClientUI final java.awt.Point hotspot = new java.awt.Point(0, 0); final Cursor cursorAwt = Toolkit.getDefaultToolkit().createCustomCursor(image, hotspot, name); - container.setCursor(cursorAwt); + defaultCursor = cursorAwt; + setCursor(cursorAwt); + } + + /** + * Changes cursor for client window. Requires ${@link ClientUI#init()} to be called first. + * @param cursor awt cursor + */ + public void setCursor(final Cursor cursor) + { + container.setCursor(cursor); } /** @@ -692,6 +721,7 @@ public class ClientUI return; } + defaultCursor = null; container.setCursor(Cursor.getDefaultCursor()); } 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 abd2fc3f48..57d5164a8d 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 @@ -49,6 +49,7 @@ public abstract class Overlay implements LayoutableRenderableEntity private OverlayPriority priority = OverlayPriority.NONE; private OverlayLayer layer = OverlayLayer.UNDER_WIDGETS; private final List menuEntries = new ArrayList<>(); + private boolean resizable; protected Overlay() { diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java index 2af17900b3..39e08b3964 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java @@ -263,7 +263,7 @@ public class OverlayManager saveOverlay(overlay); } - private synchronized void rebuildOverlayLayers() + synchronized void rebuildOverlayLayers() { for (OverlayLayer l : OverlayLayer.values()) { 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 34b7715491..21d6993871 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 @@ -28,6 +28,7 @@ import com.google.common.base.MoreObjects; import com.google.common.primitives.Ints; import java.awt.Color; import java.awt.Composite; +import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Paint; @@ -58,6 +59,7 @@ import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyManager; import net.runelite.client.input.MouseAdapter; import net.runelite.client.input.MouseManager; +import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.JagexColors; import net.runelite.client.util.ColorUtil; @@ -68,21 +70,29 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener private static final int BORDER = 5; private static final int BORDER_TOP = BORDER + 15; private static final int PADDING = 2; + private static final int MIN_OVERLAY_SIZE = 32; + private static final int OVERLAY_RESIZE_TOLERANCE = 5; private static final Dimension SNAP_CORNER_SIZE = new Dimension(80, 80); private static final Color SNAP_CORNER_COLOR = new Color(0, 255, 255, 50); private static final Color SNAP_CORNER_ACTIVE_COLOR = new Color(0, 255, 0, 100); private static final Color MOVING_OVERLAY_COLOR = new Color(255, 255, 0, 100); private static final Color MOVING_OVERLAY_ACTIVE_COLOR = new Color(255, 255, 0, 200); + private static final Color MOVING_OVERLAY_RESIZING_COLOR = new Color(255, 0, 255, 200); private final Client client; private final OverlayManager overlayManager; private final RuneLiteConfig runeLiteConfig; + private final ClientUI clientUI; // Overlay movement variables private final Point overlayOffset = new Point(); private final Point mousePosition = new Point(); - private Overlay movedOverlay; + private Overlay currentManagedOverlay; + private Rectangle currentManagedBounds; + private boolean inOverlayManagingMode; + private boolean inOverlayResizingMode; private boolean inOverlayDraggingMode; private boolean inMenuEntryMode; + private boolean startedMovingOverlay; private MenuEntry[] menuEntries; // Overlay state validation @@ -99,11 +109,13 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener final OverlayManager overlayManager, final RuneLiteConfig runeLiteConfig, final MouseManager mouseManager, - final KeyManager keyManager) + final KeyManager keyManager, + final ClientUI clientUI) { this.client = client; this.overlayManager = overlayManager; this.runeLiteConfig = runeLiteConfig; + this.clientUI = clientUI; keyManager.registerKeyListener(this); mouseManager.registerMouseListener(this); } @@ -113,7 +125,8 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener { if (!event.isFocused()) { - inOverlayDraggingMode = false; + inOverlayManagingMode = false; + resetOverlayManagementMode(); inMenuEntryMode = false; menuEntries = null; } @@ -182,7 +195,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener OverlayUtil.setGraphicProperties(graphics); // Draw snap corners - if (layer == OverlayLayer.UNDER_WIDGETS && movedOverlay != null && movedOverlay.getPosition() != OverlayPosition.DETACHED) + if (inOverlayDraggingMode && layer == OverlayLayer.UNDER_WIDGETS && currentManagedOverlay != null && currentManagedOverlay.getPosition() != OverlayPosition.DETACHED) { final OverlayBounds translatedSnapCorners = snapCorners.translated( -SNAP_CORNER_SIZE.width, @@ -274,12 +287,19 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener if (!bounds.isEmpty()) { - if (inOverlayDraggingMode) + if (inOverlayManagingMode) { - final Color previous = graphics.getColor(); - graphics.setColor(movedOverlay == overlay ? MOVING_OVERLAY_ACTIVE_COLOR : MOVING_OVERLAY_COLOR); + if (inOverlayResizingMode && currentManagedOverlay == overlay) + { + graphics.setColor(MOVING_OVERLAY_RESIZING_COLOR); + } + else + { + graphics.setColor(inOverlayDraggingMode && currentManagedOverlay == overlay ? MOVING_OVERLAY_ACTIVE_COLOR : MOVING_OVERLAY_COLOR); + } + graphics.draw(bounds); - graphics.setColor(previous); + graphics.setPaint(paint); } if (!client.isMenuOpen() && !client.getSpellSelected() && bounds.contains(mouse)) @@ -299,7 +319,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener @Override public MouseEvent mousePressed(MouseEvent mouseEvent) { - if (!inOverlayDraggingMode) + if (!inOverlayManagingMode) { return mouseEvent; } @@ -307,112 +327,248 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener final Point mousePoint = mouseEvent.getPoint(); mousePosition.setLocation(mousePoint); - synchronized (overlayManager) + if (currentManagedOverlay == null) { - for (Overlay overlay : overlayManager.getOverlays()) + return mouseEvent; + } + + if (SwingUtilities.isRightMouseButton(mouseEvent)) + { + overlayManager.resetOverlay(currentManagedOverlay); + } + else if (SwingUtilities.isLeftMouseButton(mouseEvent)) + { + final Point offset = new Point(mousePoint.x, mousePoint.y); + offset.translate(-currentManagedOverlay.getBounds().x, -currentManagedOverlay.getBounds().y); + overlayOffset.setLocation(offset); + + inOverlayResizingMode = currentManagedOverlay != null && currentManagedOverlay.isResizable() && clientUI.getCurrentCursor() != clientUI.getDefaultCursor(); + inOverlayDraggingMode = !inOverlayResizingMode; + startedMovingOverlay = true; + currentManagedBounds = new Rectangle(currentManagedOverlay.getBounds()); + } + else + { + return mouseEvent; + } + + mouseEvent.consume(); + return mouseEvent; + } + + @Override + public MouseEvent mouseMoved(MouseEvent mouseEvent) + { + if (!inOverlayManagingMode) + { + return mouseEvent; + } + + final Point mousePoint = mouseEvent.getPoint(); + mousePosition.setLocation(mousePoint); + + if (!inOverlayResizingMode && !inOverlayDraggingMode) + { + currentManagedOverlay = null; + + synchronized (overlayManager) { - final OverlayPosition overlayPosition = getCorrectedOverlayPosition(overlay); - - if (overlayPosition == OverlayPosition.DYNAMIC || overlayPosition == OverlayPosition.TOOLTIP) + for (Overlay overlay : overlayManager.getOverlays()) { - continue; - } - - if (overlay.getBounds().contains(mousePoint)) - { - if (SwingUtilities.isRightMouseButton(mouseEvent)) + final Rectangle bounds = overlay.getBounds(); + if (bounds.contains(mousePoint)) { - overlayManager.resetOverlay(overlay); + currentManagedOverlay = overlay; + break; } - else - { - final Point offset = new Point(mousePoint.x, mousePoint.y); - offset.translate(-overlay.getBounds().x, -overlay.getBounds().y); - overlayOffset.setLocation(offset); - - mousePoint.translate(-offset.x, -offset.y); - movedOverlay = overlay; - movedOverlay.setPreferredPosition(null); - movedOverlay.setPreferredLocation(mousePoint); - overlayManager.saveOverlay(movedOverlay); - } - - mouseEvent.consume(); - break; } } } + if (currentManagedOverlay == null || !currentManagedOverlay.isResizable()) + { + clientUI.setCursor(clientUI.getDefaultCursor()); + return mouseEvent; + } + + final Rectangle toleranceRect = new Rectangle(currentManagedOverlay.getBounds()); + toleranceRect.grow(-OVERLAY_RESIZE_TOLERANCE, -OVERLAY_RESIZE_TOLERANCE); + final int outcode = toleranceRect.outcode(mouseEvent.getPoint()); + + switch (outcode) + { + case Rectangle.OUT_TOP: + clientUI.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); + break; + case Rectangle.OUT_TOP | Rectangle.OUT_LEFT: + clientUI.setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR)); + break; + case Rectangle.OUT_LEFT: + clientUI.setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); + break; + case Rectangle.OUT_LEFT | Rectangle.OUT_BOTTOM: + clientUI.setCursor(Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR)); + break; + case Rectangle.OUT_BOTTOM: + clientUI.setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR)); + break; + case Rectangle.OUT_BOTTOM | Rectangle.OUT_RIGHT: + clientUI.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR)); + break; + case Rectangle.OUT_RIGHT: + clientUI.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); + break; + case Rectangle.OUT_RIGHT | Rectangle.OUT_TOP: + clientUI.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR)); + break; + default: + // center + clientUI.setCursor(clientUI.getDefaultCursor()); + } + return mouseEvent; } @Override public MouseEvent mouseDragged(MouseEvent mouseEvent) { - if (!inOverlayDraggingMode) + if (!inOverlayManagingMode) + { + return mouseEvent; + } + + final Point p = mouseEvent.getPoint(); + mousePosition.setLocation(p); + + if (currentManagedOverlay == null) { return mouseEvent; } - final Point mousePoint = mouseEvent.getPoint(); - mousePosition.setLocation(mousePoint); final Rectangle canvasRect = new Rectangle(client.getRealDimensions()); - if (!canvasRect.contains(mousePoint)) + if (!canvasRect.contains(p)) { return mouseEvent; } - if (movedOverlay != null) + if (inOverlayResizingMode) + { + final Rectangle r = currentManagedBounds; + + final int dx = p.x - r.x; + final int dy = p.y - r.y; + switch (clientUI.getCurrentCursor().getType()) + { + case Cursor.N_RESIZE_CURSOR: + int height = r.height - dy; + r.setRect(r.x, r.y + dy, r.width, height); + break; + case Cursor.NW_RESIZE_CURSOR: + int width = r.width - dx; + height = r.height - dy; + r.setRect(r.x + dx, r.y + dy, width, height); + break; + case Cursor.W_RESIZE_CURSOR: + width = r.width - dx; + r.setRect(r.x + dx, r.y, width, r.height); + break; + case Cursor.SW_RESIZE_CURSOR: + width = r.width - dx; + height = dy; + r.setRect(r.x + dx, r.y, width, height); + break; + case Cursor.S_RESIZE_CURSOR: + height = dy; + r.setRect(r.x, r.y, r.width, height); + break; + case Cursor.SE_RESIZE_CURSOR: + width = dx; + height = dy; + r.setRect(r.x, r.y, width, height); + break; + case Cursor.E_RESIZE_CURSOR: + width = dx; + r.setRect(r.x, r.y, width, r.height); + break; + case Cursor.NE_RESIZE_CURSOR: + width = dx; + height = r.height - dy; + r.setRect(r.x, r.y + dy, width, height); + break; + default: + // center + } + + currentManagedOverlay.setPreferredSize(new Dimension(Math.max(MIN_OVERLAY_SIZE, currentManagedBounds.width), Math.max(MIN_OVERLAY_SIZE, currentManagedBounds.height))); + + if (currentManagedOverlay.getPreferredLocation() != null) + { + currentManagedOverlay.setPreferredLocation(currentManagedBounds.getLocation()); + } + } + else if (inOverlayDraggingMode) { final Dimension realDimension = client.getRealDimensions(); - mousePoint.translate(-overlayOffset.x, -overlayOffset.y); - mousePoint.x = Ints.constrainToRange(mousePoint.x, 0, Math.max(0, realDimension.width - movedOverlay.getBounds().width)); - mousePoint.y = Ints.constrainToRange(mousePoint.y, 0, Math.max(0, realDimension.height - movedOverlay.getBounds().height)); - movedOverlay.setPreferredPosition(null); - movedOverlay.setPreferredLocation(mousePoint); - mouseEvent.consume(); + p.translate(-overlayOffset.x, -overlayOffset.y); + p.x = Ints.constrainToRange(p.x, 0, Math.max(0, realDimension.width - currentManagedOverlay.getBounds().width)); + p.y = Ints.constrainToRange(p.y, 0, Math.max(0, realDimension.height - currentManagedOverlay.getBounds().height)); + currentManagedOverlay.setPreferredPosition(null); + currentManagedOverlay.setPreferredLocation(p); + } + else + { + return mouseEvent; } + if (startedMovingOverlay) + { + // Move currently moved overlay to correct layer + overlayManager.rebuildOverlayLayers(); + startedMovingOverlay = false; + } + + mouseEvent.consume(); return mouseEvent; } @Override public MouseEvent mouseReleased(MouseEvent mouseEvent) { - if (movedOverlay != null) + if (!inOverlayManagingMode || currentManagedOverlay == null || (!inOverlayDraggingMode && !inOverlayResizingMode)) { - mousePosition.setLocation(-1, -1); - - // do not snapcorner detached overlays - if (movedOverlay.getPosition() != OverlayPosition.DETACHED) - { - final OverlayBounds snapCorners = this.snapCorners.translated(-SNAP_CORNER_SIZE.width, -SNAP_CORNER_SIZE.height); - - for (Rectangle snapCorner : snapCorners.getBounds()) - { - if (snapCorner.contains(mouseEvent.getPoint())) - { - OverlayPosition position = snapCorners.fromBounds(snapCorner); - - if (position == movedOverlay.getPosition()) - { - // overlay moves back to default position - position = null; - } - - movedOverlay.setPreferredPosition(position); - movedOverlay.setPreferredLocation(null); // from dragging - break; - } - } - } - - overlayManager.saveOverlay(movedOverlay); - movedOverlay = null; - mouseEvent.consume(); + return mouseEvent; } + mousePosition.setLocation(-1, -1); + + // do not snapcorner detached overlays + if (currentManagedOverlay.getPosition() != OverlayPosition.DETACHED && inOverlayDraggingMode) + { + final OverlayBounds snapCorners = this.snapCorners.translated(-SNAP_CORNER_SIZE.width, -SNAP_CORNER_SIZE.height); + + for (Rectangle snapCorner : snapCorners.getBounds()) + { + if (snapCorner.contains(mouseEvent.getPoint())) + { + OverlayPosition position = snapCorners.fromBounds(snapCorner); + + if (position == currentManagedOverlay.getPosition()) + { + // overlay moves back to default position + position = null; + } + + currentManagedOverlay.setPreferredPosition(position); + currentManagedOverlay.setPreferredLocation(null); // from dragging + break; + } + } + } + + overlayManager.saveOverlay(currentManagedOverlay); + resetOverlayManagementMode(); + mouseEvent.consume(); return mouseEvent; } @@ -426,7 +582,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener { if (e.isAltDown()) { - inOverlayDraggingMode = true; + inOverlayManagingMode = true; } if (e.isShiftDown() && runeLiteConfig.menuEntryShift()) @@ -440,7 +596,8 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener { if (!e.isAltDown()) { - inOverlayDraggingMode = false; + inOverlayManagingMode = false; + resetOverlayManagementMode(); } if (!e.isShiftDown()) @@ -526,6 +683,15 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener return overlayPosition; } + private void resetOverlayManagementMode() + { + inOverlayResizingMode = false; + inOverlayDraggingMode = false; + currentManagedOverlay = null; + currentManagedBounds = null; + clientUI.setCursor(clientUI.getDefaultCursor()); + } + private boolean shouldInvalidateBounds() { final Widget chatbox = client.getWidget(WidgetInfo.CHATBOX); From d881a2fb99606690b83e7f5ebbebcf19ed46f7f0 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Mon, 27 Aug 2018 21:31:33 +0200 Subject: [PATCH 10/29] Make overlay resizing configure wrapping Instead of resizing every overlay component inside wrapped panel component simply adjust wrap based on preferred size. Also remove the configurable wrap after. Signed-off-by: Tomas Slusny --- .../client/config/RuneLiteConfig.java | 11 ----- .../InventoryViewerOverlay.java | 3 +- .../plugins/teamcapes/TeamCapesOverlay.java | 2 +- .../ui/overlay/components/PanelComponent.java | 43 ++++++++++++++----- .../ui/overlay/infobox/InfoBoxOverlay.java | 13 ++++-- 5 files changed, 46 insertions(+), 26 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index 11a8b3deb7..2de1e6d9d1 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -266,17 +266,6 @@ public interface RuneLiteConfig extends Config return false; } - @ConfigItem( - keyName = "infoBoxWrap", - name = "Infobox wrap count", - description = "Configures the amount of infoboxes shown before wrapping", - position = 41 - ) - default int infoBoxWrap() - { - return 4; - } - @ConfigItem( keyName = "infoBoxSize", name = "Infobox size", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java index f323b96afc..0eb2967b4c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java @@ -57,8 +57,9 @@ class InventoryViewerOverlay extends Overlay private InventoryViewerOverlay(Client client, ItemManager itemManager) { setPosition(OverlayPosition.BOTTOM_RIGHT); - panelComponent.setWrapping(4); + panelComponent.setWrap(true); panelComponent.setGap(new Point(6, 4)); + panelComponent.setPreferredSize(new Dimension(4 * (Constants.ITEM_SPRITE_WIDTH + 6), 0)); panelComponent.setOrientation(ComponentOrientation.HORIZONTAL); this.itemManager = itemManager; this.client = client; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java index 9dbd2dc861..0aeab043cd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java @@ -56,8 +56,8 @@ public class TeamCapesOverlay extends Overlay this.plugin = plugin; this.config = config; this.manager = manager; + panelComponent.setWrap(true); panelComponent.setOrientation(ComponentOrientation.HORIZONTAL); - panelComponent.setWrapping(4); getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Teamcapes overlay")); } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java index 5fb373621c..fbdccdaa54 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java @@ -44,6 +44,7 @@ public class PanelComponent implements LayoutableRenderableEntity private Point preferredLocation = new Point(); @Setter + @Getter private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0); @Setter @@ -57,7 +58,7 @@ public class PanelComponent implements LayoutableRenderableEntity private ComponentOrientation orientation = ComponentOrientation.VERTICAL; @Setter - private int wrapping = -1; + private boolean wrap = false; @Setter private Rectangle border = new Rectangle( @@ -111,11 +112,23 @@ public class PanelComponent implements LayoutableRenderableEntity int totalWidth = 0; // Render all children - for (int i = 0; i < children.size(); i ++) + for (final LayoutableRenderableEntity child : children) { - final LayoutableRenderableEntity child = children.get(i); + // Correctly propagate child dimensions based on orientation and wrapping + if (!wrap) + { + switch (orientation) + { + case VERTICAL: + child.setPreferredSize(new Dimension(childPreferredSize.width, 0)); + break; + case HORIZONTAL: + child.setPreferredSize(new Dimension(0, childPreferredSize.height)); + break; + } + } + child.setPreferredLocation(new Point(x, y)); - child.setPreferredSize(childPreferredSize); final Dimension childDimension = child.render(graphics); switch (orientation) @@ -136,28 +149,38 @@ public class PanelComponent implements LayoutableRenderableEntity totalWidth = Math.max(totalWidth, width); totalHeight = Math.max(totalHeight, height); - if (wrapping > 0 && i < children.size() - 1 && (i + 1) % wrapping == 0) + if (!wrap) { - switch (orientation) + continue; + } + + switch (orientation) + { + case VERTICAL: { - case VERTICAL: + if (childPreferredSize.height > 0 && height >= childPreferredSize.height) { height = 0; y = baseY; int diff = childDimension.width + gap.x; x += diff; width += diff; - break; } - case HORIZONTAL: + + break; + } + case HORIZONTAL: + { + if (childPreferredSize.width > 0 && width >= childPreferredSize.width) { width = 0; x = baseX; int diff = childDimension.height + gap.y; y += diff; height += diff; - break; } + + break; } } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java index 08412783f1..516e0359ae 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java @@ -48,6 +48,9 @@ import net.runelite.client.ui.overlay.tooltip.TooltipManager; @Singleton public class InfoBoxOverlay extends Overlay { + private static final int GAP = 1; + private static final int DEFAULT_WRAP_COUNT = 4; + private final PanelComponent panelComponent = new PanelComponent(); private final InfoBoxManager infoboxManager; private final TooltipManager tooltipManager; @@ -67,9 +70,10 @@ public class InfoBoxOverlay extends Overlay this.config = config; setPosition(OverlayPosition.TOP_LEFT); + panelComponent.setWrap(true); panelComponent.setBackgroundColor(null); panelComponent.setBorder(new Rectangle()); - panelComponent.setGap(new Point(1, 1)); + panelComponent.setGap(new Point(GAP, GAP)); } @Override @@ -83,11 +87,13 @@ public class InfoBoxOverlay extends Overlay } panelComponent.getChildren().clear(); - panelComponent.setWrapping(config.infoBoxWrap()); + + // Set preferred size to the size of DEFAULT_WRAP_COUNT infoboxes, including the padding - which is applied + // to the last infobox prior to wrapping too. + panelComponent.setPreferredSize(new Dimension(DEFAULT_WRAP_COUNT * (config.infoBoxSize() + GAP), DEFAULT_WRAP_COUNT * (config.infoBoxSize() + GAP))); panelComponent.setOrientation(config.infoBoxVertical() ? ComponentOrientation.VERTICAL : ComponentOrientation.HORIZONTAL); - panelComponent.setPreferredSize(new Dimension(config.infoBoxSize(), config.infoBoxSize())); for (InfoBox box : infoBoxes) { @@ -107,6 +113,7 @@ public class InfoBoxOverlay extends Overlay } infoBoxComponent.setImage(box.getScaledImage()); infoBoxComponent.setTooltip(box.getTooltip()); + infoBoxComponent.setPreferredSize(new Dimension(config.infoBoxSize(), config.infoBoxSize())); panelComponent.getChildren().add(infoBoxComponent); } From 2647997bef00af5f2aa57bfcf5a68c6a0ebe0f40 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Tue, 28 Aug 2018 14:10:58 +0200 Subject: [PATCH 11/29] Add OverlayPanel that contains PanelComponent Add generic OverlayPanel class that uses PanelComponent as its backing component. Signed-off-by: Tomas Slusny --- .../client/ui/overlay/OverlayPanel.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPanel.java diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPanel.java new file mode 100644 index 0000000000..4ccbdebc70 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPanel.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import lombok.Getter; +import lombok.Setter; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.overlay.components.ComponentConstants; +import net.runelite.client.ui.overlay.components.PanelComponent; + +@Getter +@Setter +public abstract class OverlayPanel extends Overlay +{ + protected final PanelComponent panelComponent = new PanelComponent(); + + /** + * Enables/disables automatic clearing of {@link this#getPanelComponent()} children after rendering (enabled by default) + */ + private boolean clearChildren = true; + + /** + * Enables/disables automatic font size changes based on panel component size relative to default panel component size. + */ + private boolean dynamicFont = false; + + protected OverlayPanel() + { + super(); + setResizable(true); + } + + protected OverlayPanel(Plugin plugin) + { + super(plugin); + setResizable(true); + } + + @Override + public Dimension render(final Graphics2D graphics) + { + final Dimension oldSize = panelComponent.getPreferredSize(); + + if (getPreferredSize() != null) + { + panelComponent.setPreferredSize(getPreferredSize()); + + if (dynamicFont) + { + if (getPreferredSize().width >= ComponentConstants.STANDARD_WIDTH * 1.3) + { + graphics.setFont(FontManager.getRunescapeBoldFont()); + } + else if (getPreferredSize().width <= ComponentConstants.STANDARD_WIDTH * 0.8) + { + graphics.setFont(FontManager.getRunescapeSmallFont()); + } + } + } + + final Dimension dimension = panelComponent.render(graphics); + + if (clearChildren) + { + panelComponent.getChildren().clear(); + } + + panelComponent.setPreferredSize(oldSize); + return dimension; + } +} From 35ebe5c65f3d007d9d35f6a544eace434a57878b Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 4 Apr 2020 01:25:44 +0200 Subject: [PATCH 12/29] Make overlays use OverlayPanel instead of Overlay Make overlays that were previously using PanelComponent use OverlayPanel. Signed-off-by: Tomas Slusny --- .../plugins/agility/LapCounterOverlay.java | 10 +++----- .../attackstyles/AttackStylesOverlay.java | 9 +++---- .../barrows/BarrowsBrotherSlainOverlay.java | 10 +++----- .../BlastFurnaceCofferOverlay.java | 12 ++++------ .../blastfurnace/BlastFurnaceOverlay.java | 14 ++++------- .../blastmine/BlastMineOreCountOverlay.java | 10 +++----- .../client/plugins/boosts/BoostsOverlay.java | 12 ++++------ .../cluescrolls/ClueScrollOverlay.java | 12 +++------- .../cluescrolls/clues/HotColdClue.java | 3 --- .../plugins/cooking/CookingOverlay.java | 12 ++++------ .../plugins/corp/CorpDamageOverlay.java | 11 +++------ .../plugins/devtools/CameraOverlay.java | 11 +++------ .../plugins/devtools/LocationOverlay.java | 10 +++----- .../plugins/devtools/SoundEffectOverlay.java | 10 ++++---- .../client/plugins/dpscounter/DpsOverlay.java | 11 +++------ .../plugins/fishing/FishingOverlay.java | 12 ++++------ .../InventoryViewerOverlay.java | 11 +++------ .../KourendLibraryTutorialOverlay.java | 17 +++++-------- .../motherlode/MotherlodeGemOverlay.java | 9 +++---- .../motherlode/MotherlodeOreOverlay.java | 9 +++---- .../plugins/motherlode/MotherlodeOverlay.java | 24 ++++--------------- .../nightmarezone/NightmareZoneOverlay.java | 9 +++---- .../NpcAggroAreaNotWorkingOverlay.java | 11 ++++----- .../opponentinfo/OpponentInfoOverlay.java | 11 +++------ .../plugins/party/PartyStatsOverlay.java | 18 +++++++------- .../client/plugins/raids/RaidsOverlay.java | 12 ++++------ .../plugins/smelting/SmeltingOverlay.java | 11 +++------ .../plugins/teamcapes/TeamCapesOverlay.java | 10 +++----- .../plugins/wintertodt/WintertodtOverlay.java | 11 +++------ .../woodcutting/WoodcuttingOverlay.java | 10 +++----- .../plugins/xptracker/XpInfoBoxOverlay.java | 23 +++++++----------- .../ui/overlay/infobox/InfoBoxOverlay.java | 12 ++++------ 32 files changed, 119 insertions(+), 258 deletions(-) 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 d1df2ea98f..b6bdd132d0 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 @@ -30,21 +30,18 @@ import java.time.Duration; import java.time.Instant; import javax.inject.Inject; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -class LapCounterOverlay extends Overlay +class LapCounterOverlay extends OverlayPanel { private final AgilityPlugin plugin; private final AgilityConfig config; - private final PanelComponent panelComponent = new PanelComponent(); - @Inject private LapCounterOverlay(AgilityPlugin plugin, AgilityConfig config) { @@ -79,7 +76,6 @@ class LapCounterOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); panelComponent.getChildren().add(LineComponent.builder() .left("Total Laps:") .right(Integer.toString(session.getTotalLaps())) @@ -93,6 +89,6 @@ class LapCounterOverlay extends Overlay .build()); } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java index 834b5d4ef0..9ef2cfe762 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java @@ -29,18 +29,16 @@ import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -class AttackStylesOverlay extends Overlay +class AttackStylesOverlay extends OverlayPanel { private final AttackStylesPlugin plugin; private final AttackStylesConfig config; - private final PanelComponent panelComponent = new PanelComponent(); @Inject private AttackStylesOverlay(AttackStylesPlugin plugin, AttackStylesConfig config) @@ -55,7 +53,6 @@ class AttackStylesOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - panelComponent.getChildren().clear(); boolean warnedSkillSelected = plugin.isWarnedSkillSelected(); if (warnedSkillSelected || config.alwaysShowStyle()) @@ -78,7 +75,7 @@ class AttackStylesOverlay extends Overlay graphics.getFontMetrics().stringWidth(attackStyleString) + 10, 0)); - return panelComponent.render(graphics); + return super.render(graphics); } return null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java index 678ed41834..b3cceb6d66 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java @@ -33,18 +33,16 @@ import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.Varbits; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -public class BarrowsBrotherSlainOverlay extends Overlay +public class BarrowsBrotherSlainOverlay extends OverlayPanel { private final Client client; - private final PanelComponent panelComponent = new PanelComponent(); @Inject private BarrowsBrotherSlainOverlay(BarrowsPlugin plugin, Client client) @@ -74,8 +72,6 @@ public class BarrowsBrotherSlainOverlay extends Overlay potential.setHidden(true); } - panelComponent.getChildren().clear(); - for (BarrowsBrothers brother : BarrowsBrothers.values()) { final boolean brotherSlain = client.getVar(brother.getKilledVarbit()) > 0; @@ -94,6 +90,6 @@ public class BarrowsBrotherSlainOverlay extends Overlay .rightColor(rewardPercent >= 73.0f && rewardPercent <= 88.0f ? Color.GREEN : rewardPercent < 65.6f ? Color.WHITE : Color.YELLOW) .build()); - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java index 758573a583..1b93f8f640 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java @@ -32,23 +32,21 @@ import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import static net.runelite.api.Varbits.BLAST_FURNACE_COFFER; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; -import static org.apache.commons.lang3.time.DurationFormatUtils.formatDuration; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.util.QuantityFormatter; +import static org.apache.commons.lang3.time.DurationFormatUtils.formatDuration; -class BlastFurnaceCofferOverlay extends Overlay +class BlastFurnaceCofferOverlay extends OverlayPanel { private static final float COST_PER_HOUR = 72000.0f; private final Client client; private final BlastFurnacePlugin plugin; private final BlastFurnaceConfig config; - private final PanelComponent panelComponent = new PanelComponent(); @Inject private BlastFurnaceCofferOverlay(Client client, BlastFurnacePlugin plugin, BlastFurnaceConfig config) @@ -71,8 +69,6 @@ class BlastFurnaceCofferOverlay extends Overlay Widget sack = client.getWidget(WidgetInfo.BLAST_FURNACE_COFFER); - panelComponent.getChildren().clear(); - if (sack != null) { final int coffer = client.getVar(BLAST_FURNACE_COFFER); @@ -95,6 +91,6 @@ class BlastFurnaceCofferOverlay extends Overlay } } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java index 48253cdfe3..d24c8b4d4a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java @@ -31,19 +31,17 @@ import javax.inject.Inject; import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.game.ItemManager; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -class BlastFurnaceOverlay extends Overlay +class BlastFurnaceOverlay extends OverlayPanel { private final Client client; private final BlastFurnacePlugin plugin; - private final PanelComponent imagePanelComponent = new PanelComponent(); @Inject private ItemManager itemManager; @@ -55,7 +53,7 @@ class BlastFurnaceOverlay extends Overlay this.plugin = plugin; this.client = client; setPosition(OverlayPosition.TOP_LEFT); - imagePanelComponent.setOrientation(ComponentOrientation.HORIZONTAL); + panelComponent.setOrientation(ComponentOrientation.HORIZONTAL); getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Blast furnace overlay")); } @@ -67,8 +65,6 @@ class BlastFurnaceOverlay extends Overlay return null; } - imagePanelComponent.getChildren().clear(); - for (BarsOres varbit : BarsOres.values()) { int amount = client.getVar(varbit.getVarbit()); @@ -78,10 +74,10 @@ class BlastFurnaceOverlay extends Overlay continue; } - imagePanelComponent.getChildren().add(new ImageComponent(getImage(varbit.getItemID(), amount))); + panelComponent.getChildren().add(new ImageComponent(getImage(varbit.getItemID(), amount))); } - return imagePanelComponent.render(graphics); + return super.render(graphics); } private BufferedImage getImage(int itemID, int amount) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java index f660eb2b63..ef9336bbee 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastmine/BlastMineOreCountOverlay.java @@ -35,20 +35,18 @@ import net.runelite.api.Varbits; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.game.ItemManager; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -class BlastMineOreCountOverlay extends Overlay +class BlastMineOreCountOverlay extends OverlayPanel { private final Client client; private final BlastMinePluginConfig config; private final ItemManager itemManager; - private final PanelComponent panelComponent = new PanelComponent(); @Inject private BlastMineOreCountOverlay(BlastMinePlugin plugin, Client client, BlastMinePluginConfig config, ItemManager itemManager) @@ -72,8 +70,6 @@ class BlastMineOreCountOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - if (config.showOreOverlay()) { blastMineWidget.setHidden(true); @@ -88,7 +84,7 @@ class BlastMineOreCountOverlay extends Overlay blastMineWidget.setHidden(false); } - return panelComponent.render(graphics); + return super.render(graphics); } private BufferedImage getImage(int itemID, int amount) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java index 8ebc077224..fd53503444 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java @@ -32,20 +32,18 @@ import javax.inject.Inject; import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.Skill; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.util.ColorUtil; -class BoostsOverlay extends Overlay +class BoostsOverlay extends OverlayPanel { private final Client client; private final BoostsConfig config; - private final PanelComponent panelComponent = new PanelComponent(); private final BoostsPlugin plugin; @Inject @@ -68,8 +66,6 @@ class BoostsOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - int nextChange = plugin.getChangeDownTicks(); if (nextChange != -1) @@ -94,7 +90,7 @@ class BoostsOverlay extends Overlay if (boostedSkills.isEmpty()) { - return panelComponent.render(graphics); + return super.render(graphics); } if (plugin.canShowBoosts()) @@ -129,7 +125,7 @@ class BoostsOverlay extends Overlay } } - return panelComponent.render(graphics); + return super.render(graphics); } private Color getTextColor(int boost) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java index 65ab528c5a..1853c64b3f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java @@ -41,15 +41,13 @@ import net.runelite.client.plugins.cluescrolls.clues.item.AnyRequirementCollecti import net.runelite.client.plugins.cluescrolls.clues.item.ItemRequirement; import static net.runelite.client.plugins.cluescrolls.clues.item.ItemRequirements.item; import net.runelite.client.plugins.cluescrolls.clues.item.SingleItemRequirement; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -public class ClueScrollOverlay extends Overlay +public class ClueScrollOverlay extends OverlayPanel { private static final ItemRequirement HAS_SPADE = new SingleItemRequirement(SPADE); private static final ItemRequirement HAS_LIGHT = new AnyRequirementCollection("Light Source", @@ -79,7 +77,6 @@ public class ClueScrollOverlay extends Overlay public static final Color TITLED_CONTENT_COLOR = new Color(190, 190, 190); private final ClueScrollPlugin plugin; - private final PanelComponent panelComponent = new PanelComponent(); private final Client client; @Inject @@ -103,9 +100,6 @@ public class ClueScrollOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - panelComponent.setPreferredSize(new Dimension(ComponentConstants.STANDARD_WIDTH, 0)); - clue.makeOverlayHint(panelComponent, plugin); final Item[] inventoryItems = plugin.getInventoryItems(); @@ -129,6 +123,6 @@ public class ClueScrollOverlay extends Overlay panelComponent.getChildren().add(LineComponent.builder().left("Requires Light Source!").leftColor(Color.RED).build()); } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java index 94d07a4983..60e529e54d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.cluescrolls.clues; import java.awt.Color; -import java.awt.Dimension; import java.awt.Graphics2D; import java.util.Arrays; import java.util.Collection; @@ -59,7 +58,6 @@ import net.runelite.client.ui.overlay.components.TitleComponent; @Slf4j public class HotColdClue extends ClueScroll implements LocationClueScroll, LocationsClueScroll, TextClueScroll, NpcClueScroll { - private static final int HOT_COLD_PANEL_WIDTH = 200; private static final HotColdClue BEGINNER_CLUE = new HotColdClue("Buried beneath the ground, who knows where it's found. Lucky for you, A man called Reldo may have a clue.", "Reldo", "Speak to Reldo to receive a strange device.", @@ -141,7 +139,6 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat panelComponent.getChildren().add(TitleComponent.builder() .text("Hot/Cold Clue") .build()); - panelComponent.setPreferredSize(new Dimension(HOT_COLD_PANEL_WIDTH, 0)); // strange device has not been tested yet, show how to get it if (hotColdSolver.getLastWorldPoint() == null && location == null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java index a2cad2a182..c3f922eab7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java @@ -29,8 +29,8 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.text.DecimalFormat; -import java.time.Instant; import java.time.Duration; +import java.time.Instant; import javax.inject.Inject; import static net.runelite.api.AnimationID.COOKING_FIRE; import static net.runelite.api.AnimationID.COOKING_RANGE; @@ -39,15 +39,14 @@ import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -class CookingOverlay extends Overlay +class CookingOverlay extends OverlayPanel { private static final int COOK_TIMEOUT = 3; private static final DecimalFormat FORMAT = new DecimalFormat("#.#"); @@ -57,7 +56,6 @@ class CookingOverlay extends Overlay private final CookingPlugin plugin; private final CookingConfig config; private final XpTrackerService xpTrackerService; - private final PanelComponent panelComponent = new PanelComponent(); @Inject private CookingOverlay(Client client, CookingPlugin plugin, CookingConfig config, XpTrackerService xpTrackerService) @@ -81,8 +79,6 @@ class CookingOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - if (isCooking() || Duration.between(session.getLastCookingAction(), Instant.now()).getSeconds() < COOK_TIMEOUT) { panelComponent.getChildren().add(TitleComponent.builder() @@ -108,7 +104,7 @@ class CookingOverlay extends Overlay .right(session.getBurnAmount() + (session.getBurnAmount() >= 1 ? " (" + FORMAT.format(session.getBurntPercentage()) + "%)" : "")) .build()); - return panelComponent.render(graphics); + return super.render(graphics); } private boolean isCooking() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java index abc6d7578e..390d7a4270 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java @@ -36,24 +36,21 @@ import net.runelite.api.Varbits; import net.runelite.api.coords.WorldPoint; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; -import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -class CorpDamageOverlay extends Overlay +class CorpDamageOverlay extends OverlayPanel { private final Client client; private final CorpPlugin corpPlugin; private final CorpConfig config; - private final PanelComponent panelComponent = new PanelComponent(); - @Inject private CorpDamageOverlay(Client client, CorpPlugin corpPlugin, CorpConfig config) { @@ -89,8 +86,6 @@ class CorpDamageOverlay extends Overlay // estimate how much damage is required for kill based on number of players int damageForKill = players != 0 ? totalDamage / players : 0; - panelComponent.getChildren().clear(); - NPC core = corpPlugin.getCore(); if (core != null) { @@ -135,6 +130,6 @@ class CorpDamageOverlay extends Overlay .build()); } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java index 882fe4201c..f8ee0e9b11 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java @@ -28,24 +28,21 @@ import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; import net.runelite.api.Client; -import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -public class CameraOverlay extends Overlay +public class CameraOverlay extends OverlayPanel { private final Client client; private final DevToolsPlugin plugin; - private final PanelComponent panelComponent = new PanelComponent(); @Inject CameraOverlay(Client client, DevToolsPlugin plugin) { this.client = client; this.plugin = plugin; - panelComponent.setPreferredSize(new Dimension(150, 0)); setPosition(OverlayPosition.TOP_LEFT); } @@ -57,8 +54,6 @@ public class CameraOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - panelComponent.getChildren().add(TitleComponent.builder() .text("Camera") .build()); @@ -93,6 +88,6 @@ public class CameraOverlay extends Overlay .right("" + client.getScale()) .build()); - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java index e9f9d2b608..6da0a75c0a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java @@ -32,23 +32,20 @@ import net.runelite.api.Client; import static net.runelite.api.Constants.CHUNK_SIZE; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; -import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -public class LocationOverlay extends Overlay +public class LocationOverlay extends OverlayPanel { private final Client client; private final DevToolsPlugin plugin; - private final PanelComponent panelComponent = new PanelComponent(); @Inject LocationOverlay(Client client, DevToolsPlugin plugin) { this.client = client; this.plugin = plugin; - panelComponent.setPreferredSize(new Dimension(150, 0)); setPosition(OverlayPosition.TOP_LEFT); } @@ -60,7 +57,6 @@ public class LocationOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); WorldPoint localWorld = client.getLocalPlayer().getWorldLocation(); LocalPoint localPoint = client.getLocalPlayer().getLocalLocation(); @@ -117,6 +113,6 @@ public class LocationOverlay extends Overlay .build()); } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java index cb99746a90..4212478d2a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java @@ -34,12 +34,11 @@ import net.runelite.api.coords.LocalPoint; import net.runelite.api.events.AreaSoundEffectPlayed; import net.runelite.api.events.SoundEffectPlayed; import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -class SoundEffectOverlay extends Overlay +class SoundEffectOverlay extends OverlayPanel { private final static int MAX_LINES = 16; private final static Color COLOR_SOUND_EFFECT = Color.WHITE; @@ -48,18 +47,17 @@ class SoundEffectOverlay extends Overlay private final Client client; private final DevToolsPlugin plugin; - private final PanelComponent panelComponent = new PanelComponent(); @Inject SoundEffectOverlay(Client client, DevToolsPlugin plugin) { this.client = client; this.plugin = plugin; - panelComponent.setPreferredSize(new Dimension(200, 0)); panelComponent.getChildren().add(LineComponent.builder() .left("Sound Effects") .leftColor(Color.CYAN) .build()); + setClearChildren(false); setPosition(OverlayPosition.TOP_LEFT); } @@ -71,7 +69,7 @@ class SoundEffectOverlay extends Overlay return null; } - return panelComponent.render(graphics); + return super.render(graphics); } @Subscribe diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsOverlay.java index 44b31c481c..ead4ded77e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsOverlay.java @@ -34,18 +34,17 @@ import javax.inject.Inject; import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; import net.runelite.api.Player; -import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; import net.runelite.client.util.QuantityFormatter; import net.runelite.client.ws.PartyService; -class DpsOverlay extends Overlay +class DpsOverlay extends OverlayPanel { private static final DecimalFormat DPS_FORMAT = new DecimalFormat("#0.0"); private static final int PANEL_WIDTH_OFFSET = 10; // assumes 8 for panel component border + 2px between left and right @@ -60,8 +59,6 @@ class DpsOverlay extends Overlay private final Client client; private final TooltipManager tooltipManager; - private final PanelComponent panelComponent = new PanelComponent(); - @Inject DpsOverlay(DpsCounterPlugin dpsCounterPlugin, DpsConfig dpsConfig, PartyService partyService, Client client, TooltipManager tooltipManager) @@ -108,8 +105,6 @@ class DpsOverlay extends Overlay DpsMember total = dpsCounterPlugin.getTotal(); boolean paused = total.isPaused(); - panelComponent.getChildren().clear(); - final String title = (inParty ? "Party " : "") + (showDamage ? "Damage" : "DPS") + (paused ? " (paused)" : ""); panelComponent.getChildren().add( TitleComponent.builder() @@ -151,7 +146,7 @@ class DpsOverlay extends Overlay } } - return panelComponent.render(graphics); + return super.render(graphics); } void setPaused(boolean paused) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java index 96b023f95f..084e0f1534 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java @@ -24,12 +24,12 @@ */ package net.runelite.client.plugins.fishing; +import com.google.common.collect.ImmutableSet; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.util.Set; import javax.inject.Inject; -import com.google.common.collect.ImmutableSet; import net.runelite.api.AnimationID; import net.runelite.api.Client; import net.runelite.api.GraphicID; @@ -37,15 +37,14 @@ import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -class FishingOverlay extends Overlay +class FishingOverlay extends OverlayPanel { private static final String FISHING_SPOT = "Fishing spot"; static final String FISHING_RESET = "Reset"; @@ -77,8 +76,6 @@ class FishingOverlay extends Overlay private final FishingConfig config; private final XpTrackerService xpTrackerService; - private final PanelComponent panelComponent = new PanelComponent(); - @Inject public FishingOverlay(Client client, FishingPlugin plugin, FishingConfig config, XpTrackerService xpTrackerService) { @@ -100,7 +97,6 @@ class FishingOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); if (client.getLocalPlayer().getInteracting() != null && client.getLocalPlayer().getInteracting().getName().contains(FISHING_SPOT) && client.getLocalPlayer().getInteracting().getGraphic() != GraphicID.FLYING_FISH @@ -136,6 +132,6 @@ class FishingOverlay extends Overlay } } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java index 0eb2967b4c..e69f29be98 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/inventoryviewer/InventoryViewerOverlay.java @@ -36,13 +36,12 @@ import net.runelite.api.Item; import net.runelite.api.ItemComposition; import net.runelite.api.ItemContainer; import net.runelite.client.game.ItemManager; -import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -class InventoryViewerOverlay extends Overlay +class InventoryViewerOverlay extends OverlayPanel { private static final int INVENTORY_SIZE = 28; private static final ImageComponent PLACEHOLDER_IMAGE = new ImageComponent( @@ -51,8 +50,6 @@ class InventoryViewerOverlay extends Overlay private final Client client; private final ItemManager itemManager; - private final PanelComponent panelComponent = new PanelComponent(); - @Inject private InventoryViewerOverlay(Client client, ItemManager itemManager) { @@ -75,8 +72,6 @@ class InventoryViewerOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - final Item[] items = itemContainer.getItems(); for (int i = 0; i < INVENTORY_SIZE; i++) @@ -99,7 +94,7 @@ class InventoryViewerOverlay extends Overlay panelComponent.getChildren().add(PLACEHOLDER_IMAGE); } - return panelComponent.render(graphics); + return super.render(graphics); } private BufferedImage getImage(Item item) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryTutorialOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryTutorialOverlay.java index 6d6f3b4796..0ad6103c09 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryTutorialOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryTutorialOverlay.java @@ -24,25 +24,23 @@ */ package net.runelite.client.plugins.kourendlibrary; +import java.awt.Dimension; +import java.awt.Graphics2D; +import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.Player; import net.runelite.api.coords.WorldPoint; -import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -import javax.inject.Inject; -import java.awt.Dimension; -import java.awt.Graphics2D; -class KourendLibraryTutorialOverlay extends Overlay +class KourendLibraryTutorialOverlay extends OverlayPanel { private final Client client; private final KourendLibraryConfig config; private final Library library; - private final PanelComponent panelComponent; private final LineComponent noDataMessageComponent; private final LineComponent incompleteMessageComponent; private final LineComponent completeMessageComponent; @@ -55,7 +53,6 @@ class KourendLibraryTutorialOverlay extends Overlay this.config = config; this.library = library; - panelComponent = new PanelComponent(); panelComponent.setPreferredSize(new Dimension(177, 0)); noDataMessageComponent = LineComponent.builder().left("Click on the white squares to start finding books.").build(); @@ -87,8 +84,6 @@ class KourendLibraryTutorialOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - switch (library.getState()) { case NO_DATA: @@ -104,6 +99,6 @@ class KourendLibraryTutorialOverlay extends Overlay break; } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java index f1f6fa92a3..2406b85737 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java @@ -30,20 +30,18 @@ import java.time.Duration; import java.time.Instant; import javax.inject.Inject; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -public class MotherlodeGemOverlay extends Overlay +public class MotherlodeGemOverlay extends OverlayPanel { private final MotherlodePlugin plugin; private final MotherlodeSession motherlodeSession; private final MotherlodeConfig config; - private final PanelComponent panelComponent = new PanelComponent(); @Inject MotherlodeGemOverlay(MotherlodePlugin plugin, MotherlodeSession motherlodeSession, MotherlodeConfig config) @@ -79,7 +77,6 @@ public class MotherlodeGemOverlay extends Overlay int emeraldsFound = session.getEmeraldsFound(); int sapphiresFound = session.getSapphiresFound(); - panelComponent.getChildren().clear(); panelComponent.getChildren().add(TitleComponent.builder().text("Gems found").build()); if (diamondsFound > 0) @@ -114,6 +111,6 @@ public class MotherlodeGemOverlay extends Overlay .build()); } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java index 9f3af1625f..83a85bd4fb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java @@ -27,18 +27,16 @@ package net.runelite.client.plugins.motherlode; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -public class MotherlodeOreOverlay extends Overlay +public class MotherlodeOreOverlay extends OverlayPanel { private final MotherlodePlugin plugin; private final MotherlodeSession motherlodeSession; private final MotherlodeConfig config; - private final PanelComponent panelComponent = new PanelComponent(); @Inject MotherlodeOreOverlay(MotherlodePlugin plugin, MotherlodeSession motherlodeSession, MotherlodeConfig config) @@ -73,7 +71,6 @@ public class MotherlodeOreOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); panelComponent.getChildren().add(TitleComponent.builder().text("Ores found").build()); if (nuggetsFound > 0) @@ -124,6 +121,6 @@ public class MotherlodeOreOverlay extends Overlay .build()); } - return panelComponent.render(graphics); + return super.render(graphics); } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java index 7ac14372a3..1abe210ef8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java @@ -32,29 +32,16 @@ import java.time.Duration; import java.time.Instant; import java.util.Set; import javax.inject.Inject; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_ADAMANT; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_BLACK; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_BRONZE; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_CRYSTAL; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON_OR; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON_UPGRADED; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_GILDED; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_INFERNAL; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_IRON; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_MITHRIL; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_RUNE; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_STEEL; +import static net.runelite.api.AnimationID.*; import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; -import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -class MotherlodeOverlay extends Overlay +class MotherlodeOverlay extends OverlayPanel { private static final Set MINING_ANIMATION_IDS = ImmutableSet.of( MINING_MOTHERLODE_BRONZE, MINING_MOTHERLODE_IRON, MINING_MOTHERLODE_STEEL, @@ -69,7 +56,6 @@ class MotherlodeOverlay extends Overlay private final MotherlodePlugin plugin; private final MotherlodeSession motherlodeSession; private final MotherlodeConfig config; - private final PanelComponent panelComponent = new PanelComponent(); @Inject MotherlodeOverlay(Client client, MotherlodePlugin plugin, MotherlodeSession motherlodeSession, MotherlodeConfig config) @@ -106,8 +92,6 @@ class MotherlodeOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - if (config.showMiningState()) { if (MINING_ANIMATION_IDS.contains(client.getLocalPlayer().getAnimation())) @@ -136,6 +120,6 @@ class MotherlodeOverlay extends Overlay .right(session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : "") .build()); - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java index feacb57e4a..679f773913 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java @@ -35,17 +35,16 @@ import net.runelite.api.Varbits; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.game.ItemManager; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.QuantityFormatter; -class NightmareZoneOverlay extends Overlay +class NightmareZoneOverlay extends OverlayPanel { private final Client client; private final NightmareZoneConfig config; @@ -54,7 +53,6 @@ class NightmareZoneOverlay extends Overlay private final ItemManager itemManager; private AbsorptionCounter absorptionCounter; - private final PanelComponent panelComponent = new PanelComponent(); @Inject NightmareZoneOverlay( @@ -105,7 +103,6 @@ class NightmareZoneOverlay extends Overlay final int currentPoints = client.getVar(Varbits.NMZ_POINTS); final int totalPoints = currentPoints + client.getVar(VarPlayer.NMZ_REWARD_POINTS); - panelComponent.getChildren().clear(); panelComponent.getChildren().add(LineComponent.builder() .left("Points: ") .right(QuantityFormatter.formatNumber(currentPoints)) @@ -119,7 +116,7 @@ class NightmareZoneOverlay extends Overlay .right(QuantityFormatter.formatNumber(totalPoints)) .build()); - return panelComponent.render(graphics); + return super.render(graphics); } private void renderAbsorptionCounter() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java index 3d238cce85..5c6caed46c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npcunaggroarea/NpcAggroAreaNotWorkingOverlay.java @@ -27,17 +27,15 @@ package net.runelite.client.plugins.npcunaggroarea; import com.google.inject.Inject; import java.awt.Dimension; import java.awt.Graphics2D; -import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -class NpcAggroAreaNotWorkingOverlay extends Overlay +class NpcAggroAreaNotWorkingOverlay extends OverlayPanel { private final NpcAggroAreaPlugin plugin; private final NpcAggroAreaConfig config; - private final PanelComponent panelComponent; @Inject private NpcAggroAreaNotWorkingOverlay(NpcAggroAreaPlugin plugin, NpcAggroAreaConfig config) @@ -45,14 +43,13 @@ class NpcAggroAreaNotWorkingOverlay extends Overlay this.plugin = plugin; this.config = config; - panelComponent = new PanelComponent(); - panelComponent.setPreferredSize(new Dimension(150, 0)); panelComponent.getChildren().add(LineComponent.builder() .left("Unaggressive NPC timers will start working when you teleport far away or enter a dungeon.") .build()); setPriority(OverlayPriority.LOW); setPosition(OverlayPosition.TOP_LEFT); + setClearChildren(false); } @Override @@ -63,6 +60,6 @@ class NpcAggroAreaNotWorkingOverlay extends Overlay return null; } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java index 8e838cc49b..2ec7b192ab 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java @@ -39,19 +39,18 @@ import net.runelite.api.NPC; import net.runelite.api.Player; import net.runelite.client.game.HiscoreManager; import net.runelite.client.game.NPCManager; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.ComponentConstants; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.ProgressBarComponent; import net.runelite.client.ui.overlay.components.TitleComponent; import net.runelite.client.util.Text; import net.runelite.http.api.hiscore.HiscoreResult; -class OpponentInfoOverlay extends Overlay +class OpponentInfoOverlay extends OverlayPanel { private static final Color HP_GREEN = new Color(0, 146, 54, 230); private static final Color HP_RED = new Color(102, 15, 16, 230); @@ -62,8 +61,6 @@ class OpponentInfoOverlay extends Overlay private final HiscoreManager hiscoreManager; private final NPCManager npcManager; - private final PanelComponent panelComponent = new PanelComponent(); - private Integer lastMaxHealth; private int lastRatio = 0; private int lastHealthScale = 0; @@ -135,8 +132,6 @@ class OpponentInfoOverlay extends Overlay final FontMetrics fontMetrics = graphics.getFontMetrics(); - panelComponent.getChildren().clear(); - // Opponent name int panelWidth = Math.max(ComponentConstants.STANDARD_WIDTH, fontMetrics.stringWidth(opponentName) + ComponentConstants.STANDARD_BORDER + ComponentConstants.STANDARD_BORDER); panelComponent.setPreferredSize(new Dimension(panelWidth, 0)); @@ -205,6 +200,6 @@ class OpponentInfoOverlay extends Overlay panelComponent.getChildren().add(progressBarComponent); } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java index 693b23cb89..5635646339 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java @@ -34,15 +34,15 @@ import java.util.UUID; import javax.inject.Inject; import net.runelite.api.MenuAction; import net.runelite.client.plugins.party.data.PartyData; -import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.ProgressBarComponent; import net.runelite.client.ui.overlay.components.TitleComponent; import net.runelite.client.ws.PartyService; -public class PartyStatsOverlay extends Overlay +public class PartyStatsOverlay extends OverlayPanel { private static final Color HP_FG = new Color(0, 146, 54, 230); private static final Color HP_BG = new Color(102, 15, 16, 230); @@ -52,7 +52,6 @@ public class PartyStatsOverlay extends Overlay private final PartyPlugin plugin; private final PartyService party; private final PartyConfig config; - private final PanelComponent body = new PanelComponent(); @Inject private PartyStatsOverlay(final PartyPlugin plugin, final PartyService party, final PartyConfig config) @@ -61,8 +60,8 @@ public class PartyStatsOverlay extends Overlay this.plugin = plugin; this.party = party; this.config = config; - body.setBorder(new Rectangle()); - body.setGap(new Point(0, ComponentConstants.STANDARD_BORDER / 2)); + panelComponent.setBorder(new Rectangle()); + panelComponent.setGap(new Point(0, ComponentConstants.STANDARD_BORDER / 2)); getMenuEntries().add(new OverlayMenuEntry(MenuAction.RUNELITE_OVERLAY, "Leave", "Party")); } @@ -80,8 +79,7 @@ public class PartyStatsOverlay extends Overlay return null; } - body.getChildren().clear(); - body.setBackgroundColor(null); + panelComponent.setBackgroundColor(null); boolean only1 = plugin.getPartyDataMap().size() == 1; @@ -93,7 +91,7 @@ public class PartyStatsOverlay extends Overlay { if (only1) { - body.getChildren().add(TitleComponent.builder() + panelComponent.getChildren().add(TitleComponent.builder() .text("No other party members") .color(Color.RED) .build()); @@ -134,10 +132,10 @@ public class PartyStatsOverlay extends Overlay panel.getChildren().add(prayBar); } - body.getChildren().add(panel); + panelComponent.getChildren().add(panel); }); } - return body.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java index f4441a8151..4616b1682b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java @@ -37,20 +37,19 @@ import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.game.WorldService; import net.runelite.client.plugins.raids.solver.Room; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; import net.runelite.http.api.worlds.World; import net.runelite.http.api.worlds.WorldRegion; import net.runelite.http.api.worlds.WorldResult; -public class RaidsOverlay extends Overlay +public class RaidsOverlay extends OverlayPanel { private static final int OLM_PLANE = 0; static final String BROADCAST_ACTION = "Broadcast layout"; @@ -59,7 +58,6 @@ public class RaidsOverlay extends Overlay private Client client; private RaidsPlugin plugin; private RaidsConfig config; - private final PanelComponent panelComponent = new PanelComponent(); @Getter @Setter @@ -90,8 +88,6 @@ public class RaidsOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - if (plugin.getRaid() == null || plugin.getRaid().getLayout() == null) { panelComponent.getChildren().add(TitleComponent.builder() @@ -99,7 +95,7 @@ public class RaidsOverlay extends Overlay .color(Color.RED) .build()); - return panelComponent.render(graphics); + return super.render(graphics); } Color color = Color.WHITE; @@ -206,6 +202,6 @@ public class RaidsOverlay extends Overlay } } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java index 411abdf252..7555082a39 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java @@ -37,15 +37,14 @@ import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -class SmeltingOverlay extends Overlay +class SmeltingOverlay extends OverlayPanel { private static final int SMELT_TIMEOUT = 7; static final String SMELTING_RESET = "Reset"; @@ -54,8 +53,6 @@ class SmeltingOverlay extends Overlay private final SmeltingPlugin plugin; private final XpTrackerService xpTrackerService; - private final PanelComponent panelComponent = new PanelComponent(); - @Inject SmeltingOverlay(Client client, SmeltingPlugin plugin, XpTrackerService xpTrackerService) { @@ -77,8 +74,6 @@ class SmeltingOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - if (isSmelting() || Duration.between(session.getLastItemSmelted(), Instant.now()).getSeconds() < SMELT_TIMEOUT) { panelComponent.getChildren().add(TitleComponent.builder() @@ -120,7 +115,7 @@ class SmeltingOverlay extends Overlay } } - return panelComponent.render(graphics); + return super.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java index 0aeab043cd..8ec93c1b18 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java @@ -31,18 +31,16 @@ import javax.inject.Inject; import net.runelite.api.ItemID; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.game.ItemManager; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; -public class TeamCapesOverlay extends Overlay +public class TeamCapesOverlay extends OverlayPanel { - private final PanelComponent panelComponent = new PanelComponent(); private final TeamCapesPlugin plugin; private final TeamCapesConfig config; private final ItemManager manager; @@ -70,8 +68,6 @@ public class TeamCapesOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - for (Map.Entry team : teams.entrySet()) { // Only display team capes that have a count greater than the configured minimum @@ -97,6 +93,6 @@ public class TeamCapesOverlay extends Overlay panelComponent.getChildren().add(new ImageComponent(manager.getImage(itemID, team.getValue(), true))); } - return panelComponent.render(graphics); + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java index dc73d8ac23..4388f4fa1a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java @@ -30,18 +30,16 @@ import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -class WintertodtOverlay extends Overlay +class WintertodtOverlay extends OverlayPanel { private final WintertodtPlugin plugin; - private final PanelComponent panelComponent = new PanelComponent(); @Inject private WintertodtOverlay(WintertodtPlugin plugin) @@ -60,9 +58,6 @@ class WintertodtOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - panelComponent.setPreferredSize(new Dimension(150, 0)); - panelComponent.getChildren().add(TitleComponent.builder() .text(plugin.getCurrentActivity().getActionString()) .color(plugin.getCurrentActivity() == WintertodtActivity.IDLE ? Color.RED : Color.GREEN) @@ -84,6 +79,6 @@ class WintertodtOverlay extends Overlay .rightColor(plugin.getNumKindling() + plugin.getNumLogs() > 0 ? Color.GREEN : Color.RED) .build()); - return panelComponent.render(graphics); + return super.render(graphics); } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java index 6f863cdda7..3424efee67 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java @@ -33,15 +33,14 @@ import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; -import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.LineComponent; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -class WoodcuttingOverlay extends Overlay +class WoodcuttingOverlay extends OverlayPanel { static final String WOODCUTTING_RESET = "Reset"; @@ -49,7 +48,6 @@ class WoodcuttingOverlay extends Overlay private final WoodcuttingPlugin plugin; private final WoodcuttingConfig config; private final XpTrackerService xpTrackerService; - private final PanelComponent panelComponent = new PanelComponent(); @Inject private WoodcuttingOverlay(Client client, WoodcuttingPlugin plugin, WoodcuttingConfig config, XpTrackerService xpTrackerService) @@ -78,8 +76,6 @@ class WoodcuttingOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - Axe axe = plugin.getAxe(); if (axe != null && axe.matchesChoppingAnimation(client.getLocalPlayer())) { @@ -113,7 +109,7 @@ class WoodcuttingOverlay extends Overlay } } - return panelComponent.render(graphics); + return super.render(graphics); } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java index f78db6f296..ec9ab50b71 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java @@ -33,11 +33,13 @@ import java.awt.image.BufferedImage; import lombok.AccessLevel; import lombok.Getter; import net.runelite.api.Experience; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.Skill; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.SkillColor; -import net.runelite.client.ui.overlay.Overlay; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; import net.runelite.client.ui.overlay.components.LineComponent; @@ -45,18 +47,14 @@ import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.ProgressBarComponent; import net.runelite.client.ui.overlay.components.SplitComponent; import net.runelite.client.util.QuantityFormatter; -import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; -class XpInfoBoxOverlay extends Overlay +class XpInfoBoxOverlay extends OverlayPanel { - private static final int PANEL_PREFERRED_WIDTH = 150; private static final int BORDER_SIZE = 2; private static final int XP_AND_PROGRESS_BAR_GAP = 2; private static final int XP_AND_ICON_GAP = 4; private static final Rectangle XP_AND_ICON_COMPONENT_BORDER = new Rectangle(2, 1, 4, 0); - private final PanelComponent panel = new PanelComponent(); private final PanelComponent iconXpSplitPanel = new PanelComponent(); private final XpTrackerPlugin plugin; private final XpTrackerConfig config; @@ -76,19 +74,16 @@ class XpInfoBoxOverlay extends Overlay this.config = config; this.skill = skill; this.icon = icon; - panel.setBorder(new Rectangle(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - panel.setGap(new Point(0, XP_AND_PROGRESS_BAR_GAP)); - panel.setPreferredSize(new Dimension(PANEL_PREFERRED_WIDTH, 0)); + panelComponent.setBorder(new Rectangle(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); + panelComponent.setGap(new Point(0, XP_AND_PROGRESS_BAR_GAP)); iconXpSplitPanel.setBorder(XP_AND_ICON_COMPONENT_BORDER); iconXpSplitPanel.setBackgroundColor(null); - iconXpSplitPanel.setPreferredSize(new Dimension(PANEL_PREFERRED_WIDTH, 0)); getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "XP Tracker overlay")); } @Override public Dimension render(Graphics2D graphics) { - panel.getChildren().clear(); iconXpSplitPanel.getChildren().clear(); //Setting the font to rs small font so that the overlay isn't huge @@ -174,10 +169,10 @@ class XpInfoBoxOverlay extends Overlay progressBarComponent.setValue(snapshot.getSkillProgressToGoal()); - panel.getChildren().add(iconXpSplitPanel); - panel.getChildren().add(progressBarComponent); + panelComponent.getChildren().add(iconXpSplitPanel); + panelComponent.getChildren().add(progressBarComponent); - return panel.render(graphics); + return super.render(graphics); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java index 516e0359ae..b917a38e6b 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java @@ -36,22 +36,20 @@ import javax.inject.Inject; import javax.inject.Singleton; import net.runelite.api.Client; import net.runelite.client.config.RuneLiteConfig; -import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPanel; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.InfoBoxComponent; import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity; -import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; @Singleton -public class InfoBoxOverlay extends Overlay +public class InfoBoxOverlay extends OverlayPanel { private static final int GAP = 1; private static final int DEFAULT_WRAP_COUNT = 4; - private final PanelComponent panelComponent = new PanelComponent(); private final InfoBoxManager infoboxManager; private final TooltipManager tooltipManager; private final Client client; @@ -69,6 +67,7 @@ public class InfoBoxOverlay extends Overlay this.client = client; this.config = config; setPosition(OverlayPosition.TOP_LEFT); + setClearChildren(false); panelComponent.setWrap(true); panelComponent.setBackgroundColor(null); @@ -86,8 +85,6 @@ public class InfoBoxOverlay extends Overlay return null; } - panelComponent.getChildren().clear(); - // Set preferred size to the size of DEFAULT_WRAP_COUNT infoboxes, including the padding - which is applied // to the last infobox prior to wrapping too. panelComponent.setPreferredSize(new Dimension(DEFAULT_WRAP_COUNT * (config.infoBoxSize() + GAP), DEFAULT_WRAP_COUNT * (config.infoBoxSize() + GAP))); @@ -117,7 +114,7 @@ public class InfoBoxOverlay extends Overlay panelComponent.getChildren().add(infoBoxComponent); } - final Dimension dimension = panelComponent.render(graphics); + final Dimension dimension = super.render(graphics); // Handle tooltips final Point mouse = new Point(client.getMouseCanvasPosition().getX(), client.getMouseCanvasPosition().getY()); @@ -142,6 +139,7 @@ public class InfoBoxOverlay extends Overlay } } + panelComponent.getChildren().clear(); return dimension; } } From 612a5f3fb534528619c4910e7d06c814c3712af6 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 5 Apr 2020 06:57:09 +0200 Subject: [PATCH 13/29] Skip processing of input listeners with consumed events This prevents from consumed input events to propage to rest of the plugins. For example when overlay is being moved, this prevents ground items from registering the click (what would otherwise cause for ground item to be highlighted). Signed-off-by: Tomas Slusny --- .../net/runelite/client/input/KeyManager.java | 27 +++++++ .../runelite/client/input/MouseManager.java | 72 +++++++++++++++++++ 2 files changed, 99 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 d8e5c81a11..f9e2c4f07d 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 @@ -49,25 +49,52 @@ public class KeyManager public void processKeyPressed(KeyEvent keyEvent) { + if (keyEvent.isConsumed()) + { + return; + } + for (KeyListener keyListener : keyListeners) { keyListener.keyPressed(keyEvent); + if (keyEvent.isConsumed()) + { + break; + } } } public void processKeyReleased(KeyEvent keyEvent) { + if (keyEvent.isConsumed()) + { + return; + } + for (KeyListener keyListener : keyListeners) { keyListener.keyReleased(keyEvent); + if (keyEvent.isConsumed()) + { + break; + } } } public void processKeyTyped(KeyEvent keyEvent) { + if (keyEvent.isConsumed()) + { + return; + } + for (KeyListener keyListener : keyListeners) { keyListener.keyTyped(keyEvent); + if (keyEvent.isConsumed()) + { + break; + } } } } diff --git a/runelite-client/src/main/java/net/runelite/client/input/MouseManager.java b/runelite-client/src/main/java/net/runelite/client/input/MouseManager.java index b88d43d3d6..d5b876c7d7 100644 --- a/runelite-client/src/main/java/net/runelite/client/input/MouseManager.java +++ b/runelite-client/src/main/java/net/runelite/client/input/MouseManager.java @@ -82,30 +82,57 @@ public class MouseManager public MouseEvent processMousePressed(MouseEvent mouseEvent) { + if (mouseEvent.isConsumed()) + { + return mouseEvent; + } + checkExtraMouseButtons(mouseEvent); for (MouseListener mouseListener : mouseListeners) { mouseEvent = mouseListener.mousePressed(mouseEvent); + if (mouseEvent.isConsumed()) + { + break; + } } return mouseEvent; } public MouseEvent processMouseReleased(MouseEvent mouseEvent) { + if (mouseEvent.isConsumed()) + { + return mouseEvent; + } + checkExtraMouseButtons(mouseEvent); for (MouseListener mouseListener : mouseListeners) { mouseEvent = mouseListener.mouseReleased(mouseEvent); + if (mouseEvent.isConsumed()) + { + break; + } } return mouseEvent; } public MouseEvent processMouseClicked(MouseEvent mouseEvent) { + if (mouseEvent.isConsumed()) + { + return mouseEvent; + } + checkExtraMouseButtons(mouseEvent); for (MouseListener mouseListener : mouseListeners) { mouseEvent = mouseListener.mouseClicked(mouseEvent); + if (mouseEvent.isConsumed()) + { + break; + } } return mouseEvent; } @@ -123,45 +150,90 @@ public class MouseManager public MouseEvent processMouseEntered(MouseEvent mouseEvent) { + if (mouseEvent.isConsumed()) + { + return mouseEvent; + } + for (MouseListener mouseListener : mouseListeners) { mouseEvent = mouseListener.mouseEntered(mouseEvent); + if (mouseEvent.isConsumed()) + { + break; + } } return mouseEvent; } public MouseEvent processMouseExited(MouseEvent mouseEvent) { + if (mouseEvent.isConsumed()) + { + return mouseEvent; + } + for (MouseListener mouseListener : mouseListeners) { mouseEvent = mouseListener.mouseExited(mouseEvent); + if (mouseEvent.isConsumed()) + { + break; + } } return mouseEvent; } public MouseEvent processMouseDragged(MouseEvent mouseEvent) { + if (mouseEvent.isConsumed()) + { + return mouseEvent; + } + for (MouseListener mouseListener : mouseListeners) { mouseEvent = mouseListener.mouseDragged(mouseEvent); + if (mouseEvent.isConsumed()) + { + break; + } } return mouseEvent; } public MouseEvent processMouseMoved(MouseEvent mouseEvent) { + if (mouseEvent.isConsumed()) + { + return mouseEvent; + } + for (MouseListener mouseListener : mouseListeners) { mouseEvent = mouseListener.mouseMoved(mouseEvent); + if (mouseEvent.isConsumed()) + { + break; + } } return mouseEvent; } public MouseWheelEvent processMouseWheelMoved(MouseWheelEvent mouseWheelEvent) { + if (mouseWheelEvent.isConsumed()) + { + return mouseWheelEvent; + } + for (MouseWheelListener mouseWheelListener : mouseWheelListeners) { mouseWheelEvent = mouseWheelListener.mouseWheelMoved(mouseWheelEvent); + if (mouseWheelEvent.isConsumed()) + { + break; + } } return mouseWheelEvent; } From 31c9bf883669fff29da33bc97724f69191fa74b2 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 10 Apr 2020 15:25:42 -0400 Subject: [PATCH 14/29] devtools: add infobox generator --- .../client/plugins/devtools/DevToolsPanel.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java index 2c276aee0a..57a9906fc1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java @@ -34,6 +34,9 @@ import net.runelite.api.Client; import net.runelite.client.Notifier; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; +import net.runelite.client.ui.overlay.infobox.Counter; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.util.ImageUtil; class DevToolsPanel extends PluginPanel { @@ -44,6 +47,7 @@ class DevToolsPanel extends PluginPanel private final WidgetInspector widgetInspector; private final VarInspector varInspector; private final ScriptInspector scriptInspector; + private final InfoBoxManager infoBoxManager; @Inject private DevToolsPanel( @@ -52,7 +56,8 @@ class DevToolsPanel extends PluginPanel WidgetInspector widgetInspector, VarInspector varInspector, ScriptInspector scriptInspector, - Notifier notifier) + Notifier notifier, + InfoBoxManager infoBoxManager) { super(); this.client = client; @@ -61,6 +66,7 @@ class DevToolsPanel extends PluginPanel this.varInspector = varInspector; this.scriptInspector = scriptInspector; this.notifier = notifier; + this.infoBoxManager = infoBoxManager; setBackground(ColorScheme.DARK_GRAY_COLOR); @@ -154,6 +160,14 @@ class DevToolsPanel extends PluginPanel } }); + final JButton newInfoboxBtn = new JButton("Infobox"); + newInfoboxBtn.addActionListener(e -> infoBoxManager.addInfoBox(new Counter(ImageUtil.getResourceStreamFromClass(getClass(), "devtools_icon.png"), plugin, 42))); + container.add(newInfoboxBtn); + + final JButton clearInfoboxBtn = new JButton("Clear Infobox"); + clearInfoboxBtn.addActionListener(e -> infoBoxManager.removeIf(i -> true)); + container.add(clearInfoboxBtn); + return container; } } From 46b56797418264b0b8427e7b5baed2f3976d17eb Mon Sep 17 00:00:00 2001 From: Max Weber Date: Tue, 14 Apr 2020 14:40:33 -0600 Subject: [PATCH 15/29] FlatTextField: forward focus requests to children --- .../net/runelite/client/ui/components/FlatTextField.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java b/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java index 2ab50132e4..1c13cad475 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java @@ -128,6 +128,12 @@ public class FlatTextField extends JPanel setBackground(color, true); } + @Override + public boolean requestFocusInWindow() + { + return textField.requestFocusInWindow(); + } + public void setBackground(Color color, boolean saveColor) { if (color == null) From 37bee38ff75a54a212fafb8f2aab55eaa7e4bf01 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 16 Apr 2020 10:32:23 +0000 Subject: [PATCH 16/29] Update Item IDs to 2020-04-16-rev182 --- runelite-api/src/main/java/net/runelite/api/ItemID.java | 9 +++++++-- .../src/main/java/net/runelite/api/NullItemID.java | 5 +++++ 2 files changed, 12 insertions(+), 2 deletions(-) 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 b045be89d1..f97f06ad6c 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemID.java @@ -11424,8 +11424,13 @@ public final class ItemID public static final int CARROT = 24546; public static final int BROKEN_GOAT_HORN = 24547; public static final int CAKE_24549 = 24549; - public static final int BLADE_OF_SAELDOR_I = 24551; - public static final int BLADE_OF_SAELDOR_I_24553 = 24553; + public static final int BLADE_OF_SAELDOR_C = 24551; + public static final int BLADE_OF_SAELDOR_C_24553 = 24553; public static final int PYROMANCER_SET = 24554; + public static final int TANGLEROOT_24555 = 24555; + public static final int TANGLEROOT_24557 = 24557; + public static final int TANGLEROOT_24559 = 24559; + public static final int TANGLEROOT_24561 = 24561; + public static final int TANGLEROOT_24563 = 24563; /* 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 d766b2c53e..2f5a108d49 100644 --- a/runelite-api/src/main/java/net/runelite/api/NullItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/NullItemID.java @@ -12917,5 +12917,10 @@ public final class NullItemID public static final int NULL_24548 = 24548; public static final int NULL_24550 = 24550; public static final int NULL_24552 = 24552; + public static final int NULL_24556 = 24556; + public static final int NULL_24558 = 24558; + public static final int NULL_24560 = 24560; + public static final int NULL_24562 = 24562; + public static final int NULL_24564 = 24564; /* This file is automatically generated. Do not edit. */ } From a75c01e6c7b3dd63dbee8992b8190c698caa7fd0 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 16 Apr 2020 10:32:23 +0000 Subject: [PATCH 17/29] Update Item variations to 2020-04-16-rev182 --- runelite-client/src/main/resources/item_variations.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/runelite-client/src/main/resources/item_variations.json b/runelite-client/src/main/resources/item_variations.json index 2c96c1d0d9..db3bcb9480 100644 --- a/runelite-client/src/main/resources/item_variations.json +++ b/runelite-client/src/main/resources/item_variations.json @@ -8706,6 +8706,14 @@ 20621, 20622 ], + "tangleroot": [ + 20661, + 24555, + 24557, + 24559, + 24561, + 24563 + ], "rift guardian": [ 20665, 20667, From be3f74e1119bfae2f0cb9814fea65af18c6c7f64 Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 16 Apr 2020 10:32:24 +0000 Subject: [PATCH 18/29] Update Object IDs to 2020-04-16-rev182 --- .../java/net/runelite/api/NullObjectID.java | 11 ---------- .../main/java/net/runelite/api/ObjectID.java | 21 ------------------- 2 files changed, 32 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/NullObjectID.java b/runelite-api/src/main/java/net/runelite/api/NullObjectID.java index 1eaf83e2d5..83135cc4af 100644 --- a/runelite-api/src/main/java/net/runelite/api/NullObjectID.java +++ b/runelite-api/src/main/java/net/runelite/api/NullObjectID.java @@ -14123,10 +14123,6 @@ public final class NullObjectID public static final int NULL_30144 = 30144; public static final int NULL_30156 = 30156; public static final int NULL_30159 = 30159; - public static final int NULL_30165 = 30165; - public static final int NULL_30166 = 30166; - public static final int NULL_30167 = 30167; - public static final int NULL_30168 = 30168; public static final int NULL_30171 = 30171; public static final int NULL_30181 = 30181; public static final int NULL_30182 = 30182; @@ -14981,7 +14977,6 @@ public final class NullObjectID public static final int NULL_31895 = 31895; public static final int NULL_31896 = 31896; public static final int NULL_31897 = 31897; - public static final int NULL_31899 = 31899; public static final int NULL_31937 = 31937; public static final int NULL_31938 = 31938; public static final int NULL_31945 = 31945; @@ -16166,7 +16161,6 @@ public final class NullObjectID public static final int NULL_34678 = 34678; public static final int NULL_34679 = 34679; public static final int NULL_34680 = 34680; - public static final int NULL_34688 = 34688; public static final int NULL_34689 = 34689; public static final int NULL_34690 = 34690; public static final int NULL_34691 = 34691; @@ -18168,7 +18162,6 @@ public final class NullObjectID public static final int NULL_37722 = 37722; public static final int NULL_37723 = 37723; public static final int NULL_37724 = 37724; - public static final int NULL_37725 = 37725; public static final int NULL_37732 = 37732; public static final int NULL_37733 = 37733; public static final int NULL_37734 = 37734; @@ -18336,11 +18329,7 @@ public final class NullObjectID public static final int NULL_37933 = 37933; public static final int NULL_37934 = 37934; public static final int NULL_37935 = 37935; - public static final int NULL_37940 = 37940; - public static final int NULL_37945 = 37945; - public static final int NULL_37947 = 37947; public static final int NULL_37950 = 37950; - public static final int NULL_37956 = 37956; public static final int NULL_37958 = 37958; /* This file is automatically generated. Do not edit. */ } diff --git a/runelite-api/src/main/java/net/runelite/api/ObjectID.java b/runelite-api/src/main/java/net/runelite/api/ObjectID.java index af1d77c7a5..d6b44f591e 100644 --- a/runelite-api/src/main/java/net/runelite/api/ObjectID.java +++ b/runelite-api/src/main/java/net/runelite/api/ObjectID.java @@ -15803,8 +15803,6 @@ public final class ObjectID public static final int POOL_OF_NIGHTMARES = 29706; public static final int POOL_OF_NIGHTMARES_29707 = 29707; public static final int SCOREBOARD_29708 = 29708; - public static final int MAGIC_PORTAL_29711 = 29711; - public static final int PAINT_BUCKETS = 29712; public static final int NOTICEBOARD_29718 = 29718; public static final int BALLISTA_29719 = 29719; public static final int STAIRCASE_29720 = 29720; @@ -16025,11 +16023,6 @@ public final class ObjectID public static final int PAINTING_30155 = 30155; public static final int FURNACE_30157 = 30157; public static final int FURNACE_30158 = 30158; - public static final int BROKEN_EGG = 30160; - public static final int CONCH_SHELL = 30161; - public static final int THE_MAGIC_EGG = 30162; - public static final int CAKE = 30163; - public static final int CARROT = 30164; public static final int CRACK_30169 = 30169; public static final int ROOT_30170 = 30170; public static final int PORTAL_30172 = 30172; @@ -19545,9 +19538,6 @@ public final class ObjectID public static final int NIGHTMARE_TOPIARY = 37630; public static final int SUPPLIES_37631 = 37631; public static final int BANNER_37726 = 37726; - public static final int RABBIT = 37727; - public static final int RABBIT_37728 = 37728; - public static final int GRAVE_37729 = 37729; public static final int ENERGY_BARRIER_37730 = 37730; public static final int ENERGY_BARRIER_37731 = 37731; public static final int SPORE = 37738; @@ -19590,19 +19580,8 @@ public final class ObjectID public static final int CRATE_37936 = 37936; public static final int DOOR_37937 = 37937; public static final int DOOR_37938 = 37938; - public static final int BROKEN_GOAT_HORN = 37939; - public static final int GATE_37941 = 37941; - public static final int GATE_37942 = 37942; - public static final int GATE_37943 = 37943; - public static final int GATE_37944 = 37944; - public static final int TREE_37946 = 37946; - public static final int DEAD_TREE_37948 = 37948; public static final int SCOREBOARD_37949 = 37949; public static final int COFFIN_37951 = 37951; - public static final int JUNGLE_TREE_37952 = 37952; - public static final int YEW_37953 = 37953; - public static final int TREE_STUMP_37954 = 37954; - public static final int FURNACE_37955 = 37955; public static final int HANDY_PORTAL = 37957; /* This file is automatically generated. Do not edit. */ } From e363687b16e4ddc22501d263d632f7a100ca00fb Mon Sep 17 00:00:00 2001 From: RuneLite Cache-Code Autoupdater Date: Thu, 16 Apr 2020 10:32:24 +0000 Subject: [PATCH 19/29] Update NPC IDs to 2020-04-16-rev182 --- .../src/main/java/net/runelite/api/NpcID.java | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) 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 fc3dfa8882..ffc9db2501 100644 --- a/runelite-api/src/main/java/net/runelite/api/NpcID.java +++ b/runelite-api/src/main/java/net/runelite/api/NpcID.java @@ -5993,7 +5993,6 @@ 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 THE_DISAPPOINTING_GELT = 6595; public static final int ZOMBIE_6596 = 6596; public static final int ZOMBIE_6597 = 6597; public static final int ZOMBIE_6598 = 6598; @@ -8483,21 +8482,17 @@ public final class NpcID public static final int SISTER_SENGA = 9471; public static final int SISTER_SENGA_9472 = 9472; public static final int ENT_TRUNK = 9474; - public static final int DUKE_RABBACIO = 9475; - public static final int PAWS = 9476; - public static final int RABBIT_CHEF = 9477; - public static final int GUARD_9478 = 9478; - public static final int MAGIC_EGG = 9479; - public static final int RABBIT_9480 = 9480; - public static final int RABBIT_9481 = 9481; - public static final int RABBIT_9482 = 9482; - public static final int RID = 9483; - public static final int FARMER_MAGGOT = 9484; - public static final int FATHER_BUCKEREK = 9485; - public static final int RESTLESS_GOAT = 9486; - public static final int SHOP_KEEPER_9487 = 9487; - public static final int BARTENDER_9488 = 9488; - public static final int COW_CALF_9489 = 9489; - public static final int CHICKEN_9490 = 9490; + public static final int TANGLEROOT_9492 = 9492; + public static final int TANGLEROOT_9493 = 9493; + public static final int TANGLEROOT_9494 = 9494; + public static final int TANGLEROOT_9495 = 9495; + public static final int TANGLEROOT_9496 = 9496; + public static final int TANGLEROOT_9497 = 9497; + public static final int TANGLEROOT_9498 = 9498; + public static final int TANGLEROOT_9499 = 9499; + public static final int TANGLEROOT_9500 = 9500; + public static final int TANGLEROOT_9501 = 9501; + public static final int IORWERTH_WARRIOR_9502 = 9502; + public static final int IORWERTH_WARRIOR_9503 = 9503; /* This file is automatically generated. Do not edit. */ } From e2bd51b1e8a80dc40820daccb00421c92c14d1a1 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Thu, 16 Apr 2020 14:33:05 +0000 Subject: [PATCH 20/29] Release 1.6.11 --- 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 9aa44eb21b..060f5d90e7 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.11-SNAPSHOT + 1.6.11 cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index 1fc8c9fc5a..fc61eaf406 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.11-SNAPSHOT + 1.6.11 Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 2f0f45d072..68fa7038e2 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.11-SNAPSHOT + 1.6.11 cache diff --git a/http-api/pom.xml b/http-api/pom.xml index e4942148e6..00cfa9a3e3 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.11-SNAPSHOT + 1.6.11 Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index 73aa4a7a68..a5da3bb5f7 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.11-SNAPSHOT + 1.6.11 Web Service diff --git a/pom.xml b/pom.xml index b9fdc19d32..c2489b8a64 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.11-SNAPSHOT + 1.6.11 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.11 diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 73e90207ce..a6ec62b347 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.11-SNAPSHOT + 1.6.11 runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 34a5d79902..cc97f3ade7 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.11-SNAPSHOT + 1.6.11 client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index e7d59da776..185d6a93d7 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.11-SNAPSHOT + 1.6.11 script-assembler-plugin From af7af0623aafcba1023f816c7b763365ec0f7833 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Thu, 16 Apr 2020 14:33:14 +0000 Subject: [PATCH 21/29] Bump for 1.6.12-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 060f5d90e7..2a1095fca7 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.11 + 1.6.12-SNAPSHOT cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index fc61eaf406..a7a20b1a88 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.11 + 1.6.12-SNAPSHOT Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 68fa7038e2..d9be02b41e 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.11 + 1.6.12-SNAPSHOT cache diff --git a/http-api/pom.xml b/http-api/pom.xml index 00cfa9a3e3..6f43eb3308 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.11 + 1.6.12-SNAPSHOT Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index a5da3bb5f7..c49c48c1a6 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.11 + 1.6.12-SNAPSHOT Web Service diff --git a/pom.xml b/pom.xml index c2489b8a64..a689e4b420 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.11 + 1.6.12-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.11 + HEAD diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index a6ec62b347..a41df42095 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.11 + 1.6.12-SNAPSHOT runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index cc97f3ade7..2adeb0e03e 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.11 + 1.6.12-SNAPSHOT client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 185d6a93d7..0b0a72a656 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.11 + 1.6.12-SNAPSHOT script-assembler-plugin From 612a23a01f34ca3ad297d577780a1f027a2cb7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Rosseland=20Paulsen?= Date: Thu, 16 Apr 2020 22:54:55 +0200 Subject: [PATCH 22/29] menu entry swapper: fix shift click for deposit box --- .../plugins/menuentryswapper/MenuEntrySwapperPlugin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 83e1a7853e..a0a4fd1fb3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -317,9 +317,10 @@ public class MenuEntrySwapperPlugin extends Plugin // is what builds the context menu row which is what the eventual click will use // Swap to shift-click deposit behavior - // Deposit- op 2 is the current withdraw amount 1/5/10/x + // Deposit- op 1 is the current withdraw amount 1/5/10/x for deposit box interface + // Deposit- op 2 is the current withdraw amount 1/5/10/x for bank interface if (shiftModifier && config.bankDepositShiftClick() != ShiftDepositMode.OFF - && menuEntryAdded.getType() == MenuAction.CC_OP.getId() && menuEntryAdded.getIdentifier() == 2 + && menuEntryAdded.getType() == MenuAction.CC_OP.getId() && (menuEntryAdded.getIdentifier() == 2 || menuEntryAdded.getIdentifier() == 1) && menuEntryAdded.getOption().startsWith("Deposit-")) { ShiftDepositMode shiftDepositMode = config.bankDepositShiftClick(); From 73773ca4799ab2bd3f35f124317ced2fb171a8a3 Mon Sep 17 00:00:00 2001 From: Lotto Date: Thu, 16 Apr 2020 21:21:16 +0200 Subject: [PATCH 23/29] player-indicators: fix right-click menu targets expanding forever Fixes the right-click menu targets expanding forever if clan rank or color decoration is enabled in the plugin. Menu entries don't get cleared while the menu is open, which was resulting in colors and ranks getting prepended on every client tick. --- .../plugins/playerindicators/PlayerIndicatorsPlugin.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java index ffbccb4710..3ae69f2551 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java @@ -96,6 +96,11 @@ public class PlayerIndicatorsPlugin extends Plugin @Subscribe public void onClientTick(ClientTick clientTick) { + if (client.isMenuOpen()) + { + return; + } + MenuEntry[] menuEntries = client.getMenuEntries(); boolean modified = false; From 3ede5ebb56ba4662b86f247be58753ecb2a2c6fc Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 16 Apr 2020 16:57:34 -0400 Subject: [PATCH 24/29] Revert "Mock ConfigManager in ItemStatOverlayTest to inject TooltipManager" This reverts commit 75b29026f99ab84c732c66d3652042e4e8010735. --- .../client/plugins/itemstats/ItemStatOverlayTest.java | 5 ----- 1 file changed, 5 deletions(-) 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 a3fb1b556a..b3826df992 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 @@ -34,7 +34,6 @@ import net.runelite.api.EquipmentInventorySlot; import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; -import net.runelite.client.config.ConfigManager; import net.runelite.client.game.ItemManager; import net.runelite.client.util.Text; import net.runelite.http.api.item.ItemEquipmentStats; @@ -103,10 +102,6 @@ public class ItemStatOverlayTest @Bind ItemStatConfig config; - @Mock - @Bind - ConfigManager configManager; - @Mock @Bind ItemManager itemManager; From 9a9f40b862aa6fe5f5ae231bb3b66ce369e29825 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 16 Apr 2020 16:58:16 -0400 Subject: [PATCH 25/29] Revert "Reset repositioned tooltip overlays" This reverts commit 1fccba9fda84b1f22375c50bafb8af4c1b7fd0bc. --- .../java/net/runelite/client/RuneLite.java | 5 ---- .../ui/overlay/tooltip/TooltipManager.java | 26 ------------------- 2 files changed, 31 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 9a0c8f87d9..463f93b639 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -73,7 +73,6 @@ import net.runelite.client.ui.overlay.OverlayRenderer; import net.runelite.client.ui.overlay.WidgetOverlay; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay; -import net.runelite.client.ui.overlay.tooltip.TooltipManager; import net.runelite.client.ui.overlay.tooltip.TooltipOverlay; import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay; import net.runelite.client.ws.PartyService; @@ -128,9 +127,6 @@ public class RuneLite @Inject private OverlayManager overlayManager; - @Inject - private TooltipManager tooltipManager; - @Inject private Provider partyService; @@ -341,7 +337,6 @@ public class RuneLite eventBus.register(overlayManager); eventBus.register(drawManager); eventBus.register(infoBoxManager); - eventBus.register(tooltipManager); eventBus.register(configManager); eventBus.register(discordService); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipManager.java index 9ed020b72b..6472381ec3 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipManager.java @@ -24,27 +24,14 @@ */ package net.runelite.client.ui.overlay.tooltip; -import com.google.common.base.Strings; import java.util.ArrayList; import java.util.List; -import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.events.ConfigChanged; @Singleton public class TooltipManager { - private final ConfigManager configManager; - - @Inject - private TooltipManager(final ConfigManager configManager) - { - this.configManager = configManager; - } - @Getter private final List tooltips = new ArrayList<>(); @@ -62,17 +49,4 @@ public class TooltipManager { tooltips.clear(); } - - @Subscribe - public void onConfigChanged(final ConfigChanged event) - { - // Temporary fix for resetting repositioned tooltip overlay - // TODO: Remove this eventually - if (event.getGroup().equals("runelite") && - event.getKey().equals("TooltipOverlay_preferredLocation") && - !Strings.isNullOrEmpty(event.getNewValue())) - { - configManager.unsetConfiguration(event.getGroup(), event.getKey()); - } - } } From 059b28989e414abfbb0f240e003ea8eca9661886 Mon Sep 17 00:00:00 2001 From: Dennis Date: Thu, 16 Apr 2020 21:52:36 +0200 Subject: [PATCH 26/29] ge plugin: fix fuzzy search highlighting --- .../grandexchange/GrandExchangePlugin.java | 13 ++++-- .../GrandExchangePluginTest.java | 42 +++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index f3629054bc..76f51245ee 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -28,6 +28,7 @@ package net.runelite.client.plugins.grandexchange; +import com.google.common.annotations.VisibleForTesting; import com.google.common.primitives.Shorts; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; @@ -182,7 +183,8 @@ public class GrandExchangePlugin extends Plugin /** * Logic from {@link org.apache.commons.text.similarity.FuzzyScore} */ - private static List findFuzzyIndices(String term, String query) + @VisibleForTesting + static List findFuzzyIndices(String term, String query) { List indices = new ArrayList<>(); @@ -201,7 +203,9 @@ public class GrandExchangePlugin extends Plugin { final char queryChar = queryLowerCase.charAt(queryIndex); - for (; termIndex < termLowerCase.length(); termIndex++) + boolean termCharacterMatchFound = false; + for (; termIndex < termLowerCase.length() + && !termCharacterMatchFound; termIndex++) { final char termChar = termLowerCase.charAt(termIndex); @@ -211,7 +215,7 @@ public class GrandExchangePlugin extends Plugin // we can leave the nested loop. Every character in the // query can match at most one character in the term. - break; + termCharacterMatchFound = true; } } } @@ -548,10 +552,11 @@ public class GrandExchangePlugin extends Plugin StringBuilder newItemName = new StringBuilder(itemName); for (int index : indices) { - if (wasFuzzySearch && (itemName.charAt(index) == ' ' || itemName.charAt(index) == '-')) + if (itemName.charAt(index) == ' ' || itemName.charAt(index) == '-') { continue; } + newItemName.insert(index + 1, ""); newItemName.insert(index, underlineTag); } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java new file mode 100644 index 0000000000..dc16d25dfc --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.grandexchange; + +import java.util.Arrays; +import java.util.List; +import static net.runelite.client.plugins.grandexchange.GrandExchangePlugin.findFuzzyIndices; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class GrandExchangePluginTest +{ + @Test + public void testFindFuzzyIndices() + { + List fuzzyIndices = findFuzzyIndices("Ancestral robe bottom", "obby"); + // robe bottom + assertEquals(Arrays.asList(11, 12, 15), fuzzyIndices); + } +} \ No newline at end of file From 3ac15c2f61b58cde1eadbef2a480e6afaff09323 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Thu, 16 Apr 2020 22:58:34 +0100 Subject: [PATCH 27/29] fishing & idle notifer: add pearl rod animations --- runelite-api/src/main/java/net/runelite/api/AnimationID.java | 3 +++ .../net/runelite/client/plugins/fishing/FishingOverlay.java | 5 ++++- .../client/plugins/idlenotifier/IdleNotifierPlugin.java | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) 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 dd14650c73..1b0144b2bd 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -112,6 +112,9 @@ public final class AnimationID public static final int FISHING_BAREHAND_CAUGHT_SWORDFISH_2 = 6708; public static final int FISHING_BAREHAND_CAUGHT_TUNA_1 = 6710; public static final int FISHING_BAREHAND_CAUGHT_TUNA_2 = 6711; + public static final int FISHING_PEARL_ROD = 8188; + public static final int FISHING_PEARL_FLY_ROD = 8189; + public static final int FISHING_PEARL_BARBARIAN_ROD = 8190; public static final int MINING_BRONZE_PICKAXE = 625; public static final int MINING_IRON_PICKAXE = 626; public static final int MINING_STEEL_PICKAXE = 627; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java index 084e0f1534..5f2d05e4d7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java @@ -69,7 +69,10 @@ class FishingOverlay extends OverlayPanel AnimationID.FISHING_KARAMBWAN, AnimationID.FISHING_NET, AnimationID.FISHING_OILY_ROD, - AnimationID.FISHING_POLE_CAST); + AnimationID.FISHING_POLE_CAST, + AnimationID.FISHING_PEARL_ROD, + AnimationID.FISHING_PEARL_FLY_ROD, + AnimationID.FISHING_PEARL_BARBARIAN_ROD); private final Client client; private final FishingPlugin plugin; 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 206db46141..97eb730197 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 @@ -194,6 +194,9 @@ public class IdleNotifierPlugin extends Plugin case FISHING_OILY_ROD: case FISHING_KARAMBWAN: case FISHING_BAREHAND: + case FISHING_PEARL_ROD: + case FISHING_PEARL_FLY_ROD: + case FISHING_PEARL_BARBARIAN_ROD: /* Mining(Normal) */ case MINING_BRONZE_PICKAXE: case MINING_IRON_PICKAXE: From e0f046980a431ea4f31958fe6e80c3defb12dc59 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 17 Apr 2020 17:45:27 +0100 Subject: [PATCH 28/29] fishing & idle notifer: add oily pearl rod animations --- runelite-api/src/main/java/net/runelite/api/AnimationID.java | 1 + .../net/runelite/client/plugins/fishing/FishingOverlay.java | 3 ++- .../client/plugins/idlenotifier/IdleNotifierPlugin.java | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) 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 1b0144b2bd..8a9af4d5aa 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -115,6 +115,7 @@ public final class AnimationID public static final int FISHING_PEARL_ROD = 8188; public static final int FISHING_PEARL_FLY_ROD = 8189; public static final int FISHING_PEARL_BARBARIAN_ROD = 8190; + public static final int FISHING_PEARL_OILY_ROD = 6932; public static final int MINING_BRONZE_PICKAXE = 625; public static final int MINING_IRON_PICKAXE = 626; public static final int MINING_STEEL_PICKAXE = 627; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java index 5f2d05e4d7..a60bed3bab 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java @@ -72,7 +72,8 @@ class FishingOverlay extends OverlayPanel AnimationID.FISHING_POLE_CAST, AnimationID.FISHING_PEARL_ROD, AnimationID.FISHING_PEARL_FLY_ROD, - AnimationID.FISHING_PEARL_BARBARIAN_ROD); + AnimationID.FISHING_PEARL_BARBARIAN_ROD, + AnimationID.FISHING_PEARL_OILY_ROD); private final Client client; private final FishingPlugin plugin; 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 97eb730197..06ca132cd8 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 @@ -197,6 +197,7 @@ public class IdleNotifierPlugin extends Plugin case FISHING_PEARL_ROD: case FISHING_PEARL_FLY_ROD: case FISHING_PEARL_BARBARIAN_ROD: + case FISHING_PEARL_OILY_ROD: /* Mining(Normal) */ case MINING_BRONZE_PICKAXE: case MINING_IRON_PICKAXE: From 87185bffa1aabae9c960e252b8ad408a57ea5180 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 17 Apr 2020 12:07:30 +0100 Subject: [PATCH 29/29] antidrag: fix onShiftOnly not being respected when opening the bank --- .../runelite/client/plugins/antidrag/AntiDragPlugin.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java index e6c7c7f0b0..06b50e3e49 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java @@ -70,6 +70,7 @@ public class AntiDragPlugin extends Plugin implements KeyListener private KeyManager keyManager; private boolean inPvp; + private boolean held; @Provides AntiDragConfig getConfig(ConfigManager configManager) @@ -114,6 +115,7 @@ public class AntiDragPlugin extends Plugin implements KeyListener if (e.getKeyCode() == KeyEvent.VK_SHIFT && config.onShiftOnly()) { setDragDelay(); + held = true; } } @@ -123,6 +125,7 @@ public class AntiDragPlugin extends Plugin implements KeyListener if (e.getKeyCode() == KeyEvent.VK_SHIFT && config.onShiftOnly()) { resetDragDelay(); + held = false; } } @@ -133,6 +136,7 @@ public class AntiDragPlugin extends Plugin implements KeyListener { if (config.onShiftOnly() || inPvp) { + held = false; clientThread.invoke(this::resetDragDelay); } else @@ -168,6 +172,7 @@ public class AntiDragPlugin extends Plugin implements KeyListener { if (!focusChanged.isFocused()) { + held = false; clientThread.invoke(this::resetDragDelay); } else if (!inPvp && !config.onShiftOnly()) @@ -179,7 +184,7 @@ public class AntiDragPlugin extends Plugin implements KeyListener @Subscribe public void onWidgetLoaded(WidgetLoaded widgetLoaded) { - if (widgetLoaded.getGroupId() == WidgetID.BANK_GROUP_ID) + if (widgetLoaded.getGroupId() == WidgetID.BANK_GROUP_ID && (!config.onShiftOnly() || held)) { setBankDragDelay(config.dragDelay()); }