From 2b893c930931a344815d5d5a7b011af4e6a2927e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 2 Apr 2016 14:27:26 -0400 Subject: [PATCH 01/15] Initial import of client --- .gitignore | 1 + pom.xml | 51 ++++++++++ .../net/runelite/client/ConfigLoader.java | 93 +++++++++++++++++++ .../java/net/runelite/client/Launcher.java | 22 +++++ src/main/java/net/runelite/client/RSStub.java | 67 +++++++++++++ .../java/net/runelite/client/RuneLite.java | 20 ++++ .../net/runelite/client/ui/ClientPanel.java | 47 ++++++++++ .../java/net/runelite/client/ui/ClientUI.java | 65 +++++++++++++ .../net/runelite/client/ConfigLoaderTest.java | 27 ++++++ 9 files changed, 393 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/net/runelite/client/ConfigLoader.java create mode 100644 src/main/java/net/runelite/client/Launcher.java create mode 100644 src/main/java/net/runelite/client/RSStub.java create mode 100644 src/main/java/net/runelite/client/RuneLite.java create mode 100644 src/main/java/net/runelite/client/ui/ClientPanel.java create mode 100644 src/main/java/net/runelite/client/ui/ClientUI.java create mode 100644 src/test/java/net/runelite/client/ConfigLoaderTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..a6f89c2da7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target/ \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..4be61dba3e --- /dev/null +++ b/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + net.runelite.rs + client + 1.0-SNAPSHOT + + + UTF-8 + 1.8 + 1.8 + + + + + runelite + sftp://192.168.1.2/var/www/rs/repo + + + + + + net.runelite.rs + api + 1.0-SNAPSHOT + + + net.runelite + launcher + 1.0.0-SNAPSHOT + + + + junit + junit + 4.12 + test + + + + + + + org.apache.maven.wagon + wagon-ssh + 2.10 + + + + \ No newline at end of file diff --git a/src/main/java/net/runelite/client/ConfigLoader.java b/src/main/java/net/runelite/client/ConfigLoader.java new file mode 100644 index 0000000000..9af73b845a --- /dev/null +++ b/src/main/java/net/runelite/client/ConfigLoader.java @@ -0,0 +1,93 @@ +package net.runelite.client; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.HashMap; +import java.util.Map; + +public class ConfigLoader +{ + private static URL configURL; + + public static final String CODEBASE = "codebase"; + public static final String INITIAL_JAR = "initial_jar"; + public static final String INITIAL_CLASS = "initial_class"; + public static final String APP_MINWIDTH = "applet_minwidth"; + public static final String APP_MINHEIGHT = "applet_minheight"; + + private final Map properties = new HashMap<>(), + appletProperties = new HashMap<>(); + + static + { + try + { + configURL = new URL("http://192.168.1.2/rs/jav_config.ws"); + //configURL = new URL("http://oldschool1.runescape.com/jav_config.ws"); // https redirects us to rs3 + } + catch (MalformedURLException ex) + { + ex.printStackTrace(); + } + } + + public void fetch() throws IOException + { + URLConnection conn = configURL.openConnection(); + try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) + { + String str; + + while ((str = in.readLine()) != null) + { + int idx = str.indexOf('='); + + if (idx == -1) + continue; + + String s = str.substring(0, idx); + + if (s.equals("param")) + { + str = str.substring(idx + 1); + idx = str.indexOf('='); + s = str.substring(0, idx); + + appletProperties.put(s, str.substring(idx + 1)); + } + else if (s.equals("msg")) + { + // ignore + } + else + { + properties.put(s, str.substring(idx + 1)); + } + } + } + } + + public String getProperty(String name) + { + return properties.get(name); + } + + public Map getProperties() + { + return properties; + } + + public String getAppletProperty(String name) + { + return appletProperties.get(name); + } + + public Map getAppletProperties() + { + return appletProperties; + } +} diff --git a/src/main/java/net/runelite/client/Launcher.java b/src/main/java/net/runelite/client/Launcher.java new file mode 100644 index 0000000000..718073d454 --- /dev/null +++ b/src/main/java/net/runelite/client/Launcher.java @@ -0,0 +1,22 @@ +package net.runelite.client; + +import java.util.logging.Level; +import java.util.logging.Logger; +import net.runelite.launcher.Launchable; + +public class Launcher implements Launchable +{ + @Override + public void run() + { + try + { + new RuneLite().start(); + } + catch (Exception ex) + { + Logger.getLogger(Launcher.class.getName()).log(Level.SEVERE, null, ex); + } + } + +} diff --git a/src/main/java/net/runelite/client/RSStub.java b/src/main/java/net/runelite/client/RSStub.java new file mode 100644 index 0000000000..1c7966e31a --- /dev/null +++ b/src/main/java/net/runelite/client/RSStub.java @@ -0,0 +1,67 @@ +package net.runelite.client; + +import java.applet.Applet; +import java.applet.AppletContext; +import java.applet.AppletStub; +import java.awt.Dimension; +import java.net.MalformedURLException; +import java.net.URL; + +public class RSStub implements AppletStub +{ + private final ConfigLoader config; + private final Applet app; + + public RSStub(ConfigLoader config, Applet app) + { + this.config = config; + this.app = app; + } + + @Override + public boolean isActive() + { + return true; + } + + @Override + public URL getDocumentBase() + { + return getCodeBase(); + } + + @Override + public URL getCodeBase() + { + try + { + return new URL(config.getProperty(ConfigLoader.CODEBASE)); + } + catch (MalformedURLException ex) + { + return null; + } + } + + @Override + public String getParameter(String name) + { + return config.getAppletProperty(name); + } + + @Override + public AppletContext getAppletContext() + { + return null; + } + + @Override + public void appletResize(int width, int height) + { + Dimension d = new Dimension(width, height); + + app.setSize(d); + app.setPreferredSize(d); + } + +} diff --git a/src/main/java/net/runelite/client/RuneLite.java b/src/main/java/net/runelite/client/RuneLite.java new file mode 100644 index 0000000000..ec16437acb --- /dev/null +++ b/src/main/java/net/runelite/client/RuneLite.java @@ -0,0 +1,20 @@ +package net.runelite.client; + +import net.runelite.client.ui.ClientUI; + + +public class RuneLite +{ + private ClientUI gui; + + public static void main(String[] args) throws Exception + { + new RuneLite().start(); + } + + public void start() throws Exception + { + gui = new ClientUI(); + gui.setVisible(true); + } +} diff --git a/src/main/java/net/runelite/client/ui/ClientPanel.java b/src/main/java/net/runelite/client/ui/ClientPanel.java new file mode 100644 index 0000000000..8cf5f4bd56 --- /dev/null +++ b/src/main/java/net/runelite/client/ui/ClientPanel.java @@ -0,0 +1,47 @@ +package net.runelite.client.ui; + +import java.applet.Applet; +import java.awt.Color; +import java.awt.Dimension; +import java.net.URL; +import java.net.URLClassLoader; +import javax.swing.JPanel; +import net.runelite.client.ConfigLoader; +import net.runelite.client.RSStub; + +final class ClientPanel extends JPanel +{ + + public ClientPanel() throws Exception + { + setSize(new Dimension(ClientUI.PANEL_WIDTH, ClientUI.PANEL_HEIGHT)); + setMinimumSize(new Dimension(ClientUI.PANEL_WIDTH, ClientUI.PANEL_HEIGHT)); + setPreferredSize(new Dimension(ClientUI.PANEL_WIDTH, ClientUI.PANEL_HEIGHT)); + setBackground(Color.black); + + Applet rs = dl(); + rs.setSize(this.getSize()); + rs.init(); + rs.start(); + this.add(rs); + } + + private Applet dl() throws Exception + { + ConfigLoader config = new ConfigLoader(); + + config.fetch(); + + //URL clientUrl = new URL(config.getProperty(ConfigLoader.CODEBASE) + config.getProperty(ConfigLoader.INITIAL_JAR)); + URL clientUrl = new URL("http://192.168.1.2/rs/" + config.getProperty(ConfigLoader.INITIAL_JAR)); + String initialClass = config.getProperty(ConfigLoader.INITIAL_CLASS).replace(".class", ""); + + URLClassLoader loader = new URLClassLoader(new URL[]{ clientUrl }); + Class clientClass = loader.loadClass(initialClass); + + Applet rs = (Applet) clientClass.newInstance(); + + rs.setStub(new RSStub(config, rs)); + return rs; + } +} \ No newline at end of file diff --git a/src/main/java/net/runelite/client/ui/ClientUI.java b/src/main/java/net/runelite/client/ui/ClientUI.java new file mode 100644 index 0000000000..4320f05825 --- /dev/null +++ b/src/main/java/net/runelite/client/ui/ClientUI.java @@ -0,0 +1,65 @@ +package net.runelite.client.ui; + +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.logging.Logger; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public final class ClientUI extends JFrame +{ + public static final int PANEL_WIDTH = 765, PANEL_HEIGHT = 503, LOG_HEIGHT = 120; + + private static final Logger log = Logger.getLogger(ClientUI.class.getName()); + + private ClientPanel panel; + + public ClientUI() throws Exception + { + init(); + pack(); + setTitle("RuneLite"); + setLocationRelativeTo(getOwner()); + setMinimumSize(getSize()); + setResizable(true); + } + + private void init() throws Exception { + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + + addWindowListener(new WindowAdapter() + { + @Override + public void windowClosing(WindowEvent e) + { + checkExit(); + } + }); + + JPopupMenu.setDefaultLightWeightPopupEnabled(false); + try + { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } + catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ignored) + { + } + + panel = new ClientPanel(); + add(panel); + } + + private void checkExit() + { + int result = JOptionPane.showConfirmDialog(this, "Are you sure you want to exit?", "Exit", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + + if (result == JOptionPane.OK_OPTION) + { + System.exit(0); + } + } +} \ No newline at end of file diff --git a/src/test/java/net/runelite/client/ConfigLoaderTest.java b/src/test/java/net/runelite/client/ConfigLoaderTest.java new file mode 100644 index 0000000000..ba34ce18b4 --- /dev/null +++ b/src/test/java/net/runelite/client/ConfigLoaderTest.java @@ -0,0 +1,27 @@ +package net.runelite.client; + +import java.io.IOException; +import org.junit.Test; + +/** + * + * @author Adam + */ +public class ConfigLoaderTest +{ + @Test + public void test() throws IOException + { + ConfigLoader loader = new ConfigLoader(); + loader.fetch(); + + for (String key : loader.getProperties().keySet()) + System.out.println(key + ": " + loader.getProperty(key)); + + System.out.println("Applet properties:"); + + for (String key : loader.getAppletProperties().keySet()) + System.out.println(key + ": " + loader.getAppletProperty(key)); + } + +} From 11669bba9758b648f0db57c22e67bda7cdc83031 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 2 Apr 2016 14:42:00 -0400 Subject: [PATCH 02/15] Use maven property for repository url --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4be61dba3e..1e5402692d 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ runelite - sftp://192.168.1.2/var/www/rs/repo + ${runelite.repository.url} From 175e644e133719606efcc644def7ecce83aba28d Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 2 Apr 2016 15:05:29 -0400 Subject: [PATCH 03/15] Update versions/group --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 1e5402692d..acb72a6390 100644 --- a/pom.xml +++ b/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - net.runelite.rs + net.runelite client - 1.0-SNAPSHOT + 1.0.0-SNAPSHOT UTF-8 @@ -23,7 +23,7 @@ net.runelite.rs api - 1.0-SNAPSHOT + 1.0.0-SNAPSHOT net.runelite From 40a01de73960d93a5a09be0927981cba8ec921db Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 2 Apr 2016 19:27:20 -0400 Subject: [PATCH 04/15] Client loader, pull from the repo. --- .../net/runelite/client/ClientLoader.java | 55 +++++++++++++++++++ .../net/runelite/client/ui/ClientPanel.java | 28 ++-------- 2 files changed, 59 insertions(+), 24 deletions(-) create mode 100644 src/main/java/net/runelite/client/ClientLoader.java diff --git a/src/main/java/net/runelite/client/ClientLoader.java b/src/main/java/net/runelite/client/ClientLoader.java new file mode 100644 index 0000000000..1ec22dcd36 --- /dev/null +++ b/src/main/java/net/runelite/client/ClientLoader.java @@ -0,0 +1,55 @@ +package net.runelite.client; + +import com.google.gson.Gson; +import java.applet.Applet; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.List; +import net.runelite.launcher.ArtifactResolver; +import net.runelite.launcher.Launcher; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.resolution.ArtifactResult; +import org.eclipse.aether.resolution.DependencyResolutionException; + +public class ClientLoader +{ + private static final String CLIENT_ARTIFACT_URL = "http://192.168.1.2/rs/client.json"; + + public Applet load() throws MalformedURLException, ClassNotFoundException, IOException, InstantiationException, IllegalAccessException, DependencyResolutionException + { + ConfigLoader config = new ConfigLoader(); + + config.fetch(); + + ArtifactResolver resolver = new ArtifactResolver(Launcher.REPO_DIR); + List results = resolver.resolveArtifacts(getClientArtifact()); + File client = results.get(0).getArtifact().getFile(); + + String initialClass = config.getProperty(ConfigLoader.INITIAL_CLASS).replace(".class", ""); + + URLClassLoader loader = new URLClassLoader(new URL[]{ client.toURI().toURL() }, this.getClass().getClassLoader()); + Class clientClass = loader.loadClass(initialClass); + + Applet rs = (Applet) clientClass.newInstance(); + + rs.setStub(new RSStub(config, rs)); + + return rs; + } + + private static Artifact getClientArtifact() throws MalformedURLException, IOException + { + URL u = new URL(CLIENT_ARTIFACT_URL); + try (InputStream i = u.openStream()) + { + Gson g = new Gson(); + return g.fromJson(new InputStreamReader(i), DefaultArtifact.class); + } + } +} diff --git a/src/main/java/net/runelite/client/ui/ClientPanel.java b/src/main/java/net/runelite/client/ui/ClientPanel.java index 8cf5f4bd56..5fb9788655 100644 --- a/src/main/java/net/runelite/client/ui/ClientPanel.java +++ b/src/main/java/net/runelite/client/ui/ClientPanel.java @@ -3,11 +3,8 @@ package net.runelite.client.ui; import java.applet.Applet; import java.awt.Color; import java.awt.Dimension; -import java.net.URL; -import java.net.URLClassLoader; import javax.swing.JPanel; -import net.runelite.client.ConfigLoader; -import net.runelite.client.RSStub; +import net.runelite.client.ClientLoader; final class ClientPanel extends JPanel { @@ -19,29 +16,12 @@ final class ClientPanel extends JPanel setPreferredSize(new Dimension(ClientUI.PANEL_WIDTH, ClientUI.PANEL_HEIGHT)); setBackground(Color.black); - Applet rs = dl(); + ClientLoader loader = new ClientLoader(); + + Applet rs = loader.load(); rs.setSize(this.getSize()); rs.init(); rs.start(); this.add(rs); } - - private Applet dl() throws Exception - { - ConfigLoader config = new ConfigLoader(); - - config.fetch(); - - //URL clientUrl = new URL(config.getProperty(ConfigLoader.CODEBASE) + config.getProperty(ConfigLoader.INITIAL_JAR)); - URL clientUrl = new URL("http://192.168.1.2/rs/" + config.getProperty(ConfigLoader.INITIAL_JAR)); - String initialClass = config.getProperty(ConfigLoader.INITIAL_CLASS).replace(".class", ""); - - URLClassLoader loader = new URLClassLoader(new URL[]{ clientUrl }); - Class clientClass = loader.loadClass(initialClass); - - Applet rs = (Applet) clientClass.newInstance(); - - rs.setStub(new RSStub(config, rs)); - return rs; - } } \ No newline at end of file From 03cf1b251aa7ffa583f377a35833f64ff0ac1be9 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 2 Apr 2016 20:26:52 -0400 Subject: [PATCH 05/15] Fix resizable. I can't tell if this is right. --- src/main/java/net/runelite/client/RSStub.java | 2 +- .../net/runelite/client/ui/ClientPanel.java | 39 ++++++++++++++++--- .../java/net/runelite/client/ui/ClientUI.java | 32 ++++++++++++--- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/runelite/client/RSStub.java b/src/main/java/net/runelite/client/RSStub.java index 1c7966e31a..efc0287da4 100644 --- a/src/main/java/net/runelite/client/RSStub.java +++ b/src/main/java/net/runelite/client/RSStub.java @@ -59,7 +59,7 @@ public class RSStub implements AppletStub public void appletResize(int width, int height) { Dimension d = new Dimension(width, height); - + app.setSize(d); app.setPreferredSize(d); } diff --git a/src/main/java/net/runelite/client/ui/ClientPanel.java b/src/main/java/net/runelite/client/ui/ClientPanel.java index 5fb9788655..b4f7a429db 100644 --- a/src/main/java/net/runelite/client/ui/ClientPanel.java +++ b/src/main/java/net/runelite/client/ui/ClientPanel.java @@ -3,25 +3,54 @@ package net.runelite.client.ui; import java.applet.Applet; import java.awt.Color; import java.awt.Dimension; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; import javax.swing.JPanel; import net.runelite.client.ClientLoader; -final class ClientPanel extends JPanel +final class ClientPanel extends JPanel implements ComponentListener { + public static final int PANEL_WIDTH = 765, PANEL_HEIGHT = 503; + + private Applet rs; public ClientPanel() throws Exception { - setSize(new Dimension(ClientUI.PANEL_WIDTH, ClientUI.PANEL_HEIGHT)); - setMinimumSize(new Dimension(ClientUI.PANEL_WIDTH, ClientUI.PANEL_HEIGHT)); - setPreferredSize(new Dimension(ClientUI.PANEL_WIDTH, ClientUI.PANEL_HEIGHT)); + setSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); setBackground(Color.black); + this.addComponentListener(this); ClientLoader loader = new ClientLoader(); - Applet rs = loader.load(); + rs = loader.load(); rs.setSize(this.getSize()); rs.init(); rs.start(); this.add(rs); } + + @Override + public void componentResized(ComponentEvent e) + { + rs.setSize(this.getSize()); + this.setPreferredSize(this.getSize()); + rs.setPreferredSize(this.getPreferredSize()); + } + + @Override + public void componentMoved(ComponentEvent e) + { + } + + @Override + public void componentShown(ComponentEvent e) + { + } + + @Override + public void componentHidden(ComponentEvent e) + { + } } \ No newline at end of file diff --git a/src/main/java/net/runelite/client/ui/ClientUI.java b/src/main/java/net/runelite/client/ui/ClientUI.java index 4320f05825..174d15bc4b 100644 --- a/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/src/main/java/net/runelite/client/ui/ClientUI.java @@ -1,19 +1,19 @@ package net.runelite.client.ui; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; -public final class ClientUI extends JFrame -{ - public static final int PANEL_WIDTH = 765, PANEL_HEIGHT = 503, LOG_HEIGHT = 120; - +public final class ClientUI extends JFrame implements ComponentListener +{ private static final Logger log = Logger.getLogger(ClientUI.class.getName()); private ClientPanel panel; @@ -26,6 +26,7 @@ public final class ClientUI extends JFrame setLocationRelativeTo(getOwner()); setMinimumSize(getSize()); setResizable(true); + this.addComponentListener(this); } private void init() throws Exception { @@ -62,4 +63,25 @@ public final class ClientUI extends JFrame System.exit(0); } } + + @Override + public void componentResized(ComponentEvent e) + { + SwingUtilities.invokeLater(() -> pack()); // is this right? + } + + @Override + public void componentMoved(ComponentEvent e) + { + } + + @Override + public void componentShown(ComponentEvent e) + { + } + + @Override + public void componentHidden(ComponentEvent e) + { + } } \ No newline at end of file From cf282f0cdd6df6a8aa0551d71a3628e5e6641e34 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 8 Apr 2016 23:10:09 -0400 Subject: [PATCH 06/15] Update urls and urlconnection ua for cloudflare --- src/main/java/net/runelite/client/ClientLoader.java | 7 +++++-- src/main/java/net/runelite/client/ConfigLoader.java | 3 +-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/runelite/client/ClientLoader.java b/src/main/java/net/runelite/client/ClientLoader.java index 1ec22dcd36..a1dca57556 100644 --- a/src/main/java/net/runelite/client/ClientLoader.java +++ b/src/main/java/net/runelite/client/ClientLoader.java @@ -9,6 +9,7 @@ import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.net.URLConnection; import java.util.List; import net.runelite.launcher.ArtifactResolver; import net.runelite.launcher.Launcher; @@ -19,7 +20,7 @@ import org.eclipse.aether.resolution.DependencyResolutionException; public class ClientLoader { - private static final String CLIENT_ARTIFACT_URL = "http://192.168.1.2/rs/client.json"; + private static final String CLIENT_ARTIFACT_URL = "https://static.runelite.net/client.json"; public Applet load() throws MalformedURLException, ClassNotFoundException, IOException, InstantiationException, IllegalAccessException, DependencyResolutionException { @@ -46,7 +47,9 @@ public class ClientLoader private static Artifact getClientArtifact() throws MalformedURLException, IOException { URL u = new URL(CLIENT_ARTIFACT_URL); - try (InputStream i = u.openStream()) + URLConnection conn = u.openConnection(); + conn.setRequestProperty("User-Agent", "Mozilla/5.0"); + try (InputStream i = conn.getInputStream()) { Gson g = new Gson(); return g.fromJson(new InputStreamReader(i), DefaultArtifact.class); diff --git a/src/main/java/net/runelite/client/ConfigLoader.java b/src/main/java/net/runelite/client/ConfigLoader.java index 9af73b845a..a9f831c3da 100644 --- a/src/main/java/net/runelite/client/ConfigLoader.java +++ b/src/main/java/net/runelite/client/ConfigLoader.java @@ -26,8 +26,7 @@ public class ConfigLoader { try { - configURL = new URL("http://192.168.1.2/rs/jav_config.ws"); - //configURL = new URL("http://oldschool1.runescape.com/jav_config.ws"); // https redirects us to rs3 + configURL = new URL("http://oldschool.runescape.com/jav_config.ws"); // https redirects us to rs3 } catch (MalformedURLException ex) { From 7f7ac1c6e2fdf20586eacc21024c4951fc4920f0 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 9 Apr 2016 15:05:35 -0400 Subject: [PATCH 07/15] Remove launcher --- .../java/net/runelite/client/Launcher.java | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/main/java/net/runelite/client/Launcher.java diff --git a/src/main/java/net/runelite/client/Launcher.java b/src/main/java/net/runelite/client/Launcher.java deleted file mode 100644 index 718073d454..0000000000 --- a/src/main/java/net/runelite/client/Launcher.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.runelite.client; - -import java.util.logging.Level; -import java.util.logging.Logger; -import net.runelite.launcher.Launchable; - -public class Launcher implements Launchable -{ - @Override - public void run() - { - try - { - new RuneLite().start(); - } - catch (Exception ex) - { - Logger.getLogger(Launcher.class.getName()).log(Level.SEVERE, null, ex); - } - } - -} From f0aa055ec5dfaf445bf81480fa4ec7831d693c31 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 17 Apr 2016 15:14:37 -0400 Subject: [PATCH 08/15] Hack in opponent info, seems to work --- pom.xml | 55 +++++++- .../net/runelite/client/ArtifactResolver.java | 118 ++++++++++++++++++ .../net/runelite/client/ClientLoader.java | 7 +- .../java/net/runelite/client/RuneLite.java | 23 ++++ .../net/runelite/client/plugins/Plugin.java | 6 + .../client/plugins/PluginManager.java | 6 + .../plugins/opponentinfo/OpponentInfo.java | 32 +++++ .../net/runelite/client/ui/ClientPanel.java | 4 + .../java/net/runelite/client/ui/ClientUI.java | 3 +- .../inject/callbacks/RSCanvasCallback.java | 27 ++++ 10 files changed, 272 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/runelite/client/ArtifactResolver.java create mode 100644 src/main/java/net/runelite/client/plugins/Plugin.java create mode 100644 src/main/java/net/runelite/client/plugins/PluginManager.java create mode 100644 src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java create mode 100644 src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java diff --git a/pom.xml b/pom.xml index acb72a6390..b7d45b4bd0 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,10 @@ UTF-8 1.8 1.8 + + 1.7.12 + 1.1.0 + 3.1.0 @@ -21,13 +25,54 @@ - net.runelite.rs - api - 1.0.0-SNAPSHOT + org.slf4j + slf4j-api + ${slf4j.version} - net.runelite - launcher + org.slf4j + slf4j-simple + ${slf4j.version} + + + org.eclipse.aether + aether-api + ${aether.version} + + + org.eclipse.aether + aether-impl + ${aether.version} + + + org.eclipse.aether + aether-connector-basic + ${aether.version} + + + org.eclipse.aether + aether-transport-http + ${aether.version} + + + org.apache.maven + maven-aether-provider + ${maven.version} + + + com.google.code.gson + gson + 2.4 + + + net.sf.jopt-simple + jopt-simple + 5.0.1 + + + + net.runelite.rs + api 1.0.0-SNAPSHOT diff --git a/src/main/java/net/runelite/client/ArtifactResolver.java b/src/main/java/net/runelite/client/ArtifactResolver.java new file mode 100644 index 0000000000..1a9ce66e81 --- /dev/null +++ b/src/main/java/net/runelite/client/ArtifactResolver.java @@ -0,0 +1,118 @@ +package net.runelite.client; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.apache.maven.repository.internal.MavenRepositorySystemUtils; +import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyFilter; +import org.eclipse.aether.impl.DefaultServiceLocator; +import org.eclipse.aether.repository.LocalRepository; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.repository.RepositoryPolicy; +import org.eclipse.aether.resolution.ArtifactResult; +import org.eclipse.aether.resolution.DependencyRequest; +import org.eclipse.aether.resolution.DependencyResolutionException; +import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; +import org.eclipse.aether.spi.connector.transport.TransporterFactory; +import org.eclipse.aether.transport.http.HttpTransporterFactory; +import org.eclipse.aether.util.artifact.JavaScopes; +import org.eclipse.aether.util.filter.DependencyFilterUtils; + +public class ArtifactResolver +{ + private final File repositoryCache; + private final List repositories = new ArrayList<>(); + + public ArtifactResolver(File repositoryCache) + { + this.repositoryCache = repositoryCache; + } + + public List resolveArtifacts(Artifact artifact) throws DependencyResolutionException + { + RepositorySystem system = newRepositorySystem(); + + RepositorySystemSession session = newRepositorySystemSession(system); + + DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE); + + CollectRequest collectRequest = new CollectRequest(); + collectRequest.setRoot(new Dependency(artifact, JavaScopes.COMPILE)); + collectRequest.setRepositories(repositories); + + DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, classpathFlter); + + List results = system.resolveDependencies(session, dependencyRequest).getArtifactResults(); + validate(results); + return results; + } + + public DefaultRepositorySystemSession newRepositorySystemSession(RepositorySystem system) + { + DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); + + LocalRepository localRepo = new LocalRepository(repositoryCache.getAbsolutePath()); + session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); + session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS); // this causes a refetch of maven-metadata.xml, but not any binaries + + //session.setTransferListener(new ConsoleTransferListener()); + //session.setRepositoryListener(new ConsoleRepositoryListener()); + + return session; + } + + public RepositorySystem newRepositorySystem() + { + DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); + locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); + locator.addService(TransporterFactory.class, HttpTransporterFactory.class); + + locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler() + { + @Override + public void serviceCreationFailed(Class type, Class impl, Throwable exception) + { + exception.printStackTrace(); + } + }); + + return locator.getService(RepositorySystem.class); + } + + public void addRepositories() + { + repositories.add(this.newCentralRepository()); + repositories.add(this.newRuneliteRepository()); + } + + private RemoteRepository newCentralRepository() + { + return new RemoteRepository.Builder("central", "default", "http://central.maven.org/maven2/").build(); + } + + public RemoteRepository newRuneliteRepository() + { + return new RemoteRepository.Builder("runelite", "default", "http://repo.runelite.net/").build(); + } + + private void validate(List artifacts) + { + for (ArtifactResult ar : artifacts) + { + Artifact a = ar.getArtifact(); + + if (!a.getGroupId().startsWith("net.runelite")) + continue; + + if (!ar.getRepository().equals(newRuneliteRepository())) + throw new RuntimeException(); + } + } +} diff --git a/src/main/java/net/runelite/client/ClientLoader.java b/src/main/java/net/runelite/client/ClientLoader.java index a1dca57556..cbe03338fa 100644 --- a/src/main/java/net/runelite/client/ClientLoader.java +++ b/src/main/java/net/runelite/client/ClientLoader.java @@ -11,8 +11,6 @@ import java.net.URL; import java.net.URLClassLoader; import java.net.URLConnection; import java.util.List; -import net.runelite.launcher.ArtifactResolver; -import net.runelite.launcher.Launcher; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.resolution.ArtifactResult; @@ -28,7 +26,10 @@ public class ClientLoader config.fetch(); - ArtifactResolver resolver = new ArtifactResolver(Launcher.REPO_DIR); + // the only thing resolved here is the injected client, which has no dependencies, so no need to switch developer mode + ArtifactResolver resolver = new ArtifactResolver(RuneLite.REPO_DIR); + resolver.addRepositories(); + List results = resolver.resolveArtifacts(getClientArtifact()); File client = results.get(0).getArtifact().getFile(); diff --git a/src/main/java/net/runelite/client/RuneLite.java b/src/main/java/net/runelite/client/RuneLite.java index ec16437acb..3bad251fb3 100644 --- a/src/main/java/net/runelite/client/RuneLite.java +++ b/src/main/java/net/runelite/client/RuneLite.java @@ -1,14 +1,27 @@ package net.runelite.client; +import java.io.File; +import joptsimple.OptionParser; +import joptsimple.OptionSet; +import net.runelite.api.Client; import net.runelite.client.ui.ClientUI; public class RuneLite { + public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite"); + public static final File REPO_DIR = new File(RUNELITE_DIR, "repository"); + + public static OptionSet options; private ClientUI gui; + private static Client client; public static void main(String[] args) throws Exception { + OptionParser parser = new OptionParser(); + parser.accepts("developer-mode"); + options = parser.parse(args); + new RuneLite().start(); } @@ -17,4 +30,14 @@ public class RuneLite gui = new ClientUI(); gui.setVisible(true); } + + public static Client getClient() + { + return client; + } + + public static void setClient(Client client) + { + RuneLite.client = client; + } } diff --git a/src/main/java/net/runelite/client/plugins/Plugin.java b/src/main/java/net/runelite/client/plugins/Plugin.java new file mode 100644 index 0000000000..e4a6ba01dd --- /dev/null +++ b/src/main/java/net/runelite/client/plugins/Plugin.java @@ -0,0 +1,6 @@ +package net.runelite.client.plugins; + +public class Plugin +{ + +} diff --git a/src/main/java/net/runelite/client/plugins/PluginManager.java b/src/main/java/net/runelite/client/plugins/PluginManager.java new file mode 100644 index 0000000000..37a51dddba --- /dev/null +++ b/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -0,0 +1,6 @@ +package net.runelite.client.plugins; + +public class PluginManager +{ + +} diff --git a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java new file mode 100644 index 0000000000..818eee112d --- /dev/null +++ b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java @@ -0,0 +1,32 @@ +package net.runelite.client.plugins.opponentinfo; + +import java.awt.Graphics; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.client.RuneLite; +import net.runelite.client.plugins.Plugin; + +public class OpponentInfo extends Plugin +{ + private Actor getOpponent() + { + Client client = RuneLite.getClient(); + + Player player = client.getLocalPlayer(); + if (player == null) + return null; + + return player.getInteracting(); + } + + public void draw(Graphics graphics) + { + Actor opponent = getOpponent(); + + if (opponent == null) + return; + + graphics.drawString(opponent.getName() + " " + opponent.getHealth() + "/" + opponent.getMaxHealth(), 42, 42); + } +} diff --git a/src/main/java/net/runelite/client/ui/ClientPanel.java b/src/main/java/net/runelite/client/ui/ClientPanel.java index b4f7a429db..5c613aece6 100644 --- a/src/main/java/net/runelite/client/ui/ClientPanel.java +++ b/src/main/java/net/runelite/client/ui/ClientPanel.java @@ -6,7 +6,9 @@ import java.awt.Dimension; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.JPanel; +import net.runelite.api.Client; import net.runelite.client.ClientLoader; +import net.runelite.client.RuneLite; final class ClientPanel extends JPanel implements ComponentListener { @@ -29,6 +31,8 @@ final class ClientPanel extends JPanel implements ComponentListener rs.init(); rs.start(); this.add(rs); + + RuneLite.setClient(new Client((net.runelite.rs.api.Client) rs)); } @Override diff --git a/src/main/java/net/runelite/client/ui/ClientUI.java b/src/main/java/net/runelite/client/ui/ClientUI.java index 174d15bc4b..d473f50800 100644 --- a/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/src/main/java/net/runelite/client/ui/ClientUI.java @@ -29,7 +29,8 @@ public final class ClientUI extends JFrame implements ComponentListener this.addComponentListener(this); } - private void init() throws Exception { + private void init() throws Exception + { setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() diff --git a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java new file mode 100644 index 0000000000..42a9e983d3 --- /dev/null +++ b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java @@ -0,0 +1,27 @@ +package net.runelite.inject.callbacks; + +import java.awt.Canvas; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import net.runelite.client.plugins.opponentinfo.OpponentInfo; + +public class RSCanvasCallback +{ + private final BufferedImage clientBuffer = new BufferedImage(756, 503, BufferedImage.TYPE_INT_RGB); + private final BufferedImage gameBuffer = new BufferedImage(756, 503, BufferedImage.TYPE_INT_RGB); + + public Graphics getGraphics(Canvas canvas, Graphics superGraphics) + { + Graphics clientGraphics = clientBuffer.getGraphics(); + clientGraphics.drawImage(gameBuffer, 0, 0, null); + //clientGraphics.dispose(); + + //clientGraphics = clientBuffer.getGraphics(); + //clientGraphics.drawString("something, something 2", 42, 42); + new OpponentInfo().draw(clientGraphics); + + superGraphics.drawImage(clientBuffer, 0, 0, null); + + return gameBuffer.getGraphics(); + } +} From 755d013873812c3e19b1fe4f01e53ec87e28fb3d Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 22 Apr 2016 21:56:54 -0400 Subject: [PATCH 09/15] Fix artifact resolver to allow local cache files --- src/main/java/net/runelite/client/ArtifactResolver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/runelite/client/ArtifactResolver.java b/src/main/java/net/runelite/client/ArtifactResolver.java index 1a9ce66e81..1ba48130e9 100644 --- a/src/main/java/net/runelite/client/ArtifactResolver.java +++ b/src/main/java/net/runelite/client/ArtifactResolver.java @@ -111,7 +111,7 @@ public class ArtifactResolver if (!a.getGroupId().startsWith("net.runelite")) continue; - if (!ar.getRepository().equals(newRuneliteRepository())) + if (ar.getRepository() instanceof RemoteRepository && !ar.getRepository().equals(newRuneliteRepository())) throw new RuntimeException(); } } From 6e8338455cf3fc65006e5e4788764cb3a6db96af Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 23 Apr 2016 14:50:17 -0400 Subject: [PATCH 10/15] Hp bar work --- .../plugins/opponentinfo/OpponentInfo.java | 67 ++++++++++++++++++- .../inject/callbacks/RSCanvasCallback.java | 2 + 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java index 818eee112d..424117c69b 100644 --- a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java +++ b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java @@ -1,6 +1,9 @@ package net.runelite.client.plugins.opponentinfo; +import java.awt.Color; +import java.awt.FontMetrics; import java.awt.Graphics; +import java.awt.image.BufferedImage; import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.Player; @@ -9,6 +12,21 @@ import net.runelite.client.plugins.Plugin; public class OpponentInfo extends Plugin { + private static final int WIDTH = 140; + private static final int HEIGHT = 75; + + private static final int TOP_BORDER = 2; + private static final int BOTTOM_BORDER = 2; + + private static final int BAR_WIDTH = 124; + private static final int BAR_HEIGHT = 20; + + private static final Color BACKGROUND = new Color(Color.gray.getRed(), Color.gray.getGreen(), Color.gray.getBlue(), 127); + private static final Color HP_GREEN = new Color(0, 146, 54, 230); + private static final Color HP_RED = new Color(102, 15, 16, 230); + + private final BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); + private Actor getOpponent() { Client client = RuneLite.getClient(); @@ -27,6 +45,53 @@ public class OpponentInfo extends Plugin if (opponent == null) return; - graphics.drawString(opponent.getName() + " " + opponent.getHealth() + "/" + opponent.getMaxHealth(), 42, 42); + int cur = opponent.getHealth(); + int max = opponent.getMaxHealth(); + + Graphics g = image.getGraphics(); + FontMetrics fm = g.getFontMetrics(); + + int height = TOP_BORDER + + fm.getHeight(); // opponent name + if (max > 0) + height += 1 // between name and hp bar + + BAR_HEIGHT; // bar + height += BOTTOM_BORDER; + + g.setColor(BACKGROUND); + g.fillRect(0, 0, image.getWidth(), height); + + String str = opponent.getName(); + + int x = (image.getWidth() - fm.stringWidth(str)) / 2; + g.setColor(Color.white); + g.drawString(str, x, fm.getHeight() + TOP_BORDER); + + // hp bar + + if (max > 0) + { + float percent = (float) cur / (float) max; + if (percent > 100f) + percent = 100f; + + int barWidth = (int) (percent * (float) BAR_WIDTH); + int barY = TOP_BORDER + fm.getHeight() + 1; + + g.setColor(HP_GREEN); + g.fillRect((WIDTH - BAR_WIDTH) / 2, barY, barWidth, BAR_HEIGHT); + + g.setColor(HP_RED); + g.fillRect(((WIDTH - BAR_WIDTH) / 2) + barWidth, barY, BAR_WIDTH - barWidth, BAR_HEIGHT); + + str = cur + " / " + max; + x = (image.getWidth() - fm.stringWidth(str)) / 2; + g.setColor(Color.white); + g.drawString(str, x, barY + fm.getHeight()); + } + + g.dispose(); + + graphics.drawImage(image, 10, 25, null); } } diff --git a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java index 42a9e983d3..9b6805296e 100644 --- a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java +++ b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java @@ -20,6 +20,8 @@ public class RSCanvasCallback //clientGraphics.drawString("something, something 2", 42, 42); new OpponentInfo().draw(clientGraphics); + clientGraphics.dispose(); + superGraphics.drawImage(clientBuffer, 0, 0, null); return gameBuffer.getGraphics(); From 5bbdec9a760df51164a694a08a441f585a77f880 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 23 Apr 2016 17:24:19 -0400 Subject: [PATCH 11/15] Initial thinking on overlay renderer --- .../java/net/runelite/client/RuneLite.java | 31 +++++++++- .../net/runelite/client/plugins/Plugin.java | 6 +- .../client/plugins/PluginManager.java | 15 +++++ .../plugins/opponentinfo/OpponentInfo.java | 14 ++++- .../java/net/runelite/client/ui/ClientUI.java | 5 +- .../java/net/runelite/client/ui/Overlay.java | 59 +++++++++++++++++++ .../runelite/client/ui/OverlayPosition.java | 6 ++ .../runelite/client/ui/OverlayPriority.java | 8 +++ .../runelite/client/ui/OverlayRenderer.java | 40 +++++++++++++ .../inject/callbacks/RSCanvasCallback.java | 14 +++-- 10 files changed, 182 insertions(+), 16 deletions(-) create mode 100644 src/main/java/net/runelite/client/ui/Overlay.java create mode 100644 src/main/java/net/runelite/client/ui/OverlayPosition.java create mode 100644 src/main/java/net/runelite/client/ui/OverlayPriority.java create mode 100644 src/main/java/net/runelite/client/ui/OverlayRenderer.java diff --git a/src/main/java/net/runelite/client/RuneLite.java b/src/main/java/net/runelite/client/RuneLite.java index 3bad251fb3..2db7dd9e47 100644 --- a/src/main/java/net/runelite/client/RuneLite.java +++ b/src/main/java/net/runelite/client/RuneLite.java @@ -4,7 +4,9 @@ import java.io.File; import joptsimple.OptionParser; import joptsimple.OptionSet; import net.runelite.api.Client; +import net.runelite.client.plugins.PluginManager; import net.runelite.client.ui.ClientUI; +import net.runelite.client.ui.OverlayRenderer; public class RuneLite @@ -13,8 +15,12 @@ public class RuneLite public static final File REPO_DIR = new File(RUNELITE_DIR, "repository"); public static OptionSet options; - private ClientUI gui; private static Client client; + private static RuneLite runelite; + + private ClientUI gui; + private PluginManager pluginManager; + private OverlayRenderer renderer; public static void main(String[] args) throws Exception { @@ -22,13 +28,19 @@ public class RuneLite parser.accepts("developer-mode"); options = parser.parse(args); - new RuneLite().start(); + runelite = new RuneLite(); + runelite.start(); } public void start() throws Exception { gui = new ClientUI(); gui.setVisible(true); + + pluginManager = new PluginManager(); + pluginManager.loadAll(); + + renderer = new OverlayRenderer(); } public static Client getClient() @@ -40,4 +52,19 @@ public class RuneLite { RuneLite.client = client; } + + public static RuneLite getRunelite() + { + return runelite; + } + + public PluginManager getPluginManager() + { + return pluginManager; + } + + public OverlayRenderer getRenderer() + { + return renderer; + } } diff --git a/src/main/java/net/runelite/client/plugins/Plugin.java b/src/main/java/net/runelite/client/plugins/Plugin.java index e4a6ba01dd..3903781bff 100644 --- a/src/main/java/net/runelite/client/plugins/Plugin.java +++ b/src/main/java/net/runelite/client/plugins/Plugin.java @@ -1,6 +1,8 @@ package net.runelite.client.plugins; -public class Plugin -{ +import net.runelite.client.ui.Overlay; +public abstract class Plugin +{ + public abstract Overlay drawOverlay(); } diff --git a/src/main/java/net/runelite/client/plugins/PluginManager.java b/src/main/java/net/runelite/client/plugins/PluginManager.java index 37a51dddba..60b0561ae5 100644 --- a/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -1,6 +1,21 @@ package net.runelite.client.plugins; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import net.runelite.client.plugins.opponentinfo.OpponentInfo; + public class PluginManager { + private final List plugins = new ArrayList<>(); + public void loadAll() + { + plugins.add(new OpponentInfo()); + } + + public Collection getPlugins() + { + return plugins; + } } diff --git a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java index 424117c69b..40ec49bdaf 100644 --- a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java +++ b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java @@ -1,6 +1,7 @@ package net.runelite.client.plugins.opponentinfo; import java.awt.Color; +import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.image.BufferedImage; @@ -9,6 +10,9 @@ import net.runelite.api.Client; import net.runelite.api.Player; import net.runelite.client.RuneLite; import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.Overlay; +import net.runelite.client.ui.OverlayPosition; +import net.runelite.client.ui.OverlayPriority; public class OpponentInfo extends Plugin { @@ -26,6 +30,7 @@ public class OpponentInfo extends Plugin private static final Color HP_RED = new Color(102, 15, 16, 230); private final BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); + private final Overlay overlay = new Overlay(image, OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); private Actor getOpponent() { @@ -38,12 +43,13 @@ public class OpponentInfo extends Plugin return player.getInteracting(); } - public void draw(Graphics graphics) + @Override + public Overlay drawOverlay() { Actor opponent = getOpponent(); if (opponent == null) - return; + return null; int cur = opponent.getHealth(); int max = opponent.getMaxHealth(); @@ -92,6 +98,8 @@ public class OpponentInfo extends Plugin g.dispose(); - graphics.drawImage(image, 10, 25, null); + overlay.setDimension(new Dimension(height, image.getWidth())); + + return overlay; } } diff --git a/src/main/java/net/runelite/client/ui/ClientUI.java b/src/main/java/net/runelite/client/ui/ClientUI.java index d473f50800..ee927145b3 100644 --- a/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/src/main/java/net/runelite/client/ui/ClientUI.java @@ -4,7 +4,6 @@ import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; @@ -13,9 +12,7 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public final class ClientUI extends JFrame implements ComponentListener -{ - private static final Logger log = Logger.getLogger(ClientUI.class.getName()); - +{ private ClientPanel panel; public ClientUI() throws Exception diff --git a/src/main/java/net/runelite/client/ui/Overlay.java b/src/main/java/net/runelite/client/ui/Overlay.java new file mode 100644 index 0000000000..1763923856 --- /dev/null +++ b/src/main/java/net/runelite/client/ui/Overlay.java @@ -0,0 +1,59 @@ +package net.runelite.client.ui; + +import java.awt.Dimension; +import java.awt.image.BufferedImage; + +public class Overlay +{ + private BufferedImage image; // image to draw + private Dimension dimension; // dimension of visable overlay + private OverlayPosition position; // where to draw it + private OverlayPriority priority; // if multiple overlays exist in the same position, who wins + + public Overlay(BufferedImage image, OverlayPosition position, OverlayPriority priority) + { + this.image = image; + this.position = position; + this.priority = priority; + } + + public BufferedImage getImage() + { + return image; + } + + public void setImage(BufferedImage image) + { + this.image = image; + } + + public Dimension getDimension() + { + return dimension; + } + + public void setDimension(Dimension dimension) + { + this.dimension = dimension; + } + + public OverlayPosition getPosition() + { + return position; + } + + public void setPosition(OverlayPosition position) + { + this.position = position; + } + + public OverlayPriority getPriority() + { + return priority; + } + + public void setPriority(OverlayPriority priority) + { + this.priority = priority; + } +} diff --git a/src/main/java/net/runelite/client/ui/OverlayPosition.java b/src/main/java/net/runelite/client/ui/OverlayPosition.java new file mode 100644 index 0000000000..45bda4106d --- /dev/null +++ b/src/main/java/net/runelite/client/ui/OverlayPosition.java @@ -0,0 +1,6 @@ +package net.runelite.client.ui; + +public enum OverlayPosition +{ + TOP_LEFT; +} diff --git a/src/main/java/net/runelite/client/ui/OverlayPriority.java b/src/main/java/net/runelite/client/ui/OverlayPriority.java new file mode 100644 index 0000000000..f00b3acdf5 --- /dev/null +++ b/src/main/java/net/runelite/client/ui/OverlayPriority.java @@ -0,0 +1,8 @@ +package net.runelite.client.ui; + +public enum OverlayPriority +{ + LOW, + MED, + HIGH; +} diff --git a/src/main/java/net/runelite/client/ui/OverlayRenderer.java b/src/main/java/net/runelite/client/ui/OverlayRenderer.java new file mode 100644 index 0000000000..80253ad0dc --- /dev/null +++ b/src/main/java/net/runelite/client/ui/OverlayRenderer.java @@ -0,0 +1,40 @@ +package net.runelite.client.ui; + +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; +import net.runelite.client.RuneLite; +import net.runelite.client.plugins.Plugin; + +public class OverlayRenderer +{ + private static final int TOP_LEFT_BORDER_TOP = 25; + private static final int TOP_LEFT_BORDER_LEFT = 10; + private static final int TOP_LEFT_PADDING = 10; + + public void render(Graphics graphics) + { + List overlays = new ArrayList<>(); + + for (Plugin plugin : RuneLite.getRunelite().getPluginManager().getPlugins()) + { + Overlay overlay = plugin.drawOverlay(); + if (overlay != null) + overlays.add(overlay); + } + + Overlay[] topLeft = overlays.stream().filter(o -> o.getPosition() == OverlayPosition.TOP_LEFT).sorted((o1, o2) -> o1.getPriority().compareTo(o2.getPriority())).toArray(s -> new Overlay[s]); + int y = TOP_LEFT_BORDER_TOP; + + for (Overlay overlay : topLeft) + { + BufferedImage image = overlay.getImage(); + Dimension dimension = overlay.getDimension(); + + graphics.drawImage(image, TOP_LEFT_BORDER_LEFT, y, null); + y += dimension.getHeight() + TOP_LEFT_PADDING; + } + } +} diff --git a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java index 9b6805296e..1690db94a7 100644 --- a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java +++ b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java @@ -3,7 +3,8 @@ package net.runelite.inject.callbacks; import java.awt.Canvas; import java.awt.Graphics; import java.awt.image.BufferedImage; -import net.runelite.client.plugins.opponentinfo.OpponentInfo; +import net.runelite.client.RuneLite; +import net.runelite.client.ui.OverlayRenderer; public class RSCanvasCallback { @@ -14,11 +15,14 @@ public class RSCanvasCallback { Graphics clientGraphics = clientBuffer.getGraphics(); clientGraphics.drawImage(gameBuffer, 0, 0, null); - //clientGraphics.dispose(); - //clientGraphics = clientBuffer.getGraphics(); - //clientGraphics.drawString("something, something 2", 42, 42); - new OpponentInfo().draw(clientGraphics); + RuneLite runelite = RuneLite.getRunelite(); + if (runelite != null) + { + OverlayRenderer renderer = runelite.getRenderer(); + if (renderer != null) + renderer.render(clientGraphics); + } clientGraphics.dispose(); From 271752873ff4483efa2ce5e289e0ac08773915a0 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 24 Apr 2016 10:29:39 -0400 Subject: [PATCH 12/15] Rethink overlay rendering stuff --- .../java/net/runelite/client/RuneLite.java | 2 +- .../net/runelite/client/plugins/Plugin.java | 4 +- .../client/plugins/PluginManager.java | 2 + .../client/plugins/boosts/Boosts.java | 15 +++ .../client/plugins/boosts/BoostsOverlay.java | 81 +++++++++++++++ .../plugins/opponentinfo/OpponentInfo.java | 96 +----------------- .../opponentinfo/OpponentInfoOverlay.java | 99 +++++++++++++++++++ .../java/net/runelite/client/ui/Overlay.java | 59 ----------- .../runelite/client/ui/OverlayPosition.java | 6 -- .../runelite/client/ui/OverlayRenderer.java | 40 -------- .../runelite/client/ui/overlay/Overlay.java | 38 +++++++ .../client/ui/overlay/OverlayPosition.java | 6 ++ .../ui/{ => overlay}/OverlayPriority.java | 2 +- .../client/ui/overlay/OverlayRenderer.java | 23 +++++ .../client/ui/overlay/TopDownRenderer.java | 40 ++++++++ .../inject/callbacks/RSCanvasCallback.java | 13 +-- 16 files changed, 318 insertions(+), 208 deletions(-) create mode 100644 src/main/java/net/runelite/client/plugins/boosts/Boosts.java create mode 100644 src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java create mode 100644 src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java delete mode 100644 src/main/java/net/runelite/client/ui/Overlay.java delete mode 100644 src/main/java/net/runelite/client/ui/OverlayPosition.java delete mode 100644 src/main/java/net/runelite/client/ui/OverlayRenderer.java create mode 100644 src/main/java/net/runelite/client/ui/overlay/Overlay.java create mode 100644 src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java rename src/main/java/net/runelite/client/ui/{ => overlay}/OverlayPriority.java (56%) create mode 100644 src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java create mode 100644 src/main/java/net/runelite/client/ui/overlay/TopDownRenderer.java diff --git a/src/main/java/net/runelite/client/RuneLite.java b/src/main/java/net/runelite/client/RuneLite.java index 2db7dd9e47..1876db9c93 100644 --- a/src/main/java/net/runelite/client/RuneLite.java +++ b/src/main/java/net/runelite/client/RuneLite.java @@ -6,7 +6,7 @@ import joptsimple.OptionSet; import net.runelite.api.Client; import net.runelite.client.plugins.PluginManager; import net.runelite.client.ui.ClientUI; -import net.runelite.client.ui.OverlayRenderer; +import net.runelite.client.ui.overlay.OverlayRenderer; public class RuneLite diff --git a/src/main/java/net/runelite/client/plugins/Plugin.java b/src/main/java/net/runelite/client/plugins/Plugin.java index 3903781bff..6005ce6e2b 100644 --- a/src/main/java/net/runelite/client/plugins/Plugin.java +++ b/src/main/java/net/runelite/client/plugins/Plugin.java @@ -1,8 +1,8 @@ package net.runelite.client.plugins; -import net.runelite.client.ui.Overlay; +import net.runelite.client.ui.overlay.Overlay; public abstract class Plugin { - public abstract Overlay drawOverlay(); + public abstract Overlay getOverlay(); } diff --git a/src/main/java/net/runelite/client/plugins/PluginManager.java b/src/main/java/net/runelite/client/plugins/PluginManager.java index 60b0561ae5..7ff8e0e614 100644 --- a/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -3,6 +3,7 @@ package net.runelite.client.plugins; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import net.runelite.client.plugins.boosts.Boosts; import net.runelite.client.plugins.opponentinfo.OpponentInfo; public class PluginManager @@ -11,6 +12,7 @@ public class PluginManager public void loadAll() { + plugins.add(new Boosts()); plugins.add(new OpponentInfo()); } diff --git a/src/main/java/net/runelite/client/plugins/boosts/Boosts.java b/src/main/java/net/runelite/client/plugins/boosts/Boosts.java new file mode 100644 index 0000000000..040c582a88 --- /dev/null +++ b/src/main/java/net/runelite/client/plugins/boosts/Boosts.java @@ -0,0 +1,15 @@ +package net.runelite.client.plugins.boosts; + +import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.overlay.Overlay; + +public class Boosts extends Plugin +{ + private final Overlay overlay = new BoostsOverlay(); + + @Override + public Overlay getOverlay() + { + return overlay; + } +} diff --git a/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java b/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java new file mode 100644 index 0000000000..7f18b24936 --- /dev/null +++ b/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java @@ -0,0 +1,81 @@ +package net.runelite.client.plugins.boosts; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import net.runelite.api.Client; +import net.runelite.api.Skill; +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.OverlayPriority; + +class BoostsOverlay extends Overlay +{ + private static final int WIDTH = 140; + + private static final Color BACKGROUND = new Color(Color.gray.getRed(), Color.gray.getGreen(), Color.gray.getBlue(), 127); + + private static final Skill[] SHOW = new Skill[] { Skill.ATTACK, Skill.STRENGTH, Skill.DEFENCE, Skill.RANGED, Skill.MAGIC }; + + private static final int TOP_BORDER = 2; + private static final int LEFT_BORDER = 2; + private static final int RIGHT_BORDER = 2; + + private static final int SEPARATOR = 2; + + BoostsOverlay() + { + super(OverlayPosition.TOP_LEFT, OverlayPriority.MED); + } + + @Override + public Dimension render(Graphics2D graphics) + { + Client client = RuneLite.getClient(); + FontMetrics metrics = graphics.getFontMetrics(); + + int[] boostedSkills = client.getBoostedSkillLevels(), + baseSkills = client.getRealSkillLevels(); + + int height = TOP_BORDER; + for (Skill skill : SHOW) + { + int boosted = boostedSkills[skill.ordinal()], + base = baseSkills[skill.ordinal()]; + + if (boosted == base) + continue; + + height += metrics.getHeight() + SEPARATOR; + } + + if (height == TOP_BORDER) + return null; + + graphics.setColor(BACKGROUND); + graphics.fillRect(0, 0, WIDTH, height); + + int y = TOP_BORDER; + for (Skill skill : SHOW) + { + int boosted = boostedSkills[skill.ordinal()], + base = baseSkills[skill.ordinal()]; + + if (boosted == base) + continue; + + graphics.setColor(Color.white); + graphics.drawString(skill.getName(), LEFT_BORDER, y + metrics.getHeight()); + + String str = boosted + "/" + base; + graphics.drawString(str, WIDTH - RIGHT_BORDER - metrics.stringWidth(str), y + metrics.getHeight()); + + y += metrics.getHeight() + SEPARATOR; + } + + return new Dimension(WIDTH, height); + } + +} diff --git a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java index 40ec49bdaf..23ae1a099f 100644 --- a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java +++ b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfo.java @@ -1,105 +1,15 @@ package net.runelite.client.plugins.opponentinfo; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import net.runelite.api.Actor; -import net.runelite.api.Client; -import net.runelite.api.Player; -import net.runelite.client.RuneLite; import net.runelite.client.plugins.Plugin; -import net.runelite.client.ui.Overlay; -import net.runelite.client.ui.OverlayPosition; -import net.runelite.client.ui.OverlayPriority; +import net.runelite.client.ui.overlay.Overlay; public class OpponentInfo extends Plugin { - private static final int WIDTH = 140; - private static final int HEIGHT = 75; - - private static final int TOP_BORDER = 2; - private static final int BOTTOM_BORDER = 2; - - private static final int BAR_WIDTH = 124; - private static final int BAR_HEIGHT = 20; - - private static final Color BACKGROUND = new Color(Color.gray.getRed(), Color.gray.getGreen(), Color.gray.getBlue(), 127); - private static final Color HP_GREEN = new Color(0, 146, 54, 230); - private static final Color HP_RED = new Color(102, 15, 16, 230); - - private final BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); - private final Overlay overlay = new Overlay(image, OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); - - private Actor getOpponent() - { - Client client = RuneLite.getClient(); - - Player player = client.getLocalPlayer(); - if (player == null) - return null; - - return player.getInteracting(); - } + private final Overlay overlay = new OpponentInfoOverlay(); @Override - public Overlay drawOverlay() + public Overlay getOverlay() { - Actor opponent = getOpponent(); - - if (opponent == null) - return null; - - int cur = opponent.getHealth(); - int max = opponent.getMaxHealth(); - - Graphics g = image.getGraphics(); - FontMetrics fm = g.getFontMetrics(); - - int height = TOP_BORDER - + fm.getHeight(); // opponent name - if (max > 0) - height += 1 // between name and hp bar - + BAR_HEIGHT; // bar - height += BOTTOM_BORDER; - - g.setColor(BACKGROUND); - g.fillRect(0, 0, image.getWidth(), height); - - String str = opponent.getName(); - - int x = (image.getWidth() - fm.stringWidth(str)) / 2; - g.setColor(Color.white); - g.drawString(str, x, fm.getHeight() + TOP_BORDER); - - // hp bar - - if (max > 0) - { - float percent = (float) cur / (float) max; - if (percent > 100f) - percent = 100f; - - int barWidth = (int) (percent * (float) BAR_WIDTH); - int barY = TOP_BORDER + fm.getHeight() + 1; - - g.setColor(HP_GREEN); - g.fillRect((WIDTH - BAR_WIDTH) / 2, barY, barWidth, BAR_HEIGHT); - - g.setColor(HP_RED); - g.fillRect(((WIDTH - BAR_WIDTH) / 2) + barWidth, barY, BAR_WIDTH - barWidth, BAR_HEIGHT); - - str = cur + " / " + max; - x = (image.getWidth() - fm.stringWidth(str)) / 2; - g.setColor(Color.white); - g.drawString(str, x, barY + fm.getHeight()); - } - - g.dispose(); - - overlay.setDimension(new Dimension(height, image.getWidth())); - return overlay; } } diff --git a/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java new file mode 100644 index 0000000000..3bc22c3f63 --- /dev/null +++ b/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java @@ -0,0 +1,99 @@ +package net.runelite.client.plugins.opponentinfo; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Player; +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.OverlayPriority; + +class OpponentInfoOverlay extends Overlay +{ + private static final int WIDTH = 140; + + private static final int TOP_BORDER = 2; + private static final int BOTTOM_BORDER = 2; + + private static final int BAR_WIDTH = 124; + private static final int BAR_HEIGHT = 20; + + private static final Color BACKGROUND = new Color(Color.gray.getRed(), Color.gray.getGreen(), Color.gray.getBlue(), 127); + private static final Color HP_GREEN = new Color(0, 146, 54, 230); + private static final Color HP_RED = new Color(102, 15, 16, 230); + + OpponentInfoOverlay() + { + super(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); + } + + private Actor getOpponent() + { + Client client = RuneLite.getClient(); + + Player player = client.getLocalPlayer(); + if (player == null) + return null; + + return player.getInteracting(); + } + + @Override + public Dimension render(Graphics2D graphics) + { + Actor opponent = getOpponent(); + + if (opponent == null) + return null; + + int cur = opponent.getHealth(); + int max = opponent.getMaxHealth(); + + FontMetrics fm = graphics.getFontMetrics(); + + int height = TOP_BORDER + + fm.getHeight(); // opponent name + if (max > 0) + height += 1 // between name and hp bar + + BAR_HEIGHT; // bar + height += BOTTOM_BORDER; + + graphics.setColor(BACKGROUND); + graphics.fillRect(0, 0, WIDTH, height); + + String str = opponent.getName(); + + int x = (WIDTH - fm.stringWidth(str)) / 2; + graphics.setColor(Color.white); + graphics.drawString(str, x, fm.getHeight() + TOP_BORDER); + + // hp bar + + if (max > 0) + { + float percent = (float) cur / (float) max; + if (percent > 100f) + percent = 100f; + + int barWidth = (int) (percent * (float) BAR_WIDTH); + int barY = TOP_BORDER + fm.getHeight() + 1; + + graphics.setColor(HP_GREEN); + graphics.fillRect((WIDTH - BAR_WIDTH) / 2, barY, barWidth, BAR_HEIGHT); + + graphics.setColor(HP_RED); + graphics.fillRect(((WIDTH - BAR_WIDTH) / 2) + barWidth, barY, BAR_WIDTH - barWidth, BAR_HEIGHT); + + str = cur + " / " + max; + x = (WIDTH - fm.stringWidth(str)) / 2; + graphics.setColor(Color.white); + graphics.drawString(str, x, barY + fm.getHeight()); + } + + return new Dimension(WIDTH, height); + } +} diff --git a/src/main/java/net/runelite/client/ui/Overlay.java b/src/main/java/net/runelite/client/ui/Overlay.java deleted file mode 100644 index 1763923856..0000000000 --- a/src/main/java/net/runelite/client/ui/Overlay.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.runelite.client.ui; - -import java.awt.Dimension; -import java.awt.image.BufferedImage; - -public class Overlay -{ - private BufferedImage image; // image to draw - private Dimension dimension; // dimension of visable overlay - private OverlayPosition position; // where to draw it - private OverlayPriority priority; // if multiple overlays exist in the same position, who wins - - public Overlay(BufferedImage image, OverlayPosition position, OverlayPriority priority) - { - this.image = image; - this.position = position; - this.priority = priority; - } - - public BufferedImage getImage() - { - return image; - } - - public void setImage(BufferedImage image) - { - this.image = image; - } - - public Dimension getDimension() - { - return dimension; - } - - public void setDimension(Dimension dimension) - { - this.dimension = dimension; - } - - public OverlayPosition getPosition() - { - return position; - } - - public void setPosition(OverlayPosition position) - { - this.position = position; - } - - public OverlayPriority getPriority() - { - return priority; - } - - public void setPriority(OverlayPriority priority) - { - this.priority = priority; - } -} diff --git a/src/main/java/net/runelite/client/ui/OverlayPosition.java b/src/main/java/net/runelite/client/ui/OverlayPosition.java deleted file mode 100644 index 45bda4106d..0000000000 --- a/src/main/java/net/runelite/client/ui/OverlayPosition.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.runelite.client.ui; - -public enum OverlayPosition -{ - TOP_LEFT; -} diff --git a/src/main/java/net/runelite/client/ui/OverlayRenderer.java b/src/main/java/net/runelite/client/ui/OverlayRenderer.java deleted file mode 100644 index 80253ad0dc..0000000000 --- a/src/main/java/net/runelite/client/ui/OverlayRenderer.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.runelite.client.ui; - -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.List; -import net.runelite.client.RuneLite; -import net.runelite.client.plugins.Plugin; - -public class OverlayRenderer -{ - private static final int TOP_LEFT_BORDER_TOP = 25; - private static final int TOP_LEFT_BORDER_LEFT = 10; - private static final int TOP_LEFT_PADDING = 10; - - public void render(Graphics graphics) - { - List overlays = new ArrayList<>(); - - for (Plugin plugin : RuneLite.getRunelite().getPluginManager().getPlugins()) - { - Overlay overlay = plugin.drawOverlay(); - if (overlay != null) - overlays.add(overlay); - } - - Overlay[] topLeft = overlays.stream().filter(o -> o.getPosition() == OverlayPosition.TOP_LEFT).sorted((o1, o2) -> o1.getPriority().compareTo(o2.getPriority())).toArray(s -> new Overlay[s]); - int y = TOP_LEFT_BORDER_TOP; - - for (Overlay overlay : topLeft) - { - BufferedImage image = overlay.getImage(); - Dimension dimension = overlay.getDimension(); - - graphics.drawImage(image, TOP_LEFT_BORDER_LEFT, y, null); - y += dimension.getHeight() + TOP_LEFT_PADDING; - } - } -} diff --git a/src/main/java/net/runelite/client/ui/overlay/Overlay.java b/src/main/java/net/runelite/client/ui/overlay/Overlay.java new file mode 100644 index 0000000000..ae65f34d8f --- /dev/null +++ b/src/main/java/net/runelite/client/ui/overlay/Overlay.java @@ -0,0 +1,38 @@ +package net.runelite.client.ui.overlay; + +import java.awt.Dimension; +import java.awt.Graphics2D; + +public abstract class Overlay +{ + private OverlayPosition position; // where to draw it + private OverlayPriority priority; // if multiple overlays exist in the same position, who wins + + public Overlay(OverlayPosition position, OverlayPriority priority) + { + this.position = position; + this.priority = priority; + } + + public OverlayPosition getPosition() + { + return position; + } + + public void setPosition(OverlayPosition position) + { + this.position = position; + } + + public OverlayPriority getPriority() + { + return priority; + } + + public void setPriority(OverlayPriority priority) + { + this.priority = priority; + } + + public abstract Dimension render(Graphics2D graphics); +} diff --git a/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java b/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java new file mode 100644 index 0000000000..accd8ff3e3 --- /dev/null +++ b/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java @@ -0,0 +1,6 @@ +package net.runelite.client.ui.overlay; + +public enum OverlayPosition +{ + TOP_LEFT; +} diff --git a/src/main/java/net/runelite/client/ui/OverlayPriority.java b/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java similarity index 56% rename from src/main/java/net/runelite/client/ui/OverlayPriority.java rename to src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java index f00b3acdf5..cd6253e907 100644 --- a/src/main/java/net/runelite/client/ui/OverlayPriority.java +++ b/src/main/java/net/runelite/client/ui/overlay/OverlayPriority.java @@ -1,4 +1,4 @@ -package net.runelite.client.ui; +package net.runelite.client.ui.overlay; public enum OverlayPriority { diff --git a/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java new file mode 100644 index 0000000000..420b4c5d51 --- /dev/null +++ b/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -0,0 +1,23 @@ +package net.runelite.client.ui.overlay; + +import java.awt.image.BufferedImage; +import net.runelite.client.RuneLite; +import net.runelite.client.plugins.Plugin; + +public class OverlayRenderer +{ + public void render(BufferedImage clientBuffer) + { + TopDownRenderer td = new TopDownRenderer(); + + for (Plugin plugin : RuneLite.getRunelite().getPluginManager().getPlugins()) + { + Overlay overlay = plugin.getOverlay(); + + if (overlay.getPosition() == OverlayPosition.TOP_LEFT) + td.add(overlay); + } + + td.render(clientBuffer); + } +} diff --git a/src/main/java/net/runelite/client/ui/overlay/TopDownRenderer.java b/src/main/java/net/runelite/client/ui/overlay/TopDownRenderer.java new file mode 100644 index 0000000000..22ed9d2c1e --- /dev/null +++ b/src/main/java/net/runelite/client/ui/overlay/TopDownRenderer.java @@ -0,0 +1,40 @@ +package net.runelite.client.ui.overlay; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; + +public class TopDownRenderer +{ + private static final int BORDER_TOP = 25; + private static final int BORDER_LEFT = 10; + private static final int PADDING = 10; + + private final List overlays = new ArrayList<>(); + + public void add(Overlay overlay) + { + overlays.add(overlay); + } + + public void render(BufferedImage clientBuffer) + { + overlays.sort((o1, o2) -> o2.getPriority().compareTo(o1.getPriority())); + int y = BORDER_TOP; + + for (Overlay overlay : overlays) + { + BufferedImage image = clientBuffer.getSubimage(BORDER_LEFT, y, clientBuffer.getWidth() - BORDER_LEFT, clientBuffer.getHeight() - y);//(int) dimension.getWidth(), (int) dimension.getHeight()); + Graphics2D graphics = image.createGraphics(); + Dimension dimension = overlay.render(graphics); + graphics.dispose(); + + if (dimension == null) + continue; + + y += dimension.getHeight() + PADDING; + } + } +} diff --git a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java index 1690db94a7..f15a40e029 100644 --- a/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java +++ b/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java @@ -4,28 +4,29 @@ import java.awt.Canvas; import java.awt.Graphics; import java.awt.image.BufferedImage; import net.runelite.client.RuneLite; -import net.runelite.client.ui.OverlayRenderer; +import net.runelite.client.ui.overlay.OverlayRenderer; public class RSCanvasCallback { - private final BufferedImage clientBuffer = new BufferedImage(756, 503, BufferedImage.TYPE_INT_RGB); - private final BufferedImage gameBuffer = new BufferedImage(756, 503, BufferedImage.TYPE_INT_RGB); + private final BufferedImage clientBuffer = new BufferedImage(765, 503, BufferedImage.TYPE_INT_RGB); + private final BufferedImage gameBuffer = new BufferedImage(765, 503, BufferedImage.TYPE_INT_RGB); public Graphics getGraphics(Canvas canvas, Graphics superGraphics) { Graphics clientGraphics = clientBuffer.getGraphics(); clientGraphics.drawImage(gameBuffer, 0, 0, null); + clientGraphics.dispose(); RuneLite runelite = RuneLite.getRunelite(); if (runelite != null) { OverlayRenderer renderer = runelite.getRenderer(); if (renderer != null) - renderer.render(clientGraphics); + { + renderer.render(clientBuffer); + } } - clientGraphics.dispose(); - superGraphics.drawImage(clientBuffer, 0, 0, null); return gameBuffer.getGraphics(); From e2a6cc88a1c7763b6c18e823d6a57a5fc2f13ee7 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 24 Apr 2016 13:13:31 -0400 Subject: [PATCH 13/15] Set update policy on the runelite repo directly. It appears this doesn't work on releases though. Use developer-mode switch. --- .../net/runelite/client/ArtifactResolver.java | 5 +++-- .../net/runelite/client/ClientLoader.java | 19 ++++++++++++++++--- .../java/net/runelite/client/RuneLite.java | 7 ++++++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/runelite/client/ArtifactResolver.java b/src/main/java/net/runelite/client/ArtifactResolver.java index 1ba48130e9..47a4927cf8 100644 --- a/src/main/java/net/runelite/client/ArtifactResolver.java +++ b/src/main/java/net/runelite/client/ArtifactResolver.java @@ -60,7 +60,6 @@ public class ArtifactResolver LocalRepository localRepo = new LocalRepository(repositoryCache.getAbsolutePath()); session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); - session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS); // this causes a refetch of maven-metadata.xml, but not any binaries //session.setTransferListener(new ConsoleTransferListener()); //session.setRepositoryListener(new ConsoleRepositoryListener()); @@ -99,7 +98,9 @@ public class ArtifactResolver public RemoteRepository newRuneliteRepository() { - return new RemoteRepository.Builder("runelite", "default", "http://repo.runelite.net/").build(); + return new RemoteRepository.Builder("runelite", "default", "http://repo.runelite.net/") + .setPolicy(new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_FAIL)) + .build(); } private void validate(List artifacts) diff --git a/src/main/java/net/runelite/client/ClientLoader.java b/src/main/java/net/runelite/client/ClientLoader.java index cbe03338fa..082bbdb155 100644 --- a/src/main/java/net/runelite/client/ClientLoader.java +++ b/src/main/java/net/runelite/client/ClientLoader.java @@ -15,9 +15,13 @@ import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.aether.resolution.DependencyResolutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ClientLoader { + private static final Logger logger = LoggerFactory.getLogger(ClientLoader.class); + private static final String CLIENT_ARTIFACT_URL = "https://static.runelite.net/client.json"; public Applet load() throws MalformedURLException, ClassNotFoundException, IOException, InstantiationException, IllegalAccessException, DependencyResolutionException @@ -26,9 +30,18 @@ public class ClientLoader config.fetch(); - // the only thing resolved here is the injected client, which has no dependencies, so no need to switch developer mode - ArtifactResolver resolver = new ArtifactResolver(RuneLite.REPO_DIR); - resolver.addRepositories(); + ArtifactResolver resolver; + if (!RuneLite.getOptions().has("developer-mode")) + { + resolver = new ArtifactResolver(RuneLite.REPO_DIR); + resolver.addRepositories(); + } + else + { + resolver = new ArtifactResolver(new File(System.getProperty("user.home"), ".m2/repository")); + + logger.info("In developer mode, not fetching updates for client"); + } List results = resolver.resolveArtifacts(getClientArtifact()); File client = results.get(0).getArtifact().getFile(); diff --git a/src/main/java/net/runelite/client/RuneLite.java b/src/main/java/net/runelite/client/RuneLite.java index 1876db9c93..b737cb1b1f 100644 --- a/src/main/java/net/runelite/client/RuneLite.java +++ b/src/main/java/net/runelite/client/RuneLite.java @@ -14,7 +14,7 @@ public class RuneLite public static final File RUNELITE_DIR = new File(System.getProperty("user.home"), ".runelite"); public static final File REPO_DIR = new File(RUNELITE_DIR, "repository"); - public static OptionSet options; + private static OptionSet options; private static Client client; private static RuneLite runelite; @@ -67,4 +67,9 @@ public class RuneLite { return renderer; } + + public static OptionSet getOptions() + { + return options; + } } From 74173834daf4b665dd5cb89dafd4a22af10b6a4c Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 24 Apr 2016 17:34:22 -0400 Subject: [PATCH 14/15] Add a hard dependency on injected client instead of using artifact resolver --- pom.xml | 47 +++---- .../net/runelite/client/ArtifactResolver.java | 119 ------------------ .../net/runelite/client/ClientLoader.java | 50 +------- 3 files changed, 18 insertions(+), 198 deletions(-) delete mode 100644 src/main/java/net/runelite/client/ArtifactResolver.java diff --git a/pom.xml b/pom.xml index b7d45b4bd0..aac069cc65 100644 --- a/pom.xml +++ b/pom.xml @@ -11,9 +11,9 @@ 1.8 1.8 + 113-SNAPSHOT + 1.7.12 - 1.1.0 - 3.1.0 @@ -23,6 +23,14 @@ + + + runelite + RuneLite + http://repo.runelite.net + + + org.slf4j @@ -34,36 +42,6 @@ slf4j-simple ${slf4j.version} - - org.eclipse.aether - aether-api - ${aether.version} - - - org.eclipse.aether - aether-impl - ${aether.version} - - - org.eclipse.aether - aether-connector-basic - ${aether.version} - - - org.eclipse.aether - aether-transport-http - ${aether.version} - - - org.apache.maven - maven-aether-provider - ${maven.version} - - - com.google.code.gson - gson - 2.4 - net.sf.jopt-simple jopt-simple @@ -75,6 +53,11 @@ api 1.0.0-SNAPSHOT + + net.runelite.rs + client + ${rs.version} + junit diff --git a/src/main/java/net/runelite/client/ArtifactResolver.java b/src/main/java/net/runelite/client/ArtifactResolver.java deleted file mode 100644 index 47a4927cf8..0000000000 --- a/src/main/java/net/runelite/client/ArtifactResolver.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.runelite.client; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import org.apache.maven.repository.internal.MavenRepositorySystemUtils; -import org.eclipse.aether.DefaultRepositorySystemSession; -import org.eclipse.aether.RepositorySystem; -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.collection.CollectRequest; -import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.graph.DependencyFilter; -import org.eclipse.aether.impl.DefaultServiceLocator; -import org.eclipse.aether.repository.LocalRepository; -import org.eclipse.aether.repository.RemoteRepository; -import org.eclipse.aether.repository.RepositoryPolicy; -import org.eclipse.aether.resolution.ArtifactResult; -import org.eclipse.aether.resolution.DependencyRequest; -import org.eclipse.aether.resolution.DependencyResolutionException; -import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; -import org.eclipse.aether.spi.connector.transport.TransporterFactory; -import org.eclipse.aether.transport.http.HttpTransporterFactory; -import org.eclipse.aether.util.artifact.JavaScopes; -import org.eclipse.aether.util.filter.DependencyFilterUtils; - -public class ArtifactResolver -{ - private final File repositoryCache; - private final List repositories = new ArrayList<>(); - - public ArtifactResolver(File repositoryCache) - { - this.repositoryCache = repositoryCache; - } - - public List resolveArtifacts(Artifact artifact) throws DependencyResolutionException - { - RepositorySystem system = newRepositorySystem(); - - RepositorySystemSession session = newRepositorySystemSession(system); - - DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE); - - CollectRequest collectRequest = new CollectRequest(); - collectRequest.setRoot(new Dependency(artifact, JavaScopes.COMPILE)); - collectRequest.setRepositories(repositories); - - DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, classpathFlter); - - List results = system.resolveDependencies(session, dependencyRequest).getArtifactResults(); - validate(results); - return results; - } - - public DefaultRepositorySystemSession newRepositorySystemSession(RepositorySystem system) - { - DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); - - LocalRepository localRepo = new LocalRepository(repositoryCache.getAbsolutePath()); - session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo)); - - //session.setTransferListener(new ConsoleTransferListener()); - //session.setRepositoryListener(new ConsoleRepositoryListener()); - - return session; - } - - public RepositorySystem newRepositorySystem() - { - DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); - locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); - locator.addService(TransporterFactory.class, HttpTransporterFactory.class); - - locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler() - { - @Override - public void serviceCreationFailed(Class type, Class impl, Throwable exception) - { - exception.printStackTrace(); - } - }); - - return locator.getService(RepositorySystem.class); - } - - public void addRepositories() - { - repositories.add(this.newCentralRepository()); - repositories.add(this.newRuneliteRepository()); - } - - private RemoteRepository newCentralRepository() - { - return new RemoteRepository.Builder("central", "default", "http://central.maven.org/maven2/").build(); - } - - public RemoteRepository newRuneliteRepository() - { - return new RemoteRepository.Builder("runelite", "default", "http://repo.runelite.net/") - .setPolicy(new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_FAIL)) - .build(); - } - - private void validate(List artifacts) - { - for (ArtifactResult ar : artifacts) - { - Artifact a = ar.getArtifact(); - - if (!a.getGroupId().startsWith("net.runelite")) - continue; - - if (ar.getRepository() instanceof RemoteRepository && !ar.getRepository().equals(newRuneliteRepository())) - throw new RuntimeException(); - } - } -} diff --git a/src/main/java/net/runelite/client/ClientLoader.java b/src/main/java/net/runelite/client/ClientLoader.java index 082bbdb155..09e1ea8b36 100644 --- a/src/main/java/net/runelite/client/ClientLoader.java +++ b/src/main/java/net/runelite/client/ClientLoader.java @@ -1,20 +1,8 @@ package net.runelite.client; -import com.google.gson.Gson; import java.applet.Applet; -import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.URLConnection; -import java.util.List; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.resolution.ArtifactResult; -import org.eclipse.aether.resolution.DependencyResolutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,51 +10,19 @@ public class ClientLoader { private static final Logger logger = LoggerFactory.getLogger(ClientLoader.class); - private static final String CLIENT_ARTIFACT_URL = "https://static.runelite.net/client.json"; - - public Applet load() throws MalformedURLException, ClassNotFoundException, IOException, InstantiationException, IllegalAccessException, DependencyResolutionException + public Applet load() throws MalformedURLException, ClassNotFoundException, IOException, InstantiationException, IllegalAccessException { ConfigLoader config = new ConfigLoader(); config.fetch(); - - ArtifactResolver resolver; - if (!RuneLite.getOptions().has("developer-mode")) - { - resolver = new ArtifactResolver(RuneLite.REPO_DIR); - resolver.addRepositories(); - } - else - { - resolver = new ArtifactResolver(new File(System.getProperty("user.home"), ".m2/repository")); - - logger.info("In developer mode, not fetching updates for client"); - } - - List results = resolver.resolveArtifacts(getClientArtifact()); - File client = results.get(0).getArtifact().getFile(); - + String initialClass = config.getProperty(ConfigLoader.INITIAL_CLASS).replace(".class", ""); - URLClassLoader loader = new URLClassLoader(new URL[]{ client.toURI().toURL() }, this.getClass().getClassLoader()); - Class clientClass = loader.loadClass(initialClass); - + Class clientClass = this.getClass().getClassLoader().loadClass(initialClass); Applet rs = (Applet) clientClass.newInstance(); rs.setStub(new RSStub(config, rs)); return rs; } - - private static Artifact getClientArtifact() throws MalformedURLException, IOException - { - URL u = new URL(CLIENT_ARTIFACT_URL); - URLConnection conn = u.openConnection(); - conn.setRequestProperty("User-Agent", "Mozilla/5.0"); - try (InputStream i = conn.getInputStream()) - { - Gson g = new Gson(); - return g.fromJson(new InputStreamReader(i), DefaultArtifact.class); - } - } } From 235c44e5253d81e269433c286d9c923e4a06c51f Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 24 Apr 2016 17:34:31 -0400 Subject: [PATCH 15/15] Only show boosts when logged in --- .../net/runelite/client/plugins/boosts/BoostsOverlay.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java b/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java index 7f18b24936..f536d7078c 100644 --- a/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java +++ b/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java @@ -5,6 +5,7 @@ import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; import net.runelite.api.Client; +import net.runelite.api.GameState; import net.runelite.api.Skill; import net.runelite.client.RuneLite; import net.runelite.client.ui.overlay.Overlay; @@ -34,6 +35,10 @@ class BoostsOverlay extends Overlay public Dimension render(Graphics2D graphics) { Client client = RuneLite.getClient(); + + if (client.getGameState() != GameState.LOGGED_IN) + return null; + FontMetrics metrics = graphics.getFontMetrics(); int[] boostedSkills = client.getBoostedSkillLevels(),