From 82ee4a0036a89ae4fd990810b9fb30ad204917b1 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 24 Dec 2017 03:04:29 +0100 Subject: [PATCH 1/9] Change Notifier to be injectable service Move notify methods to Notifier and change it to be injectable Guice service. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/Notifier.java | 21 +++++- .../java/net/runelite/client/RuneLite.java | 16 +---- .../net/runelite/client/RuneliteModule.java | 6 ++ .../idlenotifier/IdleNotifierPlugin.java | 70 +++++++++++++++++-- .../volcanicmine/VolcanicMinePlugin.java | 48 +++++++------ .../woodcutting/WoodcuttingPlugin.java | 6 +- 6 files changed, 121 insertions(+), 46 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/Notifier.java b/runelite-client/src/main/java/net/runelite/client/Notifier.java index 393448493c..c878bfda4d 100644 --- a/runelite-client/src/main/java/net/runelite/client/Notifier.java +++ b/runelite-client/src/main/java/net/runelite/client/Notifier.java @@ -26,6 +26,7 @@ package net.runelite.client; import com.google.common.escape.Escaper; import com.google.common.escape.Escapers; +import java.awt.Toolkit; import java.awt.TrayIcon; import java.io.IOException; import java.util.ArrayList; @@ -35,7 +36,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class Notifier { - private static enum OSType + private enum OSType { Windows, MacOS, Linux, Other }; @@ -74,14 +75,28 @@ public class Notifier log.debug("Detect OS: {}", DETECTED_OS); } + private final String appName; private final TrayIcon trayIcon; - public Notifier(final TrayIcon trayIcon) + Notifier(final String appName, final TrayIcon trayIcon) { + this.appName = appName; this.trayIcon = trayIcon; } - public void sendNotification( + + public void notify(String message) + { + notify(message, TrayIcon.MessageType.NONE); + } + + public void notify(String message, TrayIcon.MessageType type) + { + sendNotification(appName, message, type, null); + Toolkit.getDefaultToolkit().beep(); + } + + private void sendNotification( final String title, final String message, final TrayIcon.MessageType type, 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 fc76ac8ae1..61c0fad181 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -34,7 +34,6 @@ import java.awt.AWTException; import java.awt.Frame; import java.awt.Image; import java.awt.SystemTray; -import java.awt.Toolkit; import java.awt.TrayIcon; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -118,7 +117,7 @@ public class RuneLite private AccountSession accountSession; - private Notifier notifier; + Notifier notifier; static { @@ -186,7 +185,7 @@ public class RuneLite eventBus.register(chatMessageManager); // Setup the notifier - notifier = new Notifier(trayIcon); + notifier = new Notifier(properties.getTitle(), trayIcon); // Load the plugins, but does not start them yet. // This will initialize configuration @@ -409,17 +408,6 @@ public class RuneLite return trayIcon; } - public void notify(String message) - { - notify(message, TrayIcon.MessageType.NONE); - } - - public void notify(String message, TrayIcon.MessageType type) - { - notifier.sendNotification(properties.getTitle(), message, type, null); - Toolkit.getDefaultToolkit().beep(); - } - public AccountSession getAccountSession() { return accountSession; diff --git a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java index 8da6c16c3f..2de30f5840 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java @@ -71,6 +71,12 @@ public class RuneliteModule extends AbstractModule return runelite.getGui(); } + @Provides + Notifier provideNotifier(RuneLite runeLite) + { + return runeLite.notifier; + } + @Provides @Singleton RuneliteConfig provideConfig(ConfigManager configManager) 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 1ef2594c1a..a46da04775 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 @@ -25,6 +25,69 @@ */ package net.runelite.client.plugins.idlenotifier; +import static net.runelite.api.AnimationID.COOKING_FIRE; +import static net.runelite.api.AnimationID.COOKING_RANGE; +import static net.runelite.api.AnimationID.CRAFTING_GLASSBLOWING; +import static net.runelite.api.AnimationID.FISHING_CAGE; +import static net.runelite.api.AnimationID.FISHING_HARPOON; +import static net.runelite.api.AnimationID.FISHING_KARAMBWAN; +import static net.runelite.api.AnimationID.FISHING_NET; +import static net.runelite.api.AnimationID.FISHING_POLE_CAST; +import static net.runelite.api.AnimationID.FLETCHING_BOW_CUTTING; +import static net.runelite.api.AnimationID.FLETCHING_STRING_MAGIC_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_MAGIC_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_MAPLE_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_MAPLE_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_NORMAL_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_NORMAL_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_OAK_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_OAK_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_WILLOW_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_WILLOW_SHORTBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_YEW_LONGBOW; +import static net.runelite.api.AnimationID.FLETCHING_STRING_YEW_SHORTBOW; +import static net.runelite.api.AnimationID.GEM_CUTTING_DIAMOND; +import static net.runelite.api.AnimationID.GEM_CUTTING_EMERALD; +import static net.runelite.api.AnimationID.GEM_CUTTING_JADE; +import static net.runelite.api.AnimationID.GEM_CUTTING_OPAL; +import static net.runelite.api.AnimationID.GEM_CUTTING_REDTOPAZ; +import static net.runelite.api.AnimationID.GEM_CUTTING_RUBY; +import static net.runelite.api.AnimationID.GEM_CUTTING_SAPPHIRE; +import static net.runelite.api.AnimationID.HERBLORE_POTIONMAKING; +import static net.runelite.api.AnimationID.IDLE; +import static net.runelite.api.AnimationID.MAGIC_CHARGING_ORBS; +import static net.runelite.api.AnimationID.MINING_ADAMANT_PICKAXE; +import static net.runelite.api.AnimationID.MINING_BLACK_PICKAXE; +import static net.runelite.api.AnimationID.MINING_BRONZE_PICKAXE; +import static net.runelite.api.AnimationID.MINING_DRAGON_PICKAXE; +import static net.runelite.api.AnimationID.MINING_DRAGON_PICKAXE_ORN; +import static net.runelite.api.AnimationID.MINING_INFERNAL_PICKAXE; +import static net.runelite.api.AnimationID.MINING_IRON_PICKAXE; +import static net.runelite.api.AnimationID.MINING_MITHRIL_PICKAXE; +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_DRAGON; +import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON_ORN; +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.MINING_RUNE_PICKAXE; +import static net.runelite.api.AnimationID.MINING_STEEL_PICKAXE; +import static net.runelite.api.AnimationID.SMITHING_ANVIL; +import static net.runelite.api.AnimationID.SMITHING_CANNONBALL; +import static net.runelite.api.AnimationID.SMITHING_SMELTING; +import static net.runelite.api.AnimationID.WOODCUTTING_ADAMANT; +import static net.runelite.api.AnimationID.WOODCUTTING_BLACK; +import static net.runelite.api.AnimationID.WOODCUTTING_BRONZE; +import static net.runelite.api.AnimationID.WOODCUTTING_DRAGON; +import static net.runelite.api.AnimationID.WOODCUTTING_INFERNAL; +import static net.runelite.api.AnimationID.WOODCUTTING_IRON; +import static net.runelite.api.AnimationID.WOODCUTTING_MITHRIL; +import static net.runelite.api.AnimationID.WOODCUTTING_RUNE; +import static net.runelite.api.AnimationID.WOODCUTTING_STEEL; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import java.time.Duration; @@ -33,12 +96,11 @@ import java.time.temporal.ChronoUnit; import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Actor; -import static net.runelite.api.AnimationID.*; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Player; import net.runelite.api.Skill; -import net.runelite.client.RuneLite; +import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.events.AnimationChanged; import net.runelite.client.events.GameStateChanged; @@ -53,7 +115,7 @@ import net.runelite.client.ui.ClientUI; public class IdleNotifierPlugin extends Plugin { @Inject - RuneLite runelite; + Notifier notifier; @Inject ClientUI gui; @@ -260,7 +322,7 @@ public class IdleNotifierPlugin extends Plugin } if (config.sendTrayNotification()) { - runelite.notify(message); + notifier.notify(message); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java index ccc7de65ec..8c7b10a403 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java @@ -25,31 +25,11 @@ */ package net.runelite.client.plugins.volcanicmine; +import static java.lang.Math.abs; import com.google.common.eventbus.Subscribe; import com.google.inject.Binder; import com.google.inject.Provides; import java.awt.Color; -import static java.lang.Math.abs; -import net.runelite.api.ChatMessageType; -import net.runelite.api.Client; -import net.runelite.api.GameObject; -import net.runelite.api.GameState; -import net.runelite.api.NPC; -import net.runelite.api.Player; -import net.runelite.api.Point; -import net.runelite.api.Region; -import net.runelite.api.Tile; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.RuneLite; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.events.ConfigChanged; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.task.Schedule; -import net.runelite.client.ui.overlay.Overlay; -import javax.annotation.Nullable; -import javax.inject.Inject; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -59,10 +39,31 @@ import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import javax.annotation.Nullable; +import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.ChatMessageType; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.api.Point; import net.runelite.api.Prayer; import net.runelite.api.Query; +import net.runelite.api.Region; +import net.runelite.api.Tile; import net.runelite.api.queries.NPCQuery; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.Notifier; +import net.runelite.client.RuneLite; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.events.ConfigChanged; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.task.Schedule; +import net.runelite.client.ui.overlay.Overlay; @PluginDescriptor( name = "Volcanic mine helper" @@ -87,6 +88,9 @@ public class VolcanicMinePlugin extends Plugin @Inject RuneLite runeLite; + @Inject + Notifier notifier; + @Inject VolcanicMineConfig config; @@ -302,7 +306,7 @@ public class VolcanicMinePlugin extends Plugin } if (config.sendTrayNotification()) { - runeLite.notify(message); + notifier.notify(message); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java index eb314a64a6..f27f017fb6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java @@ -32,7 +32,7 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; import javax.inject.Inject; import net.runelite.api.ChatMessageType; -import net.runelite.client.RuneLite; +import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.events.ChatMessage; import net.runelite.client.plugins.Plugin; @@ -46,7 +46,7 @@ import net.runelite.client.ui.overlay.Overlay; public class WoodcuttingPlugin extends Plugin { @Inject - RuneLite runelite; + Notifier notifier; @Inject WoodcuttingOverlay overlay; @@ -91,7 +91,7 @@ public class WoodcuttingPlugin extends Plugin if (event.getMessage().contains("A bird's nest falls out of the tree") && config.showNestNotification()) { - runelite.notify("A bird nest has spawned!"); + notifier.notify("A bird nest has spawned!"); } } } From 984ebb63dda0423cf52ae1aaec1dc95cf6d4d17c Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 24 Dec 2017 03:09:59 +0100 Subject: [PATCH 2/9] Extract session-related logic to SessionManager - Extract runelite session related logic from RuneLite to SessionManager class and expose this as Guice service - Move WSClient to account package Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 134 +------------- .../net/runelite/client/RuneliteModule.java | 2 + .../client/account/SessionManager.java | 175 ++++++++++++++++++ .../client/{ => account}/WSClient.java | 7 +- .../client/plugins/account/AccountPlugin.java | 20 +- 5 files changed, 196 insertions(+), 142 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/account/SessionManager.java rename runelite-client/src/main/java/net/runelite/client/{ => account}/WSClient.java (98%) 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 61c0fad181..d84fe336c5 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -26,7 +26,6 @@ package net.runelite.client; import com.google.common.base.Strings; import com.google.common.eventbus.EventBus; -import com.google.gson.Gson; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; @@ -38,10 +37,7 @@ import java.awt.TrayIcon; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; import java.io.IOException; -import java.io.InputStreamReader; import java.net.URL; import java.util.concurrent.ScheduledExecutorService; import javax.imageio.ImageIO; @@ -57,16 +53,13 @@ import joptsimple.OptionSet; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.Query; -import net.runelite.client.account.AccountSession; +import net.runelite.client.account.SessionManager; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; -import net.runelite.client.events.SessionClose; -import net.runelite.client.events.SessionOpen; import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.PluginManager; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.overlay.OverlayRenderer; -import net.runelite.http.api.account.AccountClient; import org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel; @Singleton @@ -75,7 +68,6 @@ public class RuneLite { public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite"); public static final File PROFILES_DIR = new File(RUNELITE_DIR, "profiles"); - public static final File SESSION_FILE = new File(RUNELITE_DIR, "session"); public static final File PLUGIN_DIR = new File(RUNELITE_DIR, "plugins"); public static Image ICON; @@ -113,9 +105,8 @@ public class RuneLite @Inject private OverlayRenderer overlayRenderer; - private WSClient wsclient; - - private AccountSession accountSession; + @Inject + private SessionManager sessionManager; Notifier notifier; @@ -199,7 +190,7 @@ public class RuneLite pluginManager.startCorePlugins(); // Load the session, including saved configuration - loadSession(); + sessionManager.loadSession(); // Begin watching for new plugins pluginManager.watch(); @@ -251,118 +242,6 @@ public class RuneLite }); } - private void loadSession() - { - if (!SESSION_FILE.exists()) - { - log.info("No session file exists"); - return; - } - - AccountSession session; - - try (FileInputStream in = new FileInputStream(SESSION_FILE)) - { - session = new Gson().fromJson(new InputStreamReader(in), AccountSession.class); - - log.debug("Loaded session for {}", session.getUsername()); - } - catch (Exception ex) - { - log.warn("Unable to load session file", ex); - return; - } - - // Check if session is still valid - AccountClient accountClient = new AccountClient(session.getUuid()); - if (!accountClient.sesssionCheck()) - { - log.debug("Loaded session {} is invalid", session.getUuid()); - return; - } - - openSession(session); - } - - public void saveSession() - { - if (accountSession == null) - { - return; - } - - try (FileWriter fw = new FileWriter(SESSION_FILE)) - { - new Gson().toJson(accountSession, fw); - - log.debug("Saved session to {}", SESSION_FILE); - } - catch (IOException ex) - { - log.warn("Unable to save session file", ex); - } - } - - public void deleteSession() - { - SESSION_FILE.delete(); - } - - /** - * Set the given session as the active session and open a socket to the - * server with the given session - * - * @param session - */ - public void openSession(AccountSession session) - { - // If the ws session already exists, don't need to do anything - if (wsclient == null || !wsclient.getSession().equals(session)) - { - if (wsclient != null) - { - wsclient.close(); - } - - wsclient = new WSClient(eventBus, executor, session); - wsclient.connect(); - } - - accountSession = session; - - if (session.getUsername() != null) - { - // Initialize config for new session - // If the session isn't logged in yet, don't switch to the new config - configManager.switchSession(session); - } - - eventBus.post(new SessionOpen()); - } - - public void closeSession() - { - if (wsclient != null) - { - wsclient.close(); - wsclient = null; - } - - if (accountSession == null) - { - return; - } - - log.debug("Logging out of account {}", accountSession.getUsername()); - - accountSession = null; // No more account - - // Restore config - configManager.switchSession(null); - - eventBus.post(new SessionClose()); - } - public Client getClient() { return client; @@ -408,11 +287,6 @@ public class RuneLite return trayIcon; } - public AccountSession getAccountSession() - { - return accountSession; - } - public T[] runQuery(Query query) { return (T[]) query.result(client); diff --git a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java index 2de30f5840..794db3b0e7 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java @@ -33,6 +33,7 @@ import java.util.concurrent.ScheduledExecutorService; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.client.account.SessionManager; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.config.RuneliteConfig; @@ -57,6 +58,7 @@ public class RuneliteModule extends AbstractModule bind(Scheduler.class); bind(PluginManager.class); bind(RuneliteProperties.class); + bind(SessionManager.class); } @Provides diff --git a/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java b/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java new file mode 100644 index 0000000000..a4ab814003 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/account/SessionManager.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2017, 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.account; + +import com.google.common.eventbus.EventBus; +import com.google.gson.Gson; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.concurrent.ScheduledExecutorService; +import javax.inject.Inject; +import javax.inject.Singleton; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.client.RuneLite; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.events.SessionClose; +import net.runelite.client.events.SessionOpen; +import net.runelite.http.api.account.AccountClient; + +@Singleton +@Slf4j +public class SessionManager +{ + private static final File SESSION_FILE = new File(RuneLite.RUNELITE_DIR, "session"); + private WSClient wsclient; + + @Getter + private AccountSession accountSession; + + @Inject + private EventBus eventBus; + + @Inject + private ConfigManager configManager; + + @Inject + private ScheduledExecutorService executor; + + public void loadSession() + { + if (!SESSION_FILE.exists()) + { + log.info("No session file exists"); + return; + } + + AccountSession session; + + try (FileInputStream in = new FileInputStream(SESSION_FILE)) + { + session = new Gson().fromJson(new InputStreamReader(in), AccountSession.class); + + log.debug("Loaded session for {}", session.getUsername()); + } + catch (Exception ex) + { + log.warn("Unable to load session file", ex); + return; + } + + // Check if session is still valid + AccountClient accountClient = new AccountClient(session.getUuid()); + if (!accountClient.sesssionCheck()) + { + log.debug("Loaded session {} is invalid", session.getUuid()); + return; + } + + openSession(session); + } + + public void saveSession() + { + if (accountSession == null) + { + return; + } + + try (FileWriter fw = new FileWriter(SESSION_FILE)) + { + new Gson().toJson(accountSession, fw); + + log.debug("Saved session to {}", SESSION_FILE); + } + catch (IOException ex) + { + log.warn("Unable to save session file", ex); + } + } + + public void deleteSession() + { + SESSION_FILE.delete(); + } + + /** + * Set the given session as the active session and open a socket to the + * server with the given session + * + * @param session + */ + public void openSession(AccountSession session) + { + // If the ws session already exists, don't need to do anything + if (wsclient == null || !wsclient.getSession().equals(session)) + { + if (wsclient != null) + { + wsclient.close(); + } + + wsclient = new WSClient(eventBus, executor, session); + wsclient.connect(); + } + + accountSession = session; + + if (session.getUsername() != null) + { + // Initialize config for new session + // If the session isn't logged in yet, don't switch to the new config + configManager.switchSession(session); + } + + eventBus.post(new SessionOpen()); + } + + public void closeSession() + { + if (wsclient != null) + { + wsclient.close(); + wsclient = null; + } + + if (accountSession == null) + { + return; + } + + log.debug("Logging out of account {}", accountSession.getUsername()); + + accountSession = null; // No more account + + // Restore config + configManager.switchSession(null); + + eventBus.post(new SessionClose()); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/WSClient.java b/runelite-client/src/main/java/net/runelite/client/account/WSClient.java similarity index 98% rename from runelite-client/src/main/java/net/runelite/client/WSClient.java rename to runelite-client/src/main/java/net/runelite/client/account/WSClient.java index e39a595056..f5c457d455 100644 --- a/runelite-client/src/main/java/net/runelite/client/WSClient.java +++ b/runelite-client/src/main/java/net/runelite/client/account/WSClient.java @@ -22,7 +22,7 @@ * (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; +package net.runelite.client.account; import com.google.common.eventbus.EventBus; import com.google.gson.Gson; @@ -32,12 +32,11 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; -import net.runelite.client.account.AccountSession; import net.runelite.http.api.RuneliteAPI; -import net.runelite.http.api.ws.messages.Handshake; -import net.runelite.http.api.ws.messages.Ping; import net.runelite.http.api.ws.WebsocketGsonFactory; import net.runelite.http.api.ws.WebsocketMessage; +import net.runelite.http.api.ws.messages.Handshake; +import net.runelite.http.api.ws.messages.Ping; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java index f55d0faaf3..fdaa339d8e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java @@ -37,6 +37,7 @@ import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.client.RuneLite; import net.runelite.client.account.AccountSession; +import net.runelite.client.account.SessionManager; import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionOpen; import net.runelite.client.plugins.Plugin; @@ -58,6 +59,9 @@ public class AccountPlugin extends Plugin @Inject RuneLite runelite; + @Inject + SessionManager sessionManager; + @Inject ClientUI ui; @@ -87,7 +91,7 @@ public class AccountPlugin extends Plugin private void logoutClick(ActionEvent ae) { // Destroy session - AccountSession session = runelite.getAccountSession(); + AccountSession session = sessionManager.getAccountSession(); if (session != null) { AccountClient client = new AccountClient(session.getUuid()); @@ -101,8 +105,8 @@ public class AccountPlugin extends Plugin } } - runelite.closeSession(); // remove session from client - runelite.deleteSession(); // delete saved session file + sessionManager.closeSession(); // remove session from client + sessionManager.deleteSession(); // delete saved session file // Replace logout nav button with login PluginToolbar navigationPanel = ui.getPluginToolbar(); @@ -129,7 +133,7 @@ public class AccountPlugin extends Plugin session.setUuid(login.getUid()); session.setCreated(Instant.now()); - runelite.openSession(session); + sessionManager.openSession(session); if (!Desktop.isDesktopSupported()) { @@ -161,21 +165,21 @@ public class AccountPlugin extends Plugin { log.debug("Now logged in as {}", loginResponse.getUsername()); - AccountSession session = runelite.getAccountSession(); + AccountSession session = sessionManager.getAccountSession(); session.setUsername(loginResponse.getUsername()); // Open session, again, now that we have a username // This triggers onSessionOpen - runelite.openSession(session); + sessionManager.openSession(session); // Save session to disk - runelite.saveSession(); + sessionManager.saveSession(); } @Subscribe public void onSessionOpen(SessionOpen sessionOpen) { - AccountSession session = runelite.getAccountSession(); + AccountSession session = sessionManager.getAccountSession(); if (session.getUsername() == null) { From 69b88fe3e3ad93d3787d8577d6e4b6d3f3e405da Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 24 Dec 2017 03:22:07 +0100 Subject: [PATCH 3/9] Extract runQuery to QueryRunner service Extract runQuery method from runelite to separate Guice service. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 4 -- .../net/runelite/client/RuneliteModule.java | 2 + .../plugins/fightcave/FightCavePlugin.java | 9 ++-- .../plugins/fishing/FishingSpotOverlay.java | 14 +++--- .../client/plugins/hunter/HunterPlugin.java | 12 +++--- .../plugins/implings/ImplingsOverlay.java | 14 +++--- .../jewellerycount/JewelleryCountOverlay.java | 12 +++--- .../pestcontrol/PestControlOverlay.java | 12 +++--- .../plugins/runecraft/BindNeckOverlay.java | 12 +++--- .../plugins/runecraft/RunecraftOverlay.java | 12 +++--- .../plugins/runepouch/RunepouchOverlay.java | 12 +++--- .../client/plugins/slayer/SlayerOverlay.java | 12 +++--- .../volcanicmine/VolcanicMinePlugin.java | 6 ++- .../client/plugins/zulrah/ZulrahPlugin.java | 6 +-- .../net/runelite/client/util/QueryRunner.java | 43 +++++++++++++++++++ 15 files changed, 109 insertions(+), 73 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/util/QueryRunner.java 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 d84fe336c5..8febe52782 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -287,8 +287,4 @@ public class RuneLite return trayIcon; } - public T[] runQuery(Query query) - { - return (T[]) query.result(client); - } } diff --git a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java index 794db3b0e7..405c07d172 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java @@ -43,6 +43,7 @@ import net.runelite.client.plugins.PluginManager; import net.runelite.client.task.Scheduler; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.util.QueryRunner; @Slf4j public class RuneliteModule extends AbstractModule @@ -51,6 +52,7 @@ public class RuneliteModule extends AbstractModule protected void configure() { bind(ScheduledExecutorService.class).toInstance(Executors.newSingleThreadScheduledExecutor()); + bind(QueryRunner.class); bind(MenuManager.class); bind(ChatMessageManager.class); bind(ItemManager.class); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java index fa88348068..c0b82d8a3d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java @@ -25,22 +25,21 @@ package net.runelite.client.plugins.fightcave; import com.google.inject.Binder; +import com.google.inject.Provides; import java.time.temporal.ChronoUnit; import javax.annotation.Nullable; import javax.inject.Inject; - -import com.google.inject.Provides; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.NPC; import net.runelite.api.Query; import net.runelite.api.queries.NPCQuery; -import net.runelite.client.RuneLite; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.util.QueryRunner; @PluginDescriptor( name = "Fight cave plugin" @@ -52,7 +51,7 @@ public class FightCavePlugin extends Plugin Client client; @Inject - RuneLite runelite; + QueryRunner queryRunner; @Inject FightCaveConfig config; @@ -112,7 +111,7 @@ public class FightCavePlugin extends Plugin private NPC findJad() { Query query = new NPCQuery().nameContains("TzTok-Jad"); - NPC[] result = runelite.runQuery(query); + NPC[] result = queryRunner.runQuery(query); return result.length >= 1 ? result[0] : null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java index 14009ba3b5..9b02837917 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java @@ -32,34 +32,30 @@ import java.awt.Point; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nullable; import javax.inject.Inject; -import net.runelite.api.Client; import net.runelite.api.NPC; import net.runelite.api.queries.NPCQuery; -import net.runelite.client.RuneLite; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.util.QueryRunner; class FishingSpotOverlay extends Overlay { private final List ids = new ArrayList<>(); - private final RuneLite runelite; - private final Client client; + private final QueryRunner queryRunner; private final FishingConfig config; @Inject ItemManager itemManager; @Inject - public FishingSpotOverlay(RuneLite runelite, @Nullable Client client, FishingConfig config) + public FishingSpotOverlay(QueryRunner queryRunner, FishingConfig config) { setPosition(OverlayPosition.DYNAMIC); - this.runelite = runelite; - this.client = client; + this.queryRunner = queryRunner; this.config = config; } @@ -73,7 +69,7 @@ class FishingSpotOverlay extends Overlay NPCQuery query = new NPCQuery() .idEquals(Ints.toArray(ids)); - NPC[] npcs = runelite.runQuery(query); + NPC[] npcs = queryRunner.runQuery(query); for (NPC npc : npcs) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java index 867d7b8547..2164276695 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/HunterPlugin.java @@ -31,9 +31,9 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; import javax.inject.Inject; import lombok.Getter; @@ -47,7 +47,6 @@ import net.runelite.api.Player; import net.runelite.api.Point; import net.runelite.api.queries.GameObjectQuery; import net.runelite.api.queries.PlayerQuery; -import net.runelite.client.RuneLite; import net.runelite.client.config.ConfigManager; import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.GameObjectsChanged; @@ -56,6 +55,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.util.QueryRunner; @Slf4j @PluginDescriptor( @@ -67,7 +67,7 @@ public class HunterPlugin extends Plugin private Client client; @Inject - private RuneLite runelite; + private QueryRunner queryRunner; @Inject private HunterConfig config; @@ -139,7 +139,7 @@ public class HunterPlugin extends Plugin case ObjectID.NET_TRAP_9002: //Net trap placed at black sallys //Look for players that are on the same tile PlayerQuery playerQuery = new PlayerQuery().atLocalLocation(gameObject.getLocalLocation()); - List possiblePlayers = Arrays.asList(runelite.runQuery(playerQuery)); + List possiblePlayers = Arrays.asList(queryRunner.runQuery(playerQuery)); /* If the player is on that tile, and it has the correct animation, assume he is the one that placed the trap * Special case: if you herb+tar, then move and place the trap, it does not detect laying the trap. It does work @@ -294,7 +294,7 @@ public class HunterPlugin extends Plugin GameObjectQuery goQuery = new GameObjectQuery() .atWorldLocation(trap.getGameObject().getWorldLocation()); //This is for placeable traps like box traps. There are no gameobjects on that location if the trap collapsed - if (runelite.runQuery(goQuery).length == 0) + if (queryRunner.runQuery(goQuery).length == 0) { it.remove(); log.debug("Trap removed from personal trap collection, {} left", traps.size()); @@ -303,7 +303,7 @@ public class HunterPlugin extends Plugin { goQuery = goQuery .idEquals(ObjectID.BOULDER_19215); //Deadfalls are the only ones (that i can test) that have this behaviour. I think maniacal monkeys have this too. - if (runelite.runQuery(goQuery).length != 0) + if (queryRunner.runQuery(goQuery).length != 0) { it.remove(); log.debug("Special trap removed from personal trap collection, {} left", traps.size()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java index 7135b1a8da..ab8347bdc9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/implings/ImplingsOverlay.java @@ -32,17 +32,15 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.util.LinkedList; import java.util.List; -import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Actor; -import net.runelite.api.Client; import net.runelite.api.NPC; import net.runelite.api.NpcID; import net.runelite.api.Point; import net.runelite.api.queries.NPCQuery; -import net.runelite.client.RuneLite; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.util.QueryRunner; /** * @@ -55,17 +53,15 @@ public class ImplingsOverlay extends Overlay private static final int STATIC_SPAWN = 1618; private static final int DYNAMIC_SPAWN = 1633; - private final RuneLite runelite; - private final Client client; + private final QueryRunner queryRunner; private final ImplingsConfig config; private final List ids = new LinkedList<>(); @Inject - public ImplingsOverlay(RuneLite runelite, @Nullable Client client, ImplingsConfig config) + public ImplingsOverlay(QueryRunner queryRunner, ImplingsConfig config) { setPosition(OverlayPosition.DYNAMIC); - this.runelite = runelite; - this.client = client; + this.queryRunner = queryRunner; this.config = config; } @@ -73,7 +69,7 @@ public class ImplingsOverlay extends Overlay public Dimension render(Graphics2D graphics, java.awt.Point parent) { NPCQuery implingQuery = new NPCQuery().idEquals(Ints.toArray(ids)); - NPC[] implings = runelite.runQuery(implingQuery); + NPC[] implings = queryRunner.runQuery(implingQuery); for (NPC imp : implings) { //Spawns have the name "null", so they get changed to "Spawn" diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/jewellerycount/JewelleryCountOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/jewellerycount/JewelleryCountOverlay.java index d16a971aef..19ba8b1114 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/jewellerycount/JewelleryCountOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/jewellerycount/JewelleryCountOverlay.java @@ -37,22 +37,22 @@ import net.runelite.api.queries.EquipmentItemQuery; import net.runelite.api.queries.InventoryItemQuery; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetItem; -import net.runelite.client.RuneLite; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.TextComponent; +import net.runelite.client.util.QueryRunner; class JewelleryCountOverlay extends Overlay { - private final RuneLite runelite; + private final QueryRunner queryRunner; private final JewelleryCountConfig config; @Inject - JewelleryCountOverlay(RuneLite runelite, JewelleryCountConfig config) + JewelleryCountOverlay(QueryRunner queryRunner, JewelleryCountConfig config) { setPosition(OverlayPosition.DYNAMIC); - this.runelite = runelite; + this.queryRunner = queryRunner; this.config = config; this.setDrawOverBankScreen(true); } @@ -89,14 +89,14 @@ class JewelleryCountOverlay extends Overlay private Collection getJewelleryWidgetItems() { Query inventoryQuery = new InventoryItemQuery(); - WidgetItem[] inventoryWidgetItems = runelite.runQuery(inventoryQuery); + WidgetItem[] inventoryWidgetItems = queryRunner.runQuery(inventoryQuery); Query equipmentQuery = new EquipmentItemQuery().slotEquals( WidgetInfo.EQUIPMENT_AMULET, WidgetInfo.EQUIPMENT_RING, WidgetInfo.EQUIPMENT_GLOVES ); - WidgetItem[] equipmentWidgetItems = runelite.runQuery(equipmentQuery); + WidgetItem[] equipmentWidgetItems = queryRunner.runQuery(equipmentQuery); Collection jewellery = new ArrayList<>(); jewellery.addAll(Arrays.asList(inventoryWidgetItems)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlOverlay.java index 956d001c37..a6ca3c955f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlOverlay.java @@ -45,15 +45,15 @@ import net.runelite.api.Query; import net.runelite.api.queries.NPCQuery; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.RuneLite; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.util.QueryRunner; @Slf4j public class PestControlOverlay extends Overlay { - private final RuneLite runelite; + private final QueryRunner queryRunner; private final Client client; private final PestControlPlugin plugin; @@ -62,11 +62,11 @@ public class PestControlOverlay extends Overlay private Game game; @Inject - public PestControlOverlay(RuneLite runelite, PestControlPlugin plugin) + public PestControlOverlay(QueryRunner queryRunner, Client client, PestControlPlugin plugin) { setPosition(OverlayPosition.DYNAMIC); - this.runelite = runelite; - this.client = runelite.getClient(); + this.queryRunner = queryRunner; + this.client = client; this.plugin = plugin; } @@ -106,7 +106,7 @@ public class PestControlOverlay extends Overlay private void renderSpinners(Graphics2D graphics) { Query query = new NPCQuery().nameEquals("Spinner"); - NPC[] result = runelite.runQuery(query); + NPC[] result = queryRunner.runQuery(query); Arrays.stream(result).forEach(npc -> OverlayUtil.renderActorOverlay(graphics, npc, npc.getName(), Color.CYAN)); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/BindNeckOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/BindNeckOverlay.java index 69d098877a..b568e7cc4e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/BindNeckOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/BindNeckOverlay.java @@ -40,23 +40,23 @@ import net.runelite.api.queries.EquipmentItemQuery; import net.runelite.api.queries.InventoryItemQuery; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetItem; -import net.runelite.client.RuneLite; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.TextComponent; +import net.runelite.client.util.QueryRunner; public class BindNeckOverlay extends Overlay { - private final RuneLite runelite; + private final QueryRunner queryRunner; private final RunecraftConfig config; int bindingCharges; @Inject - BindNeckOverlay(RuneLite runelite, RunecraftConfig config) + BindNeckOverlay(QueryRunner queryRunner, RunecraftConfig config) { setPosition(OverlayPosition.DYNAMIC); - this.runelite = runelite; + this.queryRunner = queryRunner; this.config = config; this.setDrawOverBankScreen(true); } @@ -91,12 +91,12 @@ public class BindNeckOverlay extends Overlay { Query inventoryQuery = new InventoryItemQuery() .idEquals(BINDING_NECKLACE); - WidgetItem[] inventoryWidgetItems = runelite.runQuery(inventoryQuery); + WidgetItem[] inventoryWidgetItems = queryRunner.runQuery(inventoryQuery); Query equipmentQuery = new EquipmentItemQuery() .slotEquals(WidgetInfo.EQUIPMENT_AMULET) .idEquals(BINDING_NECKLACE); - WidgetItem[] equipmentWidgetItems = runelite.runQuery(equipmentQuery); + WidgetItem[] equipmentWidgetItems = queryRunner.runQuery(equipmentQuery); Collection necklaces = new ArrayList<>(); necklaces.addAll(Arrays.asList(inventoryWidgetItems)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java index cbfa054c1d..8db6417ef0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftOverlay.java @@ -35,11 +35,11 @@ import net.runelite.api.Query; import net.runelite.api.Varbits; import net.runelite.api.queries.InventoryItemQuery; import net.runelite.api.widgets.WidgetItem; -import net.runelite.client.RuneLite; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.TextComponent; +import net.runelite.client.util.QueryRunner; public class RunecraftOverlay extends Overlay { @@ -47,17 +47,17 @@ public class RunecraftOverlay extends Overlay private static final int LARGE_POUCH_DAMAGED = ItemID.LARGE_POUCH_5513; private static final int GIANT_POUCH_DAMAGED = ItemID.GIANT_POUCH_5515; - private final RuneLite runelite; + private final QueryRunner queryRunner; private final Client client; private final RunecraftConfig config; @Inject - RunecraftOverlay(RuneLite runelite, RunecraftConfig config) + RunecraftOverlay(QueryRunner queryRunner, Client client, RunecraftConfig config) { setPosition(OverlayPosition.DYNAMIC); - this.runelite = runelite; - this.client = runelite.getClient(); + this.queryRunner = queryRunner; + this.client = client; this.config = config; this.setDrawOverBankScreen(true); } @@ -71,7 +71,7 @@ public class RunecraftOverlay extends Overlay } Query query = new InventoryItemQuery(); - WidgetItem[] widgetItems = runelite.runQuery(query); + WidgetItem[] widgetItems = queryRunner.runQuery(query); graphics.setFont(FontManager.getRunescapeSmallFont()); for (WidgetItem item : widgetItems) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java index 39258cc50a..b01aa2cb3d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java @@ -36,13 +36,13 @@ import net.runelite.api.Query; import net.runelite.api.Varbits; import net.runelite.api.queries.InventoryItemQuery; import net.runelite.api.widgets.WidgetItem; -import net.runelite.client.RuneLite; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; +import net.runelite.client.util.QueryRunner; public class RunepouchOverlay extends Overlay { @@ -57,18 +57,18 @@ public class RunepouchOverlay extends Overlay private final RuneImageCache runeImageCache = new RuneImageCache(); - private final RuneLite runelite; + private final QueryRunner queryRunner; private final Client client; private final RunepouchConfig config; private final TooltipManager tooltipManager; @Inject - RunepouchOverlay(RuneLite runelite, RunepouchConfig config, TooltipManager tooltipManager) + RunepouchOverlay(QueryRunner queryRunner, Client client, RunepouchConfig config, TooltipManager tooltipManager) { setPosition(OverlayPosition.DYNAMIC); this.tooltipManager = tooltipManager; - this.runelite = runelite; - this.client = runelite.getClient(); + this.queryRunner = queryRunner; + this.client = client; this.config = config; this.setDrawOverBankScreen(true); } @@ -82,7 +82,7 @@ public class RunepouchOverlay extends Overlay } Query query = new InventoryItemQuery().idEquals(ItemID.RUNE_POUCH); - WidgetItem[] items = runelite.runQuery(query); + WidgetItem[] items = queryRunner.runQuery(query); if (items.length == 0) { return null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java index 1037fdd92f..4a52d38103 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerOverlay.java @@ -40,15 +40,15 @@ import net.runelite.api.queries.EquipmentItemQuery; import net.runelite.api.queries.InventoryItemQuery; import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetItem; -import net.runelite.client.RuneLite; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.TextComponent; +import net.runelite.client.util.QueryRunner; class SlayerOverlay extends Overlay { - private final RuneLite runelite; + private final QueryRunner queryRunner; private final SlayerConfig config; private final SlayerPlugin plugin; @@ -80,10 +80,10 @@ class SlayerOverlay extends Overlay ); @Inject - SlayerOverlay(RuneLite runelite, SlayerPlugin plugin, SlayerConfig config) + SlayerOverlay(QueryRunner queryRunner, SlayerPlugin plugin, SlayerConfig config) { setPosition(OverlayPosition.DYNAMIC); - this.runelite = runelite; + this.queryRunner = queryRunner; this.plugin = plugin; this.config = config; } @@ -132,10 +132,10 @@ class SlayerOverlay extends Overlay private Collection getSlayerWidgetItems() { Query inventoryQuery = new InventoryItemQuery(); - WidgetItem[] inventoryWidgetItems = runelite.runQuery(inventoryQuery); + WidgetItem[] inventoryWidgetItems = queryRunner.runQuery(inventoryQuery); Query equipmentQuery = new EquipmentItemQuery().slotEquals(WidgetInfo.EQUIPMENT_HELMET, WidgetInfo.EQUIPMENT_RING); - WidgetItem[] equipmentWidgetItems = runelite.runQuery(equipmentQuery); + WidgetItem[] equipmentWidgetItems = queryRunner.runQuery(equipmentQuery); WidgetItem[] items = concat(inventoryWidgetItems, equipmentWidgetItems, WidgetItem.class); return ImmutableList.copyOf(items); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java index 8c7b10a403..40e7183165 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java @@ -64,6 +64,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.util.QueryRunner; @PluginDescriptor( name = "Volcanic mine helper" @@ -88,6 +89,9 @@ public class VolcanicMinePlugin extends Plugin @Inject RuneLite runeLite; + @Inject + QueryRunner queryRunner; + @Inject Notifier notifier; @@ -278,7 +282,7 @@ public class VolcanicMinePlugin extends Plugin Query query = new NPCQuery() .nameEquals(LAVA_BEAST) .isWithinArea(player.getLocalLocation(), LAVA_BEAST_ATTACK_RANGE); - NPC[] npcs = runeLite.runQuery(query); + NPC[] npcs = queryRunner.runQuery(query); return npcs.length > 0; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java index c374aa4772..31dea9c204 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java @@ -39,7 +39,6 @@ import net.runelite.api.GameState; import net.runelite.api.NPC; import net.runelite.api.Query; import net.runelite.api.queries.NPCQuery; -import net.runelite.client.RuneLite; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -55,6 +54,7 @@ import net.runelite.client.plugins.zulrah.patterns.ZulrahPatternD; import net.runelite.client.plugins.zulrah.phase.ZulrahPhase; import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.util.QueryRunner; @PluginDescriptor( name = "Zulrah plugin" @@ -63,7 +63,7 @@ import net.runelite.client.ui.overlay.Overlay; public class ZulrahPlugin extends Plugin { @Inject - RuneLite runelite; + QueryRunner queryRunner; @Inject @Nullable @@ -187,7 +187,7 @@ public class ZulrahPlugin extends Plugin private NPC findZulrah() { Query query = new NPCQuery().nameEquals("Zulrah"); - NPC[] result = runelite.runQuery(query); + NPC[] result = queryRunner.runQuery(query); return result.length == 1 ? result[0] : null; } diff --git a/runelite-client/src/main/java/net/runelite/client/util/QueryRunner.java b/runelite-client/src/main/java/net/runelite/client/util/QueryRunner.java new file mode 100644 index 0000000000..0f34fc5448 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/util/QueryRunner.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017, 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.util; + +import javax.inject.Inject; +import javax.inject.Singleton; +import net.runelite.api.Client; +import net.runelite.api.Query; + +@Singleton +public class QueryRunner +{ + @Inject + private Client client; + + @SuppressWarnings("unchecked") + public T[] runQuery(Query query) + { + return (T[]) query.result(client); + } +} \ No newline at end of file From bd521acbb0c3425b4cd734a6b6314767eff22fbe Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 24 Dec 2017 03:28:04 +0100 Subject: [PATCH 4/9] Move creation of client to RuneLite Instead of using setters and getters to move around reference to Client and creating the client in the client panel, move creation of the Client to RuneLite and add new field to PluginDescriptor if the plugin should be loaded when client is outdated. Signed-off-by: Tomas Slusny --- .../net/runelite/client/ClientLoader.java | 38 +++++++++- .../java/net/runelite/client/RuneLite.java | 40 +++++++---- .../net/runelite/client/RuneliteModule.java | 4 +- .../client/plugins/PluginDescriptor.java | 2 + .../client/plugins/PluginManager.java | 9 +++ .../client/plugins/hiscore/HiscorePlugin.java | 3 +- .../net/runelite/client/ui/ClientPanel.java | 71 ++++--------------- .../java/net/runelite/client/ui/ClientUI.java | 30 ++------ 8 files changed, 98 insertions(+), 99 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/ClientLoader.java index 98564796cc..82b4614332 100644 --- a/runelite-client/src/main/java/net/runelite/client/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/ClientLoader.java @@ -28,10 +28,44 @@ import java.applet.Applet; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; +import java.util.Optional; +import lombok.extern.slf4j.Slf4j; +import net.runelite.http.api.updatecheck.UpdateCheckClient; +@Slf4j public class ClientLoader { - public Applet loadRunelite() throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException + public Optional loadRs() + { + final UpdateCheckClient updateCheck = new UpdateCheckClient(); + boolean isOutdated = updateCheck.isOutdated(); + + try + { + if (isOutdated) + { + log.info("Runelite is outdated - fetching vanilla client"); + return Optional.of(loadVanilla()); + } + + log.debug("Runelite is up to date"); + return Optional.of(loadRunelite()); + } + catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e) + { + if (e instanceof ClassNotFoundException) + { + log.error("Unable to load client - class not found. This means you" + + " are not running RuneLite with Maven as the injected client" + + " is not in your classpath."); + } + + log.error("Error loading RS!", e); + return Optional.empty(); + } + } + + private Applet loadRunelite() throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException { ConfigLoader config = new ConfigLoader(); @@ -48,7 +82,7 @@ public class ClientLoader return rs; } - public Applet loadVanilla() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException + private Applet loadVanilla() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { ConfigLoader config = new ConfigLoader(); 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 8febe52782..e76e44564d 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -29,6 +29,7 @@ import com.google.common.eventbus.EventBus; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; +import java.applet.Applet; import java.awt.AWTException; import java.awt.Frame; import java.awt.Image; @@ -39,6 +40,7 @@ import java.awt.event.MouseEvent; import java.io.File; import java.io.IOException; import java.net.URL; +import java.util.Optional; import java.util.concurrent.ScheduledExecutorService; import javax.imageio.ImageIO; import javax.inject.Singleton; @@ -52,7 +54,6 @@ import joptsimple.OptionParser; import joptsimple.OptionSet; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; -import net.runelite.api.Query; import net.runelite.client.account.SessionManager; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; @@ -78,7 +79,6 @@ public class RuneLite private static RuneLite runelite; private static TrayIcon trayIcon; - private Client client; private ClientUI gui; @Inject @@ -108,6 +108,7 @@ public class RuneLite @Inject private SessionManager sessionManager; + Client client; Notifier notifier; static @@ -149,6 +150,26 @@ public class RuneLite public void start() throws Exception { + // Load Runelite or Vanilla client + final boolean hasRs = !getOptions().has("no-rs"); + final Optional optionalClient = hasRs + ? new ClientLoader().loadRs() + : Optional.empty(); + + if (!optionalClient.isPresent() && hasRs) + { + System.exit(-1); + return; + } + + final Applet client = optionalClient.orElseGet(null); + final boolean isOutdated = client == null || !(client instanceof Client); + + if (!isOutdated) + { + this.client = (Client) client; + } + SwingUtilities.invokeAndWait(() -> { JFrame.setDefaultLookAndFeelDecorated(true); @@ -163,7 +184,7 @@ public class RuneLite log.warn("unable to set look and feel", ex); } - gui = new ClientUI(this); + gui = new ClientUI(client); setTitle(null); setupTrayIcon(); @@ -178,6 +199,9 @@ public class RuneLite // Setup the notifier notifier = new Notifier(properties.getTitle(), trayIcon); + // Tell the plugin manager if client is outdated or not + pluginManager.setOutdated(isOutdated); + // Load the plugins, but does not start them yet. // This will initialize configuration pluginManager.loadCorePlugins(); @@ -242,16 +266,6 @@ public class RuneLite }); } - public Client getClient() - { - return client; - } - - public void setClient(Client client) - { - this.client = client; - } - public ClientUI getGui() { return gui; diff --git a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java index 405c07d172..bfd32d2c8e 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java @@ -64,9 +64,9 @@ public class RuneliteModule extends AbstractModule } @Provides - Client provideClient(RuneLite runelite) + Client provideClient(RuneLite runeLite) { - return runelite.getClient(); + return runeLite.client; } @Provides diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java index 22f8e51fe9..19599c815c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginDescriptor.java @@ -38,4 +38,6 @@ public @interface PluginDescriptor String name(); boolean developerPlugin() default false; + + boolean loadWhenOutdated() default false; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index 23ccea728e..a4b0a0194d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -42,6 +42,7 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.inject.Singleton; import javax.swing.SwingUtilities; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.client.RuneLite; import net.runelite.client.events.PluginChanged; @@ -67,6 +68,9 @@ public class PluginManager @Inject PluginWatcher pluginWatcher; + @Setter + boolean isOutdated; + private final List plugins = new CopyOnWriteArrayList<>(); public void loadCorePlugins() throws IOException @@ -127,6 +131,11 @@ public class PluginManager continue; } + if (!pluginDescriptor.loadWhenOutdated() && isOutdated) + { + continue; + } + if (pluginDescriptor.developerPlugin() && !developerPlugins) { continue; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java index 9b459fd6a5..38e949d6e8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java @@ -36,7 +36,8 @@ import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.NavigationButton; @PluginDescriptor( - name = "Hiscore plugin" + name = "Hiscore plugin", + loadWhenOutdated = true ) public class HiscorePlugin extends Plugin { diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java index 0a07814130..92336b67ba 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java @@ -25,89 +25,46 @@ package net.runelite.client.ui; import java.applet.Applet; +import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; -import java.awt.BorderLayout; -import java.io.IOException; +import javax.annotation.Nullable; import javax.swing.JPanel; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; -import net.runelite.client.ClientLoader; -import net.runelite.http.api.updatecheck.UpdateCheckClient; @Slf4j final class ClientPanel extends JPanel { public static final int PANEL_WIDTH = 765, PANEL_HEIGHT = 503; - private final ClientUI ui; - private Applet rs; - - public ClientPanel(ClientUI ui) + public ClientPanel(@Nullable Applet client) { - this.ui = ui; setSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); setLayout(new BorderLayout()); setBackground(Color.black); - } - public void loadRs() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException - { - ClientLoader loader = new ClientLoader(); - - UpdateCheckClient updateCheck = new UpdateCheckClient(); - boolean isOutdated = updateCheck.isOutdated(); - if (isOutdated) - { - log.info("Runelite is outdated - fetching vanilla client"); - rs = loader.loadVanilla(); - } - else - { - log.debug("Runelite is up to date"); - - try - { - rs = loader.loadRunelite(); - } - catch (ClassNotFoundException ex) - { - log.error("Unable to load client - class not found. This means you" - + " are not running RuneLite with Maven as the injected client" - + " is not in your classpath."); - throw new ClassNotFoundException("Unable to load injected client", ex); - } - } - - rs.setLayout(null); - rs.setSize(PANEL_WIDTH, PANEL_HEIGHT); - - rs.init(); - rs.start(); - - add(rs, BorderLayout.CENTER); - - if (isOutdated) + if (client == null) { return; } - if (!(rs instanceof Client)) - { - log.error("Injected client does not implement Client!"); - return; - } + client.setLayout(null); + client.setSize(PANEL_WIDTH, PANEL_HEIGHT); - Client client = (Client) rs; + client.init(); + client.start(); - ui.getRunelite().setClient(client); + add(client, BorderLayout.CENTER); // This causes the whole game frame to be redrawn each frame instead // of only the viewport, so we can hook to MainBufferProvider#draw // and draw anywhere without it leaving artifacts - client.setGameDrawingMode(2); + if (client instanceof Client) + { + ((Client)client).setGameDrawingMode(2); + } } - -} +} \ No newline at end of file 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 2a7a278b93..ef26e13b0a 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 @@ -24,11 +24,11 @@ */ package net.runelite.client.ui; +import java.applet.Applet; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.io.IOException; import java.util.Enumeration; import javax.swing.JFrame; import javax.swing.JOptionPane; @@ -51,16 +51,16 @@ public class ClientUI extends JFrame private static final int SCROLLBAR_WIDTH = 17; private static final int EXPANDED_WIDTH = CLIENT_WIDTH + PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH; - private final RuneLite runelite; + private final Applet client; private JPanel container; private JPanel navContainer; private ClientPanel panel; private PluginToolbar pluginToolbar; private PluginPanel pluginPanel; - public ClientUI(RuneLite runelite) + public ClientUI(Applet client) { - this.runelite = runelite; + this.client = client; setUIFont(new FontUIResource(FontManager.getRunescapeFont())); init(); pack(); @@ -107,19 +107,7 @@ public class ClientUI extends JFrame container = new JPanel(); container.setLayout(new BorderLayout(0, 0)); - panel = new ClientPanel(this); - if (!RuneLite.getOptions().has("no-rs")) - { - try - { - panel.loadRs(); - } - catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException ex) - { - log.error("Error loading RS!", ex); - System.exit(-1); - } - } + panel = new ClientPanel(client); container.add(panel, BorderLayout.CENTER); navContainer = new JPanel(); @@ -183,11 +171,10 @@ public class ClientUI extends JFrame private void checkExit() { - Client client = runelite.getClient(); int result = JOptionPane.OK_OPTION; // only ask if not logged out - if (client != null && client.getGameState() != GameState.LOGIN_SCREEN) + if (client != null && client instanceof Client && ((Client)client).getGameState() != GameState.LOGIN_SCREEN) { result = JOptionPane.showConfirmDialog(this, "Are you sure you want to exit?", "Exit", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); } @@ -207,9 +194,4 @@ public class ClientUI extends JFrame { return pluginPanel; } - - RuneLite getRunelite() - { - return runelite; - } } From 06836b3e1d97a2071f1aea9f69f144d38846b72a Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 24 Dec 2017 03:34:42 +0100 Subject: [PATCH 5/9] Move setTitle to ClientUI Move setTitle method from RuneLite to ClientUI. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 17 +------------- .../client/plugins/account/AccountPlugin.java | 8 ++----- .../java/net/runelite/client/ui/ClientUI.java | 22 +++++++++++++++++-- 3 files changed, 23 insertions(+), 24 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 e76e44564d..c7ad2f25f2 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -24,7 +24,6 @@ */ package net.runelite.client; -import com.google.common.base.Strings; import com.google.common.eventbus.EventBus; import com.google.inject.Guice; import com.google.inject.Inject; @@ -184,9 +183,7 @@ public class RuneLite log.warn("unable to set look and feel", ex); } - gui = new ClientUI(client); - setTitle(null); - + gui = new ClientUI(properties, client); setupTrayIcon(); }); @@ -220,18 +217,6 @@ public class RuneLite pluginManager.watch(); } - public void setTitle(String extra) - { - if (!Strings.isNullOrEmpty(extra)) - { - gui.setTitle(properties.getTitle() + " " + properties.getVersion() + " " + extra); - } - else - { - gui.setTitle(properties.getTitle() + " " + properties.getVersion()); - } - } - private void setupTrayIcon() { if (!SystemTray.isSupported()) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java index fdaa339d8e..9c98c53315 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java @@ -35,7 +35,6 @@ import java.util.concurrent.ScheduledExecutorService; import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import net.runelite.client.RuneLite; import net.runelite.client.account.AccountSession; import net.runelite.client.account.SessionManager; import net.runelite.client.events.SessionClose; @@ -56,9 +55,6 @@ import net.runelite.http.api.ws.messages.LoginResponse; @Slf4j public class AccountPlugin extends Plugin { - @Inject - RuneLite runelite; - @Inject SessionManager sessionManager; @@ -188,7 +184,7 @@ public class AccountPlugin extends Plugin log.debug("Session opened as {}", session.getUsername()); - runelite.setTitle("(" + session.getUsername() + ")"); + ui.setTitle("(" + session.getUsername() + ")"); replaceLoginWithLogout(); } @@ -204,7 +200,7 @@ public class AccountPlugin extends Plugin @Subscribe public void onSessionClose(SessionClose sessionClose) { - runelite.setTitle(null); + ui.setTitle(null); } } 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 ef26e13b0a..5637197d83 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 @@ -25,6 +25,7 @@ package net.runelite.client.ui; import java.applet.Applet; +import com.google.common.base.Strings; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.WindowAdapter; @@ -42,6 +43,7 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.client.RuneLite; +import net.runelite.client.RuneliteProperties; import org.pushingpixels.substance.internal.ui.SubstanceRootPaneUI; @Slf4j @@ -52,21 +54,23 @@ public class ClientUI extends JFrame private static final int EXPANDED_WIDTH = CLIENT_WIDTH + PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH; private final Applet client; + private final RuneliteProperties properties; private JPanel container; private JPanel navContainer; private ClientPanel panel; private PluginToolbar pluginToolbar; private PluginPanel pluginPanel; - public ClientUI(Applet client) + public ClientUI(RuneliteProperties properties, Applet client) { + this.properties = properties; this.client = client; setUIFont(new FontUIResource(FontManager.getRunescapeFont())); init(); pack(); TitleBarPane titleBarPane = new TitleBarPane(this.getRootPane(), (SubstanceRootPaneUI)this.getRootPane().getUI()); titleBarPane.editTitleBar(this); - setTitle("RuneLite"); + setTitle(null); setIconImage(RuneLite.ICON); setLocationRelativeTo(getOwner()); setResizable(true); @@ -89,6 +93,20 @@ public class ClientUI extends JFrame } } + + @Override + public void setTitle(String extra) + { + if (!Strings.isNullOrEmpty(extra)) + { + super.setTitle(properties.getTitle() + " " + properties.getVersion() + " " + extra); + } + else + { + super.setTitle(properties.getTitle() + " " + properties.getVersion()); + } + } + private void init() { assert SwingUtilities.isEventDispatchThread(); From b4eba39f6b3d757f5bddedf3228bc82ba0a12695 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 24 Dec 2017 03:39:23 +0100 Subject: [PATCH 6/9] Move creation of tray icon to ClientUI Move creation of tray icon from RuneLite to ClientUI. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 69 +------------------ .../java/net/runelite/client/ui/ClientUI.java | 60 +++++++++++++++- 2 files changed, 60 insertions(+), 69 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 c7ad2f25f2..bd388f7b03 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -29,19 +29,9 @@ import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import java.applet.Applet; -import java.awt.AWTException; -import java.awt.Frame; -import java.awt.Image; -import java.awt.SystemTray; -import java.awt.TrayIcon; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; import java.io.File; -import java.io.IOException; -import java.net.URL; import java.util.Optional; import java.util.concurrent.ScheduledExecutorService; -import javax.imageio.ImageIO; import javax.inject.Singleton; import javax.swing.JFrame; import javax.swing.JPopupMenu; @@ -70,13 +60,10 @@ public class RuneLite public static final File PROFILES_DIR = new File(RUNELITE_DIR, "profiles"); public static final File PLUGIN_DIR = new File(RUNELITE_DIR, "plugins"); - public static Image ICON; - private static Injector injector; private static OptionSet options; private static RuneLite runelite; - private static TrayIcon trayIcon; private ClientUI gui; @@ -110,19 +97,6 @@ public class RuneLite Client client; Notifier notifier; - static - { - try - { - final URL icon = ClientUI.class.getResource("/runelite.png"); - ICON = ImageIO.read(icon.openStream()); - } - catch (IOException ex) - { - log.warn(null, ex); - } - } - public static void main(String[] args) throws Exception { // Force heavy-weight popups/tooltips. @@ -184,7 +158,6 @@ public class RuneLite } gui = new ClientUI(properties, client); - setupTrayIcon(); }); configManager.load(); @@ -194,7 +167,7 @@ public class RuneLite eventBus.register(chatMessageManager); // Setup the notifier - notifier = new Notifier(properties.getTitle(), trayIcon); + notifier = new Notifier(properties.getTitle(), gui.getTrayIcon()); // Tell the plugin manager if client is outdated or not pluginManager.setOutdated(isOutdated); @@ -217,40 +190,6 @@ public class RuneLite pluginManager.watch(); } - private void setupTrayIcon() - { - if (!SystemTray.isSupported()) - { - return; - } - - SystemTray systemTray = SystemTray.getSystemTray(); - - trayIcon = new TrayIcon(ICON, properties.getTitle()); - trayIcon.setImageAutoSize(true); - - try - { - systemTray.add(trayIcon); - } - catch (AWTException ex) - { - log.debug("Unable to add system tray icon", ex); - return; - } - - // bring to front when tray icon is clicked - trayIcon.addMouseListener(new MouseAdapter() - { - @Override - public void mouseClicked(MouseEvent e) - { - gui.setVisible(true); - gui.setState(Frame.NORMAL); // unminimize - } - }); - } - public ClientUI getGui() { return gui; @@ -280,10 +219,4 @@ public class RuneLite { RuneLite.options = options; } - - public static TrayIcon getTrayIcon() - { - return trayIcon; - } - } 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 5637197d83..6d52351c1d 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 @@ -26,11 +26,20 @@ package net.runelite.client.ui; import java.applet.Applet; import com.google.common.base.Strings; +import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Dimension; +import java.awt.Frame; +import java.awt.SystemTray; +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.io.IOException; import java.util.Enumeration; +import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -39,6 +48,7 @@ import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.FontUIResource; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; @@ -53,6 +63,9 @@ public class ClientUI extends JFrame private static final int SCROLLBAR_WIDTH = 17; private static final int EXPANDED_WIDTH = CLIENT_WIDTH + PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH; + @Getter + private TrayIcon trayIcon; + private final Applet client; private final RuneliteProperties properties; private JPanel container; @@ -60,18 +73,20 @@ public class ClientUI extends JFrame private ClientPanel panel; private PluginToolbar pluginToolbar; private PluginPanel pluginPanel; + private BufferedImage icon; public ClientUI(RuneliteProperties properties, Applet client) { this.properties = properties; this.client = client; setUIFont(new FontUIResource(FontManager.getRunescapeFont())); + setupTrayIcon(); init(); pack(); TitleBarPane titleBarPane = new TitleBarPane(this.getRootPane(), (SubstanceRootPaneUI)this.getRootPane().getUI()); titleBarPane.editTitleBar(this); setTitle(null); - setIconImage(RuneLite.ICON); + setIconImage(icon); setLocationRelativeTo(getOwner()); setResizable(true); setVisible(true); @@ -93,6 +108,49 @@ public class ClientUI extends JFrame } } + private void setupTrayIcon() + { + if (!SystemTray.isSupported()) + { + return; + } + + SystemTray systemTray = SystemTray.getSystemTray(); + + try + { + icon = ImageIO.read(ClientUI.class.getResourceAsStream("/runelite.png")); + } + catch (IOException e) + { + log.warn("Client icon failed to load", e); + } + + trayIcon = new TrayIcon(icon, properties.getTitle()); + trayIcon.setImageAutoSize(true); + + try + { + systemTray.add(trayIcon); + } + catch (AWTException ex) + { + log.debug("Unable to add system tray icon", ex); + return; + } + + // bring to front when tray icon is clicked + trayIcon.addMouseListener(new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent e) + { + setVisible(true); + setState(Frame.NORMAL); // unminimize + } + }); + } + @Override public void setTitle(String extra) From 6bf63a447ff7fe16e9ed1ed80a88856c23cba161 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 24 Dec 2017 03:45:04 +0100 Subject: [PATCH 7/9] Cleanup RuneLite class fields - Remove runelite variable - Use setters for options and injector (to use them outside of tests) - Remove getter for gui and make it package-private - Use package-private gui field when providing ClientUI from RuneliteModule Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 19 +++++-------------- .../net/runelite/client/RuneliteModule.java | 2 +- .../volcanicmine/VolcanicMinePlugin.java | 8 ++++---- 3 files changed, 10 insertions(+), 19 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 bd388f7b03..c4bff8af88 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -61,11 +61,7 @@ public class RuneLite public static final File PLUGIN_DIR = new File(RUNELITE_DIR, "plugins"); private static Injector injector; - private static OptionSet options; - private static RuneLite runelite; - - private ClientUI gui; @Inject private RuneliteProperties properties; @@ -95,6 +91,7 @@ public class RuneLite private SessionManager sessionManager; Client client; + ClientUI gui; Notifier notifier; public static void main(String[] args) throws Exception @@ -112,13 +109,12 @@ public class RuneLite OptionParser parser = new OptionParser(); parser.accepts("developer-mode"); parser.accepts("no-rs"); - options = parser.parse(args); + setOptions(parser.parse(args)); PROFILES_DIR.mkdirs(); - injector = Guice.createInjector(new RuneliteModule()); - runelite = injector.getInstance(RuneLite.class); - runelite.start(); + setInjector(Guice.createInjector(new RuneliteModule())); + injector.getInstance(RuneLite.class).start(); } public void start() throws Exception @@ -157,7 +153,7 @@ public class RuneLite log.warn("unable to set look and feel", ex); } - gui = new ClientUI(properties, client); + setGui(new ClientUI(properties, client)); }); configManager.load(); @@ -190,11 +186,6 @@ public class RuneLite pluginManager.watch(); } - public ClientUI getGui() - { - return gui; - } - public void setGui(ClientUI gui) { this.gui = gui; diff --git a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java index bfd32d2c8e..e8c6ca5552 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneliteModule.java @@ -72,7 +72,7 @@ public class RuneliteModule extends AbstractModule @Provides ClientUI provideClientUi(RuneLite runelite) { - return runelite.getGui(); + return runelite.gui; } @Provides diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java index 40e7183165..294b3f0484 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java @@ -57,12 +57,12 @@ import net.runelite.api.queries.NPCQuery; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; -import net.runelite.client.RuneLite; import net.runelite.client.config.ConfigManager; import net.runelite.client.events.ConfigChanged; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; +import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.util.QueryRunner; @@ -87,7 +87,7 @@ public class VolcanicMinePlugin extends Plugin Client client; @Inject - RuneLite runeLite; + ClientUI clientUI; @Inject QueryRunner queryRunner; @@ -300,13 +300,13 @@ public class VolcanicMinePlugin extends Plugin private void sendNotification(String message) { - if (!config.alertWhenFocused() && runeLite.getGui().isFocused()) + if (!config.alertWhenFocused() && clientUI.isFocused()) { return; } if (config.requestFocus()) { - runeLite.getGui().requestFocus(); + clientUI.requestFocus(); } if (config.sendTrayNotification()) { From 6c2e827d4ae357c7c3decf6cb6840899f9f4cec0 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 24 Dec 2017 03:55:29 +0100 Subject: [PATCH 8/9] Move creation of UI to ClientUI class - Move setting of UI-related variables to ClientUI class (create new "create" static method to set them before creating the UI window) - Clean up ClientUI class Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 35 +----- .../java/net/runelite/client/ui/ClientUI.java | 100 ++++++++++++------ 2 files changed, 72 insertions(+), 63 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 c4bff8af88..8512466da8 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -33,12 +33,7 @@ import java.io.File; import java.util.Optional; import java.util.concurrent.ScheduledExecutorService; import javax.inject.Singleton; -import javax.swing.JFrame; -import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; -import javax.swing.ToolTipManager; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; import joptsimple.OptionParser; import joptsimple.OptionSet; import lombok.extern.slf4j.Slf4j; @@ -50,7 +45,6 @@ import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.PluginManager; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.overlay.OverlayRenderer; -import org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel; @Singleton @Slf4j @@ -96,15 +90,6 @@ public class RuneLite public static void main(String[] args) throws Exception { - // Force heavy-weight popups/tooltips. - // Prevents them from being obscured by the game applet. - ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false); - // Do not render shadows under popups/tooltips. - // Fixes black boxes under popups that are above the game applet. - System.setProperty("jgoodies.popupDropShadowEnabled", "false"); - // Do not fill in background on repaint. Reduces flickering when - // the applet is resized. - System.setProperty("sun.awt.noerasebackground", "true"); OptionParser parser = new OptionParser(); parser.accepts("developer-mode"); @@ -139,25 +124,13 @@ public class RuneLite this.client = (Client) client; } - SwingUtilities.invokeAndWait(() -> - { - JFrame.setDefaultLookAndFeelDecorated(true); - JPopupMenu.setDefaultLightWeightPopupEnabled(false); - - try - { - UIManager.setLookAndFeel(new SubstanceGraphiteLookAndFeel()); - } - catch (UnsupportedLookAndFeelException ex) - { - log.warn("unable to set look and feel", ex); - } - - setGui(new ClientUI(properties, client)); - }); + // Load swing UI + SwingUtilities.invokeAndWait(() -> setGui(ClientUI.create(properties, client))); + // Load default configuration configManager.load(); + // Register event listeners eventBus.register(overlayRenderer); eventBus.register(menuManager); eventBus.register(chatMessageManager); 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 6d52351c1d..e260a40a4d 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 @@ -24,8 +24,8 @@ */ package net.runelite.client.ui; -import java.applet.Applet; import com.google.common.base.Strings; +import java.applet.Applet; import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Dimension; @@ -43,17 +43,20 @@ import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; +import javax.swing.ToolTipManager; import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; import javax.swing.plaf.FontUIResource; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; -import net.runelite.client.RuneLite; import net.runelite.client.RuneliteProperties; +import org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel; import org.pushingpixels.substance.internal.ui.SubstanceRootPaneUI; @Slf4j @@ -62,6 +65,7 @@ public class ClientUI extends JFrame private static final int CLIENT_WIDTH = 809; private static final int SCROLLBAR_WIDTH = 17; private static final int EXPANDED_WIDTH = CLIENT_WIDTH + PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH; + private static final BufferedImage ICON; @Getter private TrayIcon trayIcon; @@ -70,23 +74,70 @@ public class ClientUI extends JFrame private final RuneliteProperties properties; private JPanel container; private JPanel navContainer; - private ClientPanel panel; private PluginToolbar pluginToolbar; private PluginPanel pluginPanel; - private BufferedImage icon; - public ClientUI(RuneliteProperties properties, Applet client) + static + { + BufferedImage icon = null; + + try + { + icon = ImageIO.read(ClientUI.class.getResourceAsStream("/runelite.png")); + } + catch (IOException e) + { + log.warn("Client icon failed to load", e); + } + + ICON = icon; + } + + public static ClientUI create(RuneliteProperties properties, Applet client) + { + // Force heavy-weight popups/tooltips. + // Prevents them from being obscured by the game applet. + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false); + JPopupMenu.setDefaultLightWeightPopupEnabled(false); + + // Do not render shadows under popups/tooltips. + // Fixes black boxes under popups that are above the game applet. + System.setProperty("jgoodies.popupDropShadowEnabled", "false"); + + // Do not fill in background on repaint. Reduces flickering when + // the applet is resized. + System.setProperty("sun.awt.noerasebackground", "true"); + + // Use custom window decorations + JFrame.setDefaultLookAndFeelDecorated(true); + + // Use substance look and feel + try + { + UIManager.setLookAndFeel(new SubstanceGraphiteLookAndFeel()); + } + catch (UnsupportedLookAndFeelException ex) + { + log.warn("unable to set look and feel", ex); + } + + // Use custom UI font + setUIFont(new FontUIResource(FontManager.getRunescapeFont())); + + return new ClientUI(properties, client); + } + + private ClientUI(RuneliteProperties properties, Applet client) { this.properties = properties; this.client = client; - setUIFont(new FontUIResource(FontManager.getRunescapeFont())); - setupTrayIcon(); + this.trayIcon = setupTrayIcon(); + init(); pack(); - TitleBarPane titleBarPane = new TitleBarPane(this.getRootPane(), (SubstanceRootPaneUI)this.getRootPane().getUI()); - titleBarPane.editTitleBar(this); + new TitleBarPane(this.getRootPane(), (SubstanceRootPaneUI)this.getRootPane().getUI()).editTitleBar(this); setTitle(null); - setIconImage(icon); + setIconImage(ICON); setLocationRelativeTo(getOwner()); setResizable(true); setVisible(true); @@ -108,25 +159,15 @@ public class ClientUI extends JFrame } } - private void setupTrayIcon() + private TrayIcon setupTrayIcon() { if (!SystemTray.isSupported()) { - return; + return null; } SystemTray systemTray = SystemTray.getSystemTray(); - - try - { - icon = ImageIO.read(ClientUI.class.getResourceAsStream("/runelite.png")); - } - catch (IOException e) - { - log.warn("Client icon failed to load", e); - } - - trayIcon = new TrayIcon(icon, properties.getTitle()); + TrayIcon trayIcon = new TrayIcon(ICON, properties.getTitle()); trayIcon.setImageAutoSize(true); try @@ -136,7 +177,7 @@ public class ClientUI extends JFrame catch (AWTException ex) { log.debug("Unable to add system tray icon", ex); - return; + return trayIcon; } // bring to front when tray icon is clicked @@ -149,6 +190,8 @@ public class ClientUI extends JFrame setState(Frame.NORMAL); // unminimize } }); + + return trayIcon; } @@ -182,9 +225,7 @@ public class ClientUI extends JFrame container = new JPanel(); container.setLayout(new BorderLayout(0, 0)); - - panel = new ClientPanel(client); - container.add(panel, BorderLayout.CENTER); + container.add(new ClientPanel(client), BorderLayout.CENTER); navContainer = new JPanel(); navContainer.setLayout(new BorderLayout(0, 0)); @@ -265,9 +306,4 @@ public class ClientUI extends JFrame { return pluginToolbar; } - - public PluginPanel getPluginPanel() - { - return pluginPanel; - } } From 0d8870e7dac60157b4d11cf5f51149e75bab5f99 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 29 Dec 2017 17:34:36 +0100 Subject: [PATCH 9/9] Remove unnecessary null checks for game client Remove unnecessary null checks for game client from plugins, as now client is always not null in all of them, since in the case of it being null the plugins are not even started. Signed-off-by: Tomas Slusny --- .../AttackIndicatorPlugin.java | 6 +++--- .../chatcommands/ChatCommandsPlugin.java | 2 -- .../plugins/clanchat/ClanChatPlugin.java | 2 -- .../plugins/cluescrolls/ClueScrollPlugin.java | 2 -- .../combatlevel/CombatLevelPlugin.java | 4 +--- .../plugins/fightcave/FightCaveOverlay.java | 2 +- .../plugins/fightcave/FightCavePlugin.java | 4 +--- .../idlenotifier/IdleNotifierPlugin.java | 2 -- .../RememberUsernamePlugin.java | 2 -- .../client/plugins/slayer/SlayerPlugin.java | 6 ++---- .../plugins/teamcapes/TeamCapesPlugin.java | 21 ++++++++----------- .../volcanicmine/VolcanicMineOverlay.java | 2 +- .../volcanicmine/VolcanicMinePlugin.java | 2 -- .../plugins/xpglobes/XpGlobesPlugin.java | 2 -- .../client/plugins/xptracker/XpPanel.java | 10 ++++----- .../plugins/xptracker/XpTrackerPlugin.java | 2 -- .../client/plugins/xtea/XteaPlugin.java | 2 -- .../client/plugins/zulrah/ZulrahPlugin.java | 4 +--- .../zulrah/overlays/ZulrahPrayerOverlay.java | 2 +- .../ui/overlay/components/PanelComponent.java | 2 -- .../src/main/java/ExamplePlugin.java | 1 - 21 files changed, 24 insertions(+), 58 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/attackindicator/AttackIndicatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackindicator/AttackIndicatorPlugin.java index d96c8c8eec..13dc6d4ae6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/attackindicator/AttackIndicatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackindicator/AttackIndicatorPlugin.java @@ -24,6 +24,9 @@ */ package net.runelite.client.plugins.attackindicator; +import static net.runelite.client.plugins.attackindicator.AttackStyle.CASTING; +import static net.runelite.client.plugins.attackindicator.AttackStyle.DEFENSIVE_CASTING; +import static net.runelite.client.plugins.attackindicator.AttackStyle.OTHER; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; import com.google.common.eventbus.Subscribe; @@ -32,7 +35,6 @@ import com.google.inject.Provides; import java.time.temporal.ChronoUnit; import java.util.HashSet; import java.util.Set; -import javax.annotation.Nullable; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -45,7 +47,6 @@ import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.VarbitChanged; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import static net.runelite.client.plugins.attackindicator.AttackStyle.*; import net.runelite.client.task.Schedule; @PluginDescriptor( @@ -63,7 +64,6 @@ public class AttackIndicatorPlugin extends Plugin private final Table widgetsToHide = HashBasedTable.create(); @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index 1df341b824..d6bbcf1aee 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -31,7 +31,6 @@ import java.io.IOException; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ScheduledExecutorService; -import javax.annotation.Nullable; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; @@ -69,7 +68,6 @@ public class ChatCommandsPlugin extends Plugin private final HiscoreClient hiscoreClient = new HiscoreClient(); @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java index d2df2413e0..e15a4ba922 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -39,7 +39,6 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.Nullable; import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; @@ -77,7 +76,6 @@ public class ClanChatPlugin extends Plugin private int modIconsLength; @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 0845bec979..b864e635e5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -30,7 +30,6 @@ import com.google.inject.Binder; import com.google.inject.Provides; import java.time.Instant; import java.time.temporal.ChronoUnit; -import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.GameState; @@ -47,7 +46,6 @@ import net.runelite.client.task.Schedule; public class ClueScrollPlugin extends Plugin { @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java index b5d9a31e19..cd74d357e9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelPlugin.java @@ -27,7 +27,6 @@ package net.runelite.client.plugins.combatlevel; import com.google.inject.Provides; import java.text.DecimalFormat; import java.time.temporal.ChronoUnit; -import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.Experience; @@ -48,7 +47,6 @@ public class CombatLevelPlugin extends Plugin private final DecimalFormat decimalFormat = new DecimalFormat("#.###"); @Inject - @Nullable Client client; @Inject @@ -66,7 +64,7 @@ public class CombatLevelPlugin extends Plugin ) public void updateCombatLevel() { - if (client == null || client.getGameState() != GameState.LOGGED_IN) + if (client.getGameState() != GameState.LOGGED_IN) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java index c7f0b3ef00..c226d16447 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java @@ -63,7 +63,7 @@ public class FightCaveOverlay extends Overlay public Dimension render(Graphics2D graphics, Point parent) { JadAttack attack = plugin.getAttack(); - if (attack == null || client == null || client.isPrayerActive(attack.getPrayer())) + if (attack == null || client.isPrayerActive(attack.getPrayer())) { return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java index c0b82d8a3d..7894751caf 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCavePlugin.java @@ -27,7 +27,6 @@ package net.runelite.client.plugins.fightcave; import com.google.inject.Binder; import com.google.inject.Provides; import java.time.temporal.ChronoUnit; -import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.GameState; @@ -47,7 +46,6 @@ import net.runelite.client.util.QueryRunner; public class FightCavePlugin extends Plugin { @Inject - @Nullable Client client; @Inject @@ -85,7 +83,7 @@ public class FightCavePlugin extends Plugin ) public void update() { - if (!config.enabled() || client == null || client.getGameState() != GameState.LOGGED_IN) + if (!config.enabled() || client.getGameState() != GameState.LOGGED_IN) { return; } 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 a46da04775..c91b8b6f72 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 @@ -93,7 +93,6 @@ import com.google.inject.Provides; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; -import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Actor; import net.runelite.api.Client; @@ -121,7 +120,6 @@ public class IdleNotifierPlugin extends Plugin ClientUI gui; @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/rememberusername/RememberUsernamePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/rememberusername/RememberUsernamePlugin.java index e69f062734..47930aacf9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/rememberusername/RememberUsernamePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/rememberusername/RememberUsernamePlugin.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.rememberusername; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; -import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.GameState; @@ -41,7 +40,6 @@ import net.runelite.client.plugins.PluginDescriptor; public class RememberUsernamePlugin extends Plugin { @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 1c38efa676..d7629dd926 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.slayer; +import static net.runelite.api.Skill.SLAYER; import com.google.common.eventbus.Subscribe; import com.google.inject.Binder; import com.google.inject.Provides; @@ -33,13 +34,11 @@ import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Nullable; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.ItemID; -import static net.runelite.api.Skill.SLAYER; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; @@ -73,7 +72,6 @@ public class SlayerPlugin extends Plugin private static final Pattern REWARD_POINTS = Pattern.compile("Reward points: (\\d*)"); @Inject - @Nullable Client client; @Inject @@ -146,7 +144,7 @@ public class SlayerPlugin extends Plugin ) public void scheduledChecks() { - if (!config.enabled() || client == null) + if (!config.enabled()) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java index 1fd0bee92b..632cc25211 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesPlugin.java @@ -26,6 +26,14 @@ package net.runelite.client.plugins.teamcapes; import com.google.inject.Binder; import com.google.inject.Provides; +import java.time.temporal.ChronoUnit; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Player; @@ -35,23 +43,12 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.Overlay; -import javax.annotation.Nullable; -import javax.inject.Inject; -import java.time.temporal.ChronoUnit; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - @PluginDescriptor( name = "Team capes plugin" ) public class TeamCapesPlugin extends Plugin { @Inject - @Nullable Client client; @Inject @@ -86,7 +83,7 @@ public class TeamCapesPlugin extends Plugin ) public void update() { - if (!config.enabled() || client == null || client.getGameState() != GameState.LOGGED_IN) + if (!config.enabled() || client.getGameState() != GameState.LOGGED_IN) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMineOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMineOverlay.java index 66336260ab..e84c6e1dda 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMineOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMineOverlay.java @@ -79,7 +79,7 @@ public class VolcanicMineOverlay extends Overlay @Override public Dimension render(Graphics2D graphics, java.awt.Point point) { - if (client == null || !plugin.getInside() || !config.enabled()) + if (!plugin.getInside() || !config.enabled()) { return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java index 294b3f0484..5165935a27 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/volcanicmine/VolcanicMinePlugin.java @@ -39,7 +39,6 @@ import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.annotation.Nullable; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; @@ -83,7 +82,6 @@ public class VolcanicMinePlugin extends Plugin private static final Pattern coltagPattern = Pattern.compile("(()|(<\\/col>))"); @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java index 1a32f7cdd8..94f7fde0b9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesPlugin.java @@ -31,7 +31,6 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.Experience; @@ -55,7 +54,6 @@ public class XpGlobesPlugin extends Plugin private final List xpGlobes = new ArrayList<>(); @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java index da8cff7e50..aa542e83c5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java @@ -24,10 +24,6 @@ */ package net.runelite.client.plugins.xptracker; -import net.runelite.api.Client; -import net.runelite.api.Skill; -import net.runelite.client.ui.PluginPanel; -import javax.imageio.ImageIO; import java.awt.BorderLayout; import java.awt.Dimension; import java.io.IOException; @@ -35,13 +31,16 @@ import java.text.NumberFormat; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; -import javax.annotation.Nullable; +import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.Skill; +import net.runelite.client.ui.PluginPanel; @Slf4j public class XpPanel extends PluginPanel @@ -50,7 +49,6 @@ public class XpPanel extends PluginPanel private final XpTrackerPlugin xpTracker; @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index 398e3cc4a8..bf6ebe8ac6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -35,7 +35,6 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.NavigationButton; import java.time.temporal.ChronoUnit; -import javax.annotation.Nullable; import javax.inject.Inject; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; @@ -51,7 +50,6 @@ public class XpTrackerPlugin extends Plugin ClientUI ui; @Inject - @Nullable Client client; private NavigationButton navButton; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java index ed14da97e7..253d459a33 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java @@ -29,7 +29,6 @@ import java.io.IOException; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ScheduledExecutorService; -import javax.annotation.Nullable; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -50,7 +49,6 @@ public class XteaPlugin extends Plugin private final Set sentRegions = new HashSet<>(); @Inject - @Nullable Client client; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java index 31dea9c204..8cf72ae2ea 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java @@ -31,7 +31,6 @@ import com.google.inject.Provides; import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Collection; -import javax.annotation.Nullable; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -66,7 +65,6 @@ public class ZulrahPlugin extends Plugin QueryRunner queryRunner; @Inject - @Nullable Client client; @Inject @@ -118,7 +116,7 @@ public class ZulrahPlugin extends Plugin ) public void update() { - if (!config.enabled() || client == null || client.getGameState() != GameState.LOGGED_IN) + if (!config.enabled() || client.getGameState() != GameState.LOGGED_IN) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java index a1f7fb3353..7c1df40cfc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/overlays/ZulrahPrayerOverlay.java @@ -60,7 +60,7 @@ public class ZulrahPrayerOverlay extends Overlay { ZulrahInstance instance = plugin.getInstance(); - if (client == null || instance == null) + if (instance == null) { return null; } 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 dcd28a3916..42d446fc82 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 @@ -33,7 +33,6 @@ import java.awt.Point; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nullable; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; @@ -61,7 +60,6 @@ public class PanelComponent implements RenderableEntity } @Setter - @Nullable private String title; @Setter diff --git a/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePlugin.java b/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePlugin.java index b047e16751..ba63ebb5dd 100644 --- a/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePlugin.java +++ b/runelite-plugin-archetype/src/main/resources/archetype-resources/src/main/java/ExamplePlugin.java @@ -27,7 +27,6 @@ public class ExamplePlugin extends Plugin private static final Logger logger = LoggerFactory.getLogger(ExamplePlugin.class); @Inject - @Nullable Client client; @Inject