From 2ba1c7f80bc478b67bf235f7f7c5378ab42c2bb3 Mon Sep 17 00:00:00 2001 From: ThatGamerBlue Date: Sat, 27 Jul 2019 20:02:57 +0100 Subject: [PATCH] gradle: add properties and modify injected-client (#1145) * add implementation for getItemCount * Ignore build directory in project root * save injector results as class files * package injected-client for shading into client * auto-updating properties * fix run task * shade injected-client into jar --- .gitignore | 2 +- build.gradle | 38 ++++++ cache/build.gradle | 5 - deobfuscator/build.gradle | 7 +- http-api/build.gradle | 12 ++ .../net/runelite/http/api/RuneLiteAPI.java | 67 +++------- .../src/main/resources/runelite.properties | 8 +- injected-client/build.gradle | 52 +++++++- .../src/main/java/Placeholder.java | 34 +++++ injector-plugin/build.gradle | 16 +-- .../java/net/runelite/injector/Injector.java | 11 +- runelite-client/build.gradle | 3 + .../net/runelite/client/rs/ClientLoader.java | 123 +++++------------- .../java/net/runelite/rs/api/RSClient.java | 3 + 14 files changed, 209 insertions(+), 172 deletions(-) create mode 100644 injected-client/src/main/java/Placeholder.java diff --git a/.gitignore b/.gitignore index 8d06d7383a..3ce4787a8b 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ classes/artifacts/client_jar/run.bat classes/artifacts/client_jar/client.jar *.jar .live/ -*/build/ +**/build/* */out/ .gradle/ runelite-client/src/main/resources/runelite/* diff --git a/build.gradle b/build.gradle index fa5376d11f..e091d60949 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,44 @@ +buildscript { + repositories { + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + classpath "org.ajoberstar.grgit:grgit-gradle:3.1.1" + } +} + plugins { id "com.github.ben-manes.versions" version "0.21.0" id "com.gradle.build-scan" version "2.3" } +apply plugin: 'application' + +ext { + grgit = org.ajoberstar.grgit.Grgit.open(dir: '.') + localGitCommit = grgit.head().id + localGitCommitShort = grgit.head().getAbbreviatedId(7) + localGitDirty = !grgit.status().clean +} + allprojects { apply plugin: 'maven' apply plugin: 'checkstyle' + ext { + rsversion = 181 + cacheversion = 165 + + gitCommit = localGitCommit + gitCommitShort = localGitCommitShort + gitDirty = localGitDirty + + rootPath = rootDir.toString().replace('\\', '/') + injectedClassesPath = rootPath + "/injector-plugin/out/injected-client/" + } + group = 'net.runelite' version = '1.5.30-SNAPSHOT' @@ -55,3 +87,9 @@ wrapper { batchScript.write batchScript.text.replace("set $optsEnvVar=\"-Xmx64m\" \"-Xms64m\"", "set $optsEnvVar=\"-Xmx4g\" \"-Xms2g\" \"-Dfile.encoding=UTF-8\"") } } + +run { + classpath = childProjects.client.sourceSets.main.runtimeClasspath + mainClassName = "net.runelite.client.RuneLite" + args += "--local-injected" +} diff --git a/cache/build.gradle b/cache/build.gradle index feb7177b2d..36479e9ab4 100644 --- a/cache/build.gradle +++ b/cache/build.gradle @@ -22,11 +22,6 @@ dependencies { annotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.8' } -ext { - rsversion = 181 - cacheversion = 165 -} - test { exclude '**/TitleDumper*' } diff --git a/deobfuscator/build.gradle b/deobfuscator/build.gradle index bee405515d..3142757b1c 100644 --- a/deobfuscator/build.gradle +++ b/deobfuscator/build.gradle @@ -6,10 +6,9 @@ plugins { description = 'Deobfuscator' -def osrsRevision = 181 def rootPath = project.rootDir.toString().replace('\\', '/') def deobfuscatedJar = "${rootPath}/runescape-client/build/libs/rs-client-${project.version}.jar" -def vanillaJar = "${rootPath}/injector-plugin/vanilla-${osrsRevision}.jar" +def vanillaJar = "${rootPath}/injector-plugin/vanilla-${rsversion}.jar" dependencies { implementation project(':runelite-api') @@ -26,10 +25,6 @@ dependencies { testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.0.0' } -ext { - rsversion = 181 -} - processTestResources { from file("src/test/resources/deob-test.properties"), { filter(ReplaceTokens, tokens: [ diff --git a/http-api/build.gradle b/http-api/build.gradle index 7707e42c95..2576fa7122 100644 --- a/http-api/build.gradle +++ b/http-api/build.gradle @@ -1,3 +1,4 @@ +import org.apache.tools.ant.filters.ReplaceTokens description = 'Web API' dependencies { implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.0.1' @@ -11,3 +12,14 @@ dependencies { compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.8' annotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.8' } + +processResources { + from file("src/main/resources/runelite.properties"), { + filter(ReplaceTokens, tokens: [ + "projectver": project.version, + "rsver": rsversion.toString(), + "gitcommit": gitCommitShort, + "gitdirty": gitDirty.toString() + ]) + } +} \ No newline at end of file diff --git a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java index d31c235abf..2687df25cf 100644 --- a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java +++ b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java @@ -45,7 +45,6 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Properties; @@ -53,9 +52,9 @@ import java.util.concurrent.TimeUnit; public class RuneLiteAPI { - public static final String buildCommit = "6fe334c02648d3f8b38625e3175e3f547d54aa37"; - private static final String version = "1.5.30-SNAPSHOT"; - private static final int rsVersion = 181; + private static String version; + private static String upstreamVersion; + private static int rsVersion; public static final String RUNELITE_AUTH = "RUNELITE-AUTH"; public static final OkHttpClient CLIENT; @@ -63,13 +62,12 @@ public class RuneLiteAPI public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static final Logger logger = LoggerFactory.getLogger(RuneLiteAPI.class); private static final String BASE = "https://api.runelite.net"; - private static final String PLUS_BASE = "https://api.runelitepl.us"; - private static final String RLPLUS = "https://session.runelitepl.us"; + private static final String RLPLUS_BASE = "https://api.runelitepl.us"; + private static final String RLPLUS_SESSION = "https://session.runelitepl.us"; private static final String WSBASE = "https://api.runelite.net/ws"; private static final String STATICBASE = "https://static.runelite.net"; private static final String MAVEN_METADATA = "http://repo.runelite.net/net/runelite/runelite-parent/maven-metadata.xml"; - private static final String GITHUB_API = "https://api.github.com/repos/runelite/runelite/commits/master"; private static final String ALPHA_NUMERIC_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; private static final Properties properties = new Properties(); private static String userAgent; @@ -83,15 +81,18 @@ public class RuneLiteAPI properties.load(in); parseMavenVersion(); - String commit = buildCommit; - String rlpCommit = ""; - boolean dirty = false; + rsVersion = Integer.parseInt(properties.getProperty("rs.version")); + String commit = randomAlphaNumeric(7); + String rlpCommit = properties.getProperty("runelite.commit"); + boolean dirty = Boolean.parseBoolean(properties.getProperty("runelite.dirty")); + version = properties.getProperty("runelite.version"); - userAgent = "RuneLite/" + version + "-" + commit + (dirty ? "+" : ""); - rlpUserAgent = "RuneLite/" + version + "-" + rlpCommit + (dirty ? "+" : ""); + userAgent = "RuneLite/" + upstreamVersion + "-" + commit + (dirty ? "+" : ""); + rlpUserAgent = "RuneLitePlus/" + version + "-" + rlpCommit + (dirty ? "+" : ""); } catch (NumberFormatException e) { + e.printStackTrace(); throw new RuntimeException("Version string has not been substituted; Re-run maven"); } catch (IOException ex) @@ -150,7 +151,7 @@ public class RuneLiteAPI public static HttpUrl getRuneLitePlusSessionBase() { - return HttpUrl.parse(RLPLUS); + return HttpUrl.parse(RLPLUS_SESSION); } public static HttpUrl getApiBase() @@ -167,7 +168,7 @@ public class RuneLiteAPI public static HttpUrl getPlusApiBase() { - return HttpUrl.parse(PLUS_BASE + "/runelite-" + getRlpVersion()); + return HttpUrl.parse(RLPLUS_BASE + "/runelite-" + getRlpVersion()); } public static HttpUrl getStaticBase() @@ -199,11 +200,6 @@ public class RuneLiteAPI return version; } - public static void setVersion(String version) - { - //RuneLiteAPI.version = version; - } - public static int getRsVersion() { return rsVersion; @@ -256,7 +252,7 @@ public class RuneLiteAPI Node node = versionList.item(i); if (node.getTextContent() != null) { - //version = node.getTextContent(); + upstreamVersion = node.getTextContent(); } } } @@ -266,37 +262,6 @@ public class RuneLiteAPI } } - private static String parseGithubCommit() - { - try - { - byte[] commits = downloadUrl(new URL(GITHUB_API)); - - if (commits == null) - { - return null; - } - - String jsonData = new String(commits); - - for (String s : jsonData.split("\n")) - { - if (s.startsWith("\"sha\":")) - { - s = s.replace(",", ""); - s = s.replace(" ", ""); - s = s.replace("\"", ""); - return s.split(":")[1]; - } - } - } - catch (MalformedURLException e) - { - e.printStackTrace(); - } - return null; - } - private static String randomAlphaNumeric(int count) { StringBuilder builder = new StringBuilder(); diff --git a/http-api/src/main/resources/runelite.properties b/http-api/src/main/resources/runelite.properties index 4011664529..7eb618db7a 100644 --- a/http-api/src/main/resources/runelite.properties +++ b/http-api/src/main/resources/runelite.properties @@ -1,4 +1,4 @@ -runelite.version=${project.version} -rs.version=${rs.version} -runelite.commit=${git.commit.id.abbrev} -runelite.dirty=${git.dirty} \ No newline at end of file +runelite.version=@projectver@ +rs.version=@rsver@ +runelite.commit=@gitcommit@ +runelite.dirty=@gitdirty@ \ No newline at end of file diff --git a/injected-client/build.gradle b/injected-client/build.gradle index 2812e69f44..e73d2bd89c 100644 --- a/injected-client/build.gradle +++ b/injected-client/build.gradle @@ -1,5 +1,51 @@ +/* + * Copyright (c) 2019 ThatGamerBlue + * 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. + */ description = 'Injected Client' -dependencies { - implementation project(':rs-client') - implementation group: 'net.runelite.rs', name: 'vanilla', version: '181' + + + +def injectedClassesPath = "${rootPath}/injector-plugin/out/injected-client/" + +compileJava { + dependsOn ':injector-plugin:assemble' } + +compileJava.outputs.upToDateWhen { false } + +compileJava.doLast() { + copy { + File f = file("build/classes/java/main/injected-client") + f.deleteDir() + f.mkdirs() + from ("${injectedClassesPath}") + into ("build/classes/java/main/injected-client") + } +} + +classes.doLast() { + File f = file("build/classes/java/main/Placeholder.class") + f.delete() +} + diff --git a/injected-client/src/main/java/Placeholder.java b/injected-client/src/main/java/Placeholder.java new file mode 100644 index 0000000000..0e04b3710c --- /dev/null +++ b/injected-client/src/main/java/Placeholder.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2019 ThatGamerBlue + * 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. + */ + +/** + * @author ThatGamerBlue + * + * This file exists to force gradle to execute the compileJava task + * so we can hijack it and run the injector-plugin + */ +public class Placeholder +{ +} diff --git a/injector-plugin/build.gradle b/injector-plugin/build.gradle index 8e302e4557..745807236e 100644 --- a/injector-plugin/build.gradle +++ b/injector-plugin/build.gradle @@ -1,12 +1,11 @@ group = 'net.runelite.rs' description = 'Injector' -def osrsRevision = 181 -def rootPath = project.rootDir.toString().replace('\\', '/') -def buildPath = project.buildDir.toString().replace('\\', '/') +def buildPath = buildDir.toString().replace('\\', '/') // this doesnt work in an ext block for some reason + def deobfuscatedJar = "${rootPath}/runescape-client/build/libs/rs-client-${project.version}.jar" -def vanillaJar = "${buildPath}/vanilla-${osrsRevision}.jar" -def injectedJar = "${rootPath}/injected-client/build/libs/injected-client-${project.version}.jar" +def vanillaJar = "${buildPath}/vanilla-${rsversion}.jar" + configurations { vanilla @@ -17,7 +16,6 @@ dependencies { implementation project(':mixins') implementation project(':runelite-api') implementation project(':runescape-api') - implementation project(':injected-client') implementation group: 'com.google.guava', name: 'guava', version: '28.0-jre' implementation group: 'org.apache.maven', name: 'maven-plugin-api', version: '3.6.1' implementation group: 'org.ow2.asm', name: 'asm-debug-all', version: '5.2' @@ -26,14 +24,14 @@ dependencies { testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.0.0' compileOnly group: 'org.apache.maven.plugin-tools', name: 'maven-plugin-annotations', version: '3.6.0' annotationProcessor group: 'org.eclipse.sisu', name: 'org.eclipse.sisu.inject', version: '0.3.3' - vanilla "net.runelite.rs:vanilla:"+osrsRevision + vanilla "net.runelite.rs:vanilla:${rsversion}" } compileJava { dependsOn ":rs-client:build" } -compileJava.outputs.upToDateWhen {false} +compileJava.outputs.upToDateWhen { false } compileJava.doLast() { copy { @@ -46,7 +44,7 @@ compileJava.doLast() { String[] jarPaths = [ deobfuscatedJar.toString(), vanillaJar.toString(), - injectedJar.toString() + injectedClassesPath.toString() ] inject.main(jarPaths) } diff --git a/injector-plugin/src/main/java/net/runelite/injector/Injector.java b/injector-plugin/src/main/java/net/runelite/injector/Injector.java index 9409b02075..4543ed5b46 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/Injector.java +++ b/injector-plugin/src/main/java/net/runelite/injector/Injector.java @@ -26,6 +26,9 @@ package net.runelite.injector; import java.io.File; import java.io.IOException; + +import com.google.common.io.Files; +import net.runelite.asm.ClassFile; import net.runelite.asm.ClassGroup; import net.runelite.deob.util.JarUtil; @@ -69,7 +72,13 @@ public class Injector private void save(File out) throws IOException { - JarUtil.saveJar(vanilla, out); + out.mkdirs(); + for (ClassFile cf : vanilla.getClasses()) + { + File f = new File(out, cf.getClassName() + ".class"); + byte[] data = JarUtil.writeClass(vanilla, cf); + Files.write(data, f); + } } diff --git a/runelite-client/build.gradle b/runelite-client/build.gradle index fd75485269..02fa592477 100644 --- a/runelite-client/build.gradle +++ b/runelite-client/build.gradle @@ -45,6 +45,7 @@ dependencies { runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: '2.3.2', classifier: 'natives-linux-amd64' runtime group: 'org.jogamp.gluegen', name: 'gluegen-rt', version: '2.3.2', classifier: 'natives-linux-i586' runtime project(':runescape-api') + runtime project(':injected-client') testImplementation group: 'junit', name: 'junit', version: '4.12' testImplementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.26' testImplementation group: 'org.hamcrest', name: 'hamcrest-library', version: '2.1' @@ -72,6 +73,8 @@ jar { shadowJar { archiveClassifier.set("shaded") + + exclude("net/runelite/injector/**") } tasks.build.dependsOn tasks.shadowJar \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index ca04dbc648..8dc0942bd4 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -26,29 +26,23 @@ */ package net.runelite.client.rs; -import java.applet.Applet; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.URLConnection; +import com.google.common.io.ByteStreams; +import lombok.extern.slf4j.Slf4j; + import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import lombok.extern.slf4j.Slf4j; -import net.runelite.client.RuneLite; -import net.runelite.http.api.RuneLiteAPI; +import java.applet.Applet; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLClassLoader; @Slf4j @Singleton public class ClientLoader { public static boolean useLocalInjected = false; - public static boolean usePrivateServer = false; private final ClientConfigLoader clientConfigLoader; private final ClientUpdateCheckMode updateCheckMode; @@ -61,69 +55,39 @@ public class ClientLoader this.clientConfigLoader = clientConfigLoader; } - private static Applet loadRLPlus(final RSConfig config) throws ClassNotFoundException, InstantiationException, IllegalAccessException + private static Applet loadRLPlus(final RSConfig config) + throws ClassNotFoundException, InstantiationException, IllegalAccessException { - if (useLocalInjected) + ClassLoader rsClassLoader = new ClassLoader(ClientLoader.class.getClassLoader()) { - try + @Override + protected Class findClass(String name) throws ClassNotFoundException { - URL localInjected = new File("./injected-client/build/libs/injected-client-" + RuneLiteAPI.getVersion() + ".jar").toURI().toURL(); - log.info("Using local injected-client"); - URLClassLoader classLoader = new URLClassLoader(new URL[]{localInjected}); - Class clientClass = classLoader.loadClass("client"); - return loadFromClass(config, clientClass); - } - catch (MalformedURLException e) - { - e.printStackTrace(); - } - } - - try - { - File cachedInjected = new File(RuneLite.RUNELITE_DIR + "/injected-client-" + RuneLiteAPI.getVersion() + ".jar"); - URL remoteInjected = new URL("https://github.com/runelite-extended/maven-repo/raw/master/live/injected-client-" + RuneLiteAPI.getVersion() + ".jar"); - int remoteSize = getFileSize(remoteInjected); - URL cachedInjectedURL = cachedInjected.toURI().toURL(); - int cachedSize = 0; - if (cachedInjected.exists()) - { - cachedSize = getFileSize(cachedInjectedURL); - } - - if (remoteSize != cachedSize) - { - log.info("Injected-client size mismatch, updating."); - try (BufferedInputStream in = new BufferedInputStream(remoteInjected.openStream())) + String path = "/injected-client/".concat(name.replace('.', '/')).concat(".class"); + InputStream inputStream = ClientLoader.class.getResourceAsStream(path); + if (inputStream == null) { - FileOutputStream fileOutputStream = new FileOutputStream(cachedInjected); - byte[] dataBuffer = new byte[1024]; - int bytesRead; - while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) - { - fileOutputStream.write(dataBuffer, 0, bytesRead); - } + throw new ClassNotFoundException(name + " " + path); + } + byte[] data; + try + { + data = ByteStreams.toByteArray(inputStream); } catch (IOException e) { e.printStackTrace(); + throw new RuntimeException("Failed to load class: " + name + " " + path); } - + return defineClass(name, data, 0, data.length); } - URLClassLoader classLoader = new URLClassLoader(new URL[]{cachedInjectedURL}, RuneLite.class.getClassLoader()); - Class clientClass = classLoader.loadClass("client"); - return loadFromClass(config, clientClass); - } - catch (IOException e) - { - e.printStackTrace(); - } - - log.error("Failed to load injected-client!"); - return null; + }; + Class clientClass = rsClassLoader.loadClass("client"); + return loadFromClass(config, clientClass); } - private static Applet loadVanilla(final RSConfig config) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException + private static Applet loadVanilla(final RSConfig config) + throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { final String codebase = config.getCodeBase(); final String initialJar = config.getInitialJar(); @@ -137,39 +101,14 @@ public class ClientLoader return loadFromClass(config, clientClass); } - private static Applet loadFromClass(final RSConfig config, final Class clientClass) throws IllegalAccessException, InstantiationException + private static Applet loadFromClass(final RSConfig config, final Class clientClass) + throws IllegalAccessException, InstantiationException { final Applet rs = (Applet) clientClass.newInstance(); rs.setStub(new RSAppletStub(config)); return rs; } - private static int getFileSize(URL url) - { - URLConnection conn = null; - try - { - conn = url.openConnection(); - if (conn instanceof HttpURLConnection) - { - ((HttpURLConnection) conn).setRequestMethod("HEAD"); - } - conn.getInputStream(); - return conn.getContentLength(); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - finally - { - if (conn instanceof HttpURLConnection) - { - ((HttpURLConnection) conn).disconnect(); - } - } - } - public Applet load() { try diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 3f6be7a2b3..259200b484 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -1045,4 +1045,7 @@ public interface RSClient extends RSGameShell, Client BigInteger getModulus(); void setModulus(BigInteger modulus); + + @Import("ItemDefinition_fileCount") + int getItemCount(); }