Merge remote-tracking branch 'upstream/master' into 2009-merge
This commit is contained in:
12
build.gradle
12
build.gradle
@@ -32,7 +32,7 @@ ext {
|
|||||||
apacheCommonsCompress = '1.19'
|
apacheCommonsCompress = '1.19'
|
||||||
apacheCommonsCsv = '1.7'
|
apacheCommonsCsv = '1.7'
|
||||||
apacheCommonsText = '1.8'
|
apacheCommonsText = '1.8'
|
||||||
asm = '7.1'
|
asm = '7.2'
|
||||||
commonsCli = '1.4'
|
commonsCli = '1.4'
|
||||||
discord = '1.1'
|
discord = '1.1'
|
||||||
fernflower = '07082019'
|
fernflower = '07082019'
|
||||||
@@ -43,7 +43,7 @@ ext {
|
|||||||
h2 = '1.4.199'
|
h2 = '1.4.199'
|
||||||
hamcrest = '2.1'
|
hamcrest = '2.1'
|
||||||
httpcore = '4.4.12'
|
httpcore = '4.4.12'
|
||||||
httpmime = '4.5.9'
|
httpmime = '4.5.10'
|
||||||
javassist = '3.25.0-GA'
|
javassist = '3.25.0-GA'
|
||||||
javax = '1.3.2'
|
javax = '1.3.2'
|
||||||
javaxInject = '1'
|
javaxInject = '1'
|
||||||
@@ -59,15 +59,15 @@ ext {
|
|||||||
jupiter = '5.5.2'
|
jupiter = '5.5.2'
|
||||||
logback = '1.2.3'
|
logback = '1.2.3'
|
||||||
lombok = '1.18.10'
|
lombok = '1.18.10'
|
||||||
mapstruct = '1.3.0.Final'
|
mapstruct = '1.3.1.Final'
|
||||||
mariadbJdbc = '2.4.4'
|
mariadbJdbc = '2.4.4'
|
||||||
mavenPluginAnnotations = '3.6.0'
|
mavenPluginAnnotations = '3.6.0'
|
||||||
mavenPluginApi = '3.6.2'
|
mavenPluginApi = '3.6.2'
|
||||||
minio = '6.0.11'
|
minio = '6.0.11'
|
||||||
mockito = '3.0.0'
|
mockito = '3.1.0'
|
||||||
mongodbDriverSync = '3.11.0'
|
mongodbDriverSync = '3.11.0'
|
||||||
mysqlConnectorJava = '8.0.17'
|
mysqlConnectorJava = '8.0.17'
|
||||||
netty = '4.1.39.Final'
|
netty = '4.1.42.Final'
|
||||||
okhttp3 = '4.2.0'
|
okhttp3 = '4.2.0'
|
||||||
orangeExtensions = '1.0'
|
orangeExtensions = '1.0'
|
||||||
petitparser = '2.2.0'
|
petitparser = '2.2.0'
|
||||||
@@ -77,7 +77,7 @@ ext {
|
|||||||
scribejava = '6.8.1'
|
scribejava = '6.8.1'
|
||||||
sisu = '0.3.3'
|
sisu = '0.3.3'
|
||||||
slf4j = '1.7.28'
|
slf4j = '1.7.28'
|
||||||
springJdbc = '5.1.9.RELEASE'
|
springJdbc = '5.2.0.RELEASE'
|
||||||
springboot = '2.1.8.RELEASE'
|
springboot = '2.1.8.RELEASE'
|
||||||
sql2o = '1.6.0'
|
sql2o = '1.6.0'
|
||||||
substance = '8.0.02'
|
substance = '8.0.02'
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
import org.apache.tools.ant.filters.ReplaceTokens
|
import org.apache.tools.ant.filters.ReplaceTokens
|
||||||
|
import org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler
|
||||||
|
import java.nio.file.Files
|
||||||
|
import java.nio.file.Paths
|
||||||
|
import java.util.zip.ZipFile
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id "com.github.hauner.jarTest" version "1.0.1"
|
id "com.github.hauner.jarTest" version "1.0.1"
|
||||||
@@ -6,6 +10,30 @@ plugins {
|
|||||||
|
|
||||||
description = 'Deobfuscator'
|
description = 'Deobfuscator'
|
||||||
|
|
||||||
|
def deobfuscatedJar = "${rootPath}/runescape-client/build/libs/rs-client-${project.version}.jar"
|
||||||
|
|
||||||
|
def unzipFile(String file, String dest)
|
||||||
|
{
|
||||||
|
def zipFile = new ZipFile(file)
|
||||||
|
|
||||||
|
zipFile.entries().each { it ->
|
||||||
|
def path = Paths.get(dest + File.separator + it.name)
|
||||||
|
if (it.directory)
|
||||||
|
{
|
||||||
|
Files.createDirectories(path)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
def parentDir = path.getParent()
|
||||||
|
if (!Files.exists(parentDir))
|
||||||
|
{
|
||||||
|
Files.createDirectories(parentDir)
|
||||||
|
}
|
||||||
|
Files.copy(zipFile.getInputStream(it), path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
deobjars
|
deobjars
|
||||||
}
|
}
|
||||||
@@ -48,3 +76,42 @@ processTestResources {
|
|||||||
])
|
])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
task gamepackUpdate {
|
||||||
|
dependsOn ":deobfuscator:build"
|
||||||
|
dependsOn ":rs-client:build"
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
def path = sourceSets.main.runtimeClasspath
|
||||||
|
def loader = new URLClassLoader(path.collect { f -> f.toURI().toURL() } as URL[])
|
||||||
|
def downloader = loader.loadClass('net.runelite.gamepack.Downloader')
|
||||||
|
def clientVersion = loader.loadClass('net.runelite.deob.clientver.ClientVersionMain')
|
||||||
|
def deob = loader.loadClass('net.runelite.deob.Deob')
|
||||||
|
def mappings = loader.loadClass('net.runelite.deob.updater.UpdateMappings')
|
||||||
|
|
||||||
|
String gamepack = downloader.gamepack()
|
||||||
|
int version = clientVersion.version(gamepack)
|
||||||
|
|
||||||
|
String gamepackVersion = gamepack.replace("gamepack.jar", "gamepack-" + version + ".jar")
|
||||||
|
String gamepackDeob = gamepack.replace("gamepack.jar", "gamepack-" + version + "-deob.jar")
|
||||||
|
String gamepackMappings = gamepack.replace("gamepack.jar", "gamepack-" + version + "-updated-mappings.jar")
|
||||||
|
String gamepackMappingsDecomp = gamepackMappings.replace(".jar", "-decomp")
|
||||||
|
String gamepackMappingsFern = gamepackMappingsDecomp + File.separator + gamepackMappings.split("/gamepack/")[1]
|
||||||
|
|
||||||
|
if (version == -1 || version == rsversion)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
deob.main(gamepackVersion, gamepackDeob)
|
||||||
|
mappings.main(deobfuscatedJar, gamepackDeob, gamepackMappings)
|
||||||
|
|
||||||
|
new File(gamepackMappingsDecomp).mkdirs()
|
||||||
|
ConsoleDecompiler.main(gamepackMappings, gamepackMappingsDecomp)
|
||||||
|
|
||||||
|
unzipFile(gamepackMappingsFern, gamepackMappingsDecomp)
|
||||||
|
new File(gamepackMappingsFern).delete()
|
||||||
|
|
||||||
|
loader.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public class VReturn extends Instruction implements ReturnInstruction
|
|||||||
public InstructionContext execute(Frame frame)
|
public InstructionContext execute(Frame frame)
|
||||||
{
|
{
|
||||||
InstructionContext ins = new InstructionContext(this, frame);
|
InstructionContext ins = new InstructionContext(this, frame);
|
||||||
|
|
||||||
|
|
||||||
frame.stop();
|
frame.stop();
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ import java.io.IOException;
|
|||||||
import net.runelite.asm.ClassGroup;
|
import net.runelite.asm.ClassGroup;
|
||||||
import net.runelite.asm.execution.Execution;
|
import net.runelite.asm.execution.Execution;
|
||||||
import net.runelite.deob.deobfuscators.CastNull;
|
import net.runelite.deob.deobfuscators.CastNull;
|
||||||
import net.runelite.deob.deobfuscators.StaticShouldBeInstance;
|
|
||||||
import net.runelite.deob.deobfuscators.constparam.ConstantParameter;
|
|
||||||
import net.runelite.deob.deobfuscators.EnumDeobfuscator;
|
import net.runelite.deob.deobfuscators.EnumDeobfuscator;
|
||||||
import net.runelite.deob.deobfuscators.FieldInliner;
|
import net.runelite.deob.deobfuscators.FieldInliner;
|
||||||
import net.runelite.deob.deobfuscators.IllegalStateExceptions;
|
import net.runelite.deob.deobfuscators.IllegalStateExceptions;
|
||||||
@@ -39,6 +37,7 @@ import net.runelite.deob.deobfuscators.Lvt;
|
|||||||
import net.runelite.deob.deobfuscators.Order;
|
import net.runelite.deob.deobfuscators.Order;
|
||||||
import net.runelite.deob.deobfuscators.RenameUnique;
|
import net.runelite.deob.deobfuscators.RenameUnique;
|
||||||
import net.runelite.deob.deobfuscators.RuntimeExceptions;
|
import net.runelite.deob.deobfuscators.RuntimeExceptions;
|
||||||
|
import net.runelite.deob.deobfuscators.StaticShouldBeInstance;
|
||||||
import net.runelite.deob.deobfuscators.UnreachedCode;
|
import net.runelite.deob.deobfuscators.UnreachedCode;
|
||||||
import net.runelite.deob.deobfuscators.UnusedClass;
|
import net.runelite.deob.deobfuscators.UnusedClass;
|
||||||
import net.runelite.deob.deobfuscators.UnusedFields;
|
import net.runelite.deob.deobfuscators.UnusedFields;
|
||||||
@@ -49,6 +48,7 @@ import net.runelite.deob.deobfuscators.arithmetic.MultiplicationDeobfuscator;
|
|||||||
import net.runelite.deob.deobfuscators.arithmetic.MultiplyOneDeobfuscator;
|
import net.runelite.deob.deobfuscators.arithmetic.MultiplyOneDeobfuscator;
|
||||||
import net.runelite.deob.deobfuscators.arithmetic.MultiplyZeroDeobfuscator;
|
import net.runelite.deob.deobfuscators.arithmetic.MultiplyZeroDeobfuscator;
|
||||||
import net.runelite.deob.deobfuscators.cfg.ControlFlowDeobfuscator;
|
import net.runelite.deob.deobfuscators.cfg.ControlFlowDeobfuscator;
|
||||||
|
import net.runelite.deob.deobfuscators.constparam.ConstantParameter;
|
||||||
import net.runelite.deob.deobfuscators.exprargorder.ExprArgOrder;
|
import net.runelite.deob.deobfuscators.exprargorder.ExprArgOrder;
|
||||||
import net.runelite.deob.deobfuscators.menuaction.MenuActionDeobfuscator;
|
import net.runelite.deob.deobfuscators.menuaction.MenuActionDeobfuscator;
|
||||||
import net.runelite.deob.deobfuscators.transformers.ClientErrorTransformer;
|
import net.runelite.deob.deobfuscators.transformers.ClientErrorTransformer;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
package net.runelite.deob.clientver;
|
package net.runelite.deob.clientver;
|
||||||
|
|
||||||
|
import com.google.common.io.Files;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@@ -36,4 +37,24 @@ public class ClientVersionMain
|
|||||||
ClientVersion cv = new ClientVersion(jar);
|
ClientVersion cv = new ClientVersion(jar);
|
||||||
System.out.println(cv.getVersion());
|
System.out.println(cv.getVersion());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int version(String loc)
|
||||||
|
{
|
||||||
|
File jar = new File(loc);
|
||||||
|
ClientVersion cv = new ClientVersion(jar);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int version = cv.getVersion();
|
||||||
|
|
||||||
|
Files.move(jar, new File(loc.replace("gamepack.jar", "gamepack-" + version + ".jar")));
|
||||||
|
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ public class UpdateMappings
|
|||||||
JarUtil.loadJar(new File(args[0])),
|
JarUtil.loadJar(new File(args[0])),
|
||||||
JarUtil.loadJar(new File(args[1]))
|
JarUtil.loadJar(new File(args[1]))
|
||||||
);
|
);
|
||||||
u.update();
|
u.update();
|
||||||
u.save(new File(args[2]));
|
u.save(new File(args[2]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
166
deobfuscator/src/main/java/net/runelite/gamepack/Checker.java
Normal file
166
deobfuscator/src/main/java/net/runelite/gamepack/Checker.java
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
package net.runelite.gamepack;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
|
||||||
|
public class Checker
|
||||||
|
{
|
||||||
|
private static final String GAME_URL = "http://oldschool1.runescape.com/";
|
||||||
|
private static final Split[] splits = {
|
||||||
|
new Split("document.write('archive=", 1),
|
||||||
|
new Split(" ');", 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
static String getGamePack()
|
||||||
|
{
|
||||||
|
URL url;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
url = new URL(GAME_URL);
|
||||||
|
}
|
||||||
|
catch (MalformedURLException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String content;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
content = getContent(url);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Split split : splits)
|
||||||
|
{
|
||||||
|
String[] str = splitAtFirst(content, split.splitAt);
|
||||||
|
content = str[split.index];
|
||||||
|
}
|
||||||
|
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] splitAtFirst(String subject, String splitAt)
|
||||||
|
{
|
||||||
|
if (subject == null || subject.length() == 0)
|
||||||
|
{
|
||||||
|
return new String[]{"", ""};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (splitAt == null || splitAt.length() == 0)
|
||||||
|
{
|
||||||
|
return new String[]{subject, ""};
|
||||||
|
}
|
||||||
|
|
||||||
|
char[] subjectArray = subject.toCharArray();
|
||||||
|
char[] split = splitAt.toCharArray();
|
||||||
|
|
||||||
|
StringBuilder builder = null;
|
||||||
|
for (int i = 0; i < subjectArray.length; i++)
|
||||||
|
{
|
||||||
|
char c = subjectArray[i];
|
||||||
|
|
||||||
|
if (builder == null && c == split[0])
|
||||||
|
{
|
||||||
|
builder = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (builder != null)
|
||||||
|
{
|
||||||
|
builder.append(c);
|
||||||
|
|
||||||
|
if (startsWith(splitAt, builder.toString()))
|
||||||
|
{
|
||||||
|
if (builder.length() == splitAt.length())
|
||||||
|
{
|
||||||
|
return new String[]{subject.substring(0, i - builder.length() + 1), subject.substring(i + 1)};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
builder = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new String[]{subject, ""};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean startsWith(String subject, String start)
|
||||||
|
{
|
||||||
|
if (subject == null || subject.length() == 0 || start == null || start.length() == 0 || start.length() > subject.length())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char[] c1 = subject.toCharArray();
|
||||||
|
char[] c2 = start.toCharArray();
|
||||||
|
for (int i = 0; i < c2.length; i++)
|
||||||
|
{
|
||||||
|
if (c1[i] != c2[i])
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getContent(URL url) throws IOException
|
||||||
|
{
|
||||||
|
BufferedReader rd = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
URLConnection conn = url.openConnection();
|
||||||
|
|
||||||
|
if (conn instanceof HttpURLConnection)
|
||||||
|
{
|
||||||
|
((HttpURLConnection) conn).setInstanceFollowRedirects(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpURLConnection.setFollowRedirects(false);
|
||||||
|
|
||||||
|
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
|
String line;
|
||||||
|
while ((line = rd.readLine()) != null)
|
||||||
|
{
|
||||||
|
sb.append(line);
|
||||||
|
sb.append('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (rd != null)
|
||||||
|
{
|
||||||
|
rd.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Split
|
||||||
|
{
|
||||||
|
public int index;
|
||||||
|
String splitAt;
|
||||||
|
|
||||||
|
Split(String splitAt, int index)
|
||||||
|
{
|
||||||
|
this.splitAt = splitAt;
|
||||||
|
this.index = index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package net.runelite.gamepack;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
public class Downloader
|
||||||
|
{
|
||||||
|
private static final String REPLACE = "%archive%";
|
||||||
|
private static final String GAMEPACK_URL = "http://oldschool1.runescape.com/" + REPLACE;
|
||||||
|
|
||||||
|
private static String getGamepackUrl()
|
||||||
|
{
|
||||||
|
String archive = Checker.getGamePack();
|
||||||
|
return archive == null ? "" : GAMEPACK_URL.replace(REPLACE, archive);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String gamepack()
|
||||||
|
{
|
||||||
|
Path path = Paths.get(System.getProperty("user.home"), "gamepack");
|
||||||
|
final File folder = new File(String.valueOf(path));
|
||||||
|
|
||||||
|
if (!folder.exists())
|
||||||
|
{
|
||||||
|
folder.mkdir();
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadLatest(folder);
|
||||||
|
|
||||||
|
return path + File.separator + "gamepack.jar";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void downloadLatest(File folder)
|
||||||
|
{
|
||||||
|
File output = new File(folder, "gamepack.jar");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
URL url = new URL(getGamepackUrl());
|
||||||
|
|
||||||
|
final URLDownloader downloader = new URLDownloader(url, output);
|
||||||
|
downloader.download();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Thread.sleep(100);
|
||||||
|
}
|
||||||
|
catch (InterruptedException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package net.runelite.gamepack;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.channels.Channels;
|
||||||
|
import java.nio.channels.FileChannel;
|
||||||
|
import java.nio.channels.ReadableByteChannel;
|
||||||
|
|
||||||
|
class URLDownloader
|
||||||
|
{
|
||||||
|
private URL url;
|
||||||
|
private File output;
|
||||||
|
|
||||||
|
URLDownloader(URL url, File output)
|
||||||
|
{
|
||||||
|
this.url = url;
|
||||||
|
this.output = output;
|
||||||
|
}
|
||||||
|
|
||||||
|
void download() throws IOException
|
||||||
|
{
|
||||||
|
this.downloadFromURL();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void downloadFromURL() throws IOException
|
||||||
|
{
|
||||||
|
ReadableByteChannel rbc = Channels.newChannel(url.openStream());
|
||||||
|
FileOutputStream fos = new FileOutputStream(output);
|
||||||
|
|
||||||
|
FileChannel channel = fos.getChannel();
|
||||||
|
channel.transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -56,9 +56,9 @@ import net.runelite.mapping.Import;
|
|||||||
import net.runelite.rs.api.RSClient;
|
import net.runelite.rs.api.RSClient;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import net.runelite.injector.raw.HidePlayerAttacks;
|
||||||
|
|
||||||
// import net.runelite.injector.raw.DrawMenu;
|
// import net.runelite.injector.raw.DrawMenu;
|
||||||
// import net.runelite.injector.raw.HidePlayerAttacks;
|
|
||||||
|
|
||||||
public class Inject
|
public class Inject
|
||||||
{
|
{
|
||||||
@@ -319,7 +319,7 @@ public class Inject
|
|||||||
new RenderDraw(this).inject();
|
new RenderDraw(this).inject();
|
||||||
// new DrawMenu(this).inject();
|
// new DrawMenu(this).inject();
|
||||||
new Occluder(this).inject();
|
new Occluder(this).inject();
|
||||||
// new HidePlayerAttacks(this).inject();
|
new HidePlayerAttacks(this).inject();
|
||||||
}
|
}
|
||||||
|
|
||||||
private java.lang.Class injectInterface(ClassFile cf, ClassFile other)
|
private java.lang.Class injectInterface(ClassFile cf, ClassFile other)
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ public class HidePlayerAttacks
|
|||||||
// add option n such
|
// add option n such
|
||||||
|
|
||||||
Instructions ins = addPlayerOptions.getCode().getInstructions();
|
Instructions ins = addPlayerOptions.getCode().getInstructions();
|
||||||
|
log.info(String.valueOf(ins.getInstructions().size()));
|
||||||
ListIterator<Instruction> iterator = ins.getInstructions().listIterator();
|
ListIterator<Instruction> iterator = ins.getInstructions().listIterator();
|
||||||
while (iterator.hasNext())
|
while (iterator.hasNext())
|
||||||
{
|
{
|
||||||
@@ -169,22 +170,18 @@ public class HidePlayerAttacks
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
i = iterator.next();
|
|
||||||
while (!(i instanceof BiPush) || (byte) ((BiPush) i).getConstant() != 8)
|
|
||||||
{
|
|
||||||
i = iterator.next();
|
|
||||||
}
|
|
||||||
|
|
||||||
i = iterator.next();
|
i = iterator.next();
|
||||||
if (!(i instanceof IAnd))
|
if (!(i instanceof IAnd))
|
||||||
{
|
{
|
||||||
throw new InjectionException("Yikes I didn't expect this");
|
continue;
|
||||||
|
/*log.info(i.getClass().getName() + i.getClass().getSuperclass() + i.getType().getName() +
|
||||||
|
i.getType().getInstructionClass() + i.getInstructions() + i.toString());
|
||||||
|
throw new InjectionException("Yikes I didn't expect this");**/
|
||||||
}
|
}
|
||||||
|
|
||||||
i = iterator.next();
|
|
||||||
if (!(i instanceof IfICmpNe))
|
if (!(i instanceof IfICmpNe))
|
||||||
{
|
{
|
||||||
throw new InjectionException("Yikes I didn't expect this");
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Label target = ((IfICmpNe) i).getJumps().get(0);
|
Label target = ((IfICmpNe) i).getJumps().get(0);
|
||||||
|
|||||||
@@ -217,9 +217,16 @@ public class CoxPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
for (Player player : client.getPlayers())
|
for (Player player : client.getPlayers())
|
||||||
{
|
{
|
||||||
if (player.getName().equals(tpMatcher.group(1)))
|
final String rawPlayerName = player.getName();
|
||||||
|
|
||||||
|
if (rawPlayerName != null)
|
||||||
{
|
{
|
||||||
victims.add(new Victim(player, Victim.Type.TELEPORT));
|
final String fixedPlayerName = Text.sanitize(rawPlayerName);
|
||||||
|
|
||||||
|
if (fixedPlayerName.equals(tpMatcher.group(1)))
|
||||||
|
{
|
||||||
|
victims.add(new Victim(player, Victim.Type.TELEPORT));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,16 +76,18 @@ public class ItemChargePlugin extends Plugin
|
|||||||
{
|
{
|
||||||
private static final Pattern DODGY_CHECK_PATTERN = Pattern.compile(
|
private static final Pattern DODGY_CHECK_PATTERN = Pattern.compile(
|
||||||
"Your dodgy necklace has (\\d+) charges? left\\.");
|
"Your dodgy necklace has (\\d+) charges? left\\.");
|
||||||
private static final Pattern SLAUGHTER_CHECK_PATTERN = Pattern.compile(
|
private static final String CHAT_BRACELET_SLAUGHTER = "Your bracelet of slaughter prevents your slayer";
|
||||||
|
private static final Pattern CHAT_BRACELET_SLAUGHTER_REGEX = Pattern.compile(
|
||||||
|
"Your bracelet of slaughter prevents your slayer count decreasing. It has (\\d{1,2}) charge[s]? left.");
|
||||||
|
private static final String CHAT_BRACELET_EXPEDITIOUS = "Your expeditious bracelet helps you progress your";
|
||||||
|
private static final Pattern CHAT_BRACELET_EXPEDITIOUS_REGEX = Pattern.compile(
|
||||||
|
"Your expeditious bracelet helps you progress your slayer (?:task )?faster. It has (\\d{1,2}) charge[s]? left.");
|
||||||
|
private static final Pattern CHAT_BRACELET_SLAUGHTER_CHARGE_REGEX = Pattern.compile(
|
||||||
"Your bracelet of slaughter has (\\d{1,2}) charge[s]? left.");
|
"Your bracelet of slaughter has (\\d{1,2}) charge[s]? left.");
|
||||||
private static final Pattern EXPEDITIOUS_CHECK_PATTERN = Pattern.compile(
|
private static final Pattern CHAT_BRACELET_EXPEDITIOUS_CHARGE_REGEX = Pattern.compile(
|
||||||
"Your expeditious bracelet has (\\d{1,2}) charge[s]? left.");
|
"Your expeditious bracelet has (\\d{1,2}) charge[s]? left.");
|
||||||
private static final Pattern DODGY_PROTECT_PATTERN = Pattern.compile(
|
private static final Pattern DODGY_PROTECT_PATTERN = Pattern.compile(
|
||||||
"Your dodgy necklace protects you\\..*It has (\\d+) charges? left\\.");
|
"Your dodgy necklace protects you\\..*It has (\\d+) charges? left\\.");
|
||||||
private static final Pattern SLAUGHTER_ACTIVATE_PATTERN = Pattern.compile(
|
|
||||||
"Your bracelet of slaughter prevents your slayer count decreasing. It has (\\d{1,2}) charge[s]? left.");
|
|
||||||
private static final Pattern EXPEDITIOUS_ACTIVATE_PATTERN = Pattern.compile(
|
|
||||||
"Your expeditious bracelet helps you progress your slayer (?:task )?faster. It has (\\d{1,2}) charge[s]? left.");
|
|
||||||
private static final Pattern DODGY_BREAK_PATTERN = Pattern.compile(
|
private static final Pattern DODGY_BREAK_PATTERN = Pattern.compile(
|
||||||
"Your dodgy necklace protects you\\..*It then crumbles to dust\\.");
|
"Your dodgy necklace protects you\\..*It then crumbles to dust\\.");
|
||||||
private static final String RING_OF_RECOIL_BREAK_MESSAGE = "<col=7f007f>Your Ring of Recoil has shattered.</col>";
|
private static final String RING_OF_RECOIL_BREAK_MESSAGE = "<col=7f007f>Your Ring of Recoil has shattered.</col>";
|
||||||
@@ -331,11 +333,7 @@ public class ItemChargePlugin extends Plugin
|
|||||||
{
|
{
|
||||||
String message = event.getMessage();
|
String message = event.getMessage();
|
||||||
Matcher dodgyCheckMatcher = DODGY_CHECK_PATTERN.matcher(message);
|
Matcher dodgyCheckMatcher = DODGY_CHECK_PATTERN.matcher(message);
|
||||||
Matcher slaughterCheckMatcher = SLAUGHTER_CHECK_PATTERN.matcher(message);
|
|
||||||
Matcher expeditiousCheckMatcher = EXPEDITIOUS_CHECK_PATTERN.matcher(message);
|
|
||||||
Matcher dodgyProtectMatcher = DODGY_PROTECT_PATTERN.matcher(message);
|
Matcher dodgyProtectMatcher = DODGY_PROTECT_PATTERN.matcher(message);
|
||||||
Matcher slaughterActivateMatcher = SLAUGHTER_ACTIVATE_PATTERN.matcher(message);
|
|
||||||
Matcher expeditiousActivateMatcher = EXPEDITIOUS_ACTIVATE_PATTERN.matcher(message);
|
|
||||||
Matcher dodgyBreakMatcher = DODGY_BREAK_PATTERN.matcher(message);
|
Matcher dodgyBreakMatcher = DODGY_BREAK_PATTERN.matcher(message);
|
||||||
Matcher bindingNecklaceCheckMatcher = BINDING_CHECK_PATTERN.matcher(event.getMessage());
|
Matcher bindingNecklaceCheckMatcher = BINDING_CHECK_PATTERN.matcher(event.getMessage());
|
||||||
Matcher bindingNecklaceUsedMatcher = BINDING_USED_PATTERN.matcher(event.getMessage());
|
Matcher bindingNecklaceUsedMatcher = BINDING_USED_PATTERN.matcher(event.getMessage());
|
||||||
@@ -347,6 +345,10 @@ public class ItemChargePlugin extends Plugin
|
|||||||
Matcher chronicleLastChargeMatcher = CHRONICLE_LAST_CHARGE_PATTERN.matcher(message);
|
Matcher chronicleLastChargeMatcher = CHRONICLE_LAST_CHARGE_PATTERN.matcher(message);
|
||||||
Matcher chronicleOutOfChargesMatcher = CHRONICLE_OUT_OF_CHARGES_PATTERN.matcher(message);
|
Matcher chronicleOutOfChargesMatcher = CHRONICLE_OUT_OF_CHARGES_PATTERN.matcher(message);
|
||||||
Matcher ringOfForgingCheckMatcher = RING_OF_FORGING_CHECK_PATTERN.matcher(message);
|
Matcher ringOfForgingCheckMatcher = RING_OF_FORGING_CHECK_PATTERN.matcher(message);
|
||||||
|
Matcher slaughterMatcher = CHAT_BRACELET_SLAUGHTER_REGEX.matcher(Text.removeTags(message));
|
||||||
|
Matcher expeditiousMatcher = CHAT_BRACELET_EXPEDITIOUS_REGEX.matcher(Text.removeTags(message));
|
||||||
|
Matcher slaughterChargeMatcher = CHAT_BRACELET_SLAUGHTER_CHARGE_REGEX.matcher(Text.removeTags(message));
|
||||||
|
Matcher expeditiousChargeMatcher = CHAT_BRACELET_EXPEDITIOUS_CHARGE_REGEX.matcher(Text.removeTags(message));
|
||||||
|
|
||||||
if (event.getType() == ChatMessageType.GAMEMESSAGE || event.getType() == ChatMessageType.SPAM)
|
if (event.getType() == ChatMessageType.GAMEMESSAGE || event.getType() == ChatMessageType.SPAM)
|
||||||
{
|
{
|
||||||
@@ -354,30 +356,30 @@ public class ItemChargePlugin extends Plugin
|
|||||||
{
|
{
|
||||||
notifier.notify("Your Ring of Recoil has shattered");
|
notifier.notify("Your Ring of Recoil has shattered");
|
||||||
}
|
}
|
||||||
|
else if (Text.removeTags(message).startsWith(CHAT_BRACELET_SLAUGHTER))
|
||||||
|
{
|
||||||
|
updateBraceletOfSlaughterCharges(slaughterMatcher.find() ? Integer.parseInt(slaughterMatcher.group(1)) : MAX_SLAUGHTER_CHARGES);
|
||||||
|
}
|
||||||
|
else if (Text.removeTags(message).startsWith(CHAT_BRACELET_EXPEDITIOUS))
|
||||||
|
{
|
||||||
|
updateExpeditiousCharges(expeditiousMatcher.find() ? Integer.parseInt(expeditiousMatcher.group(1)) : MAX_EXPEDITIOUS_CHARGES);
|
||||||
|
}
|
||||||
|
else if (slaughterChargeMatcher.find())
|
||||||
|
{
|
||||||
|
updateBraceletOfSlaughterCharges(Integer.parseInt(slaughterChargeMatcher.group(1)));
|
||||||
|
}
|
||||||
|
else if (expeditiousChargeMatcher.find())
|
||||||
|
{
|
||||||
|
updateExpeditiousCharges(Integer.parseInt(expeditiousChargeMatcher.group(1)));
|
||||||
|
}
|
||||||
else if (dodgyCheckMatcher.find())
|
else if (dodgyCheckMatcher.find())
|
||||||
{
|
{
|
||||||
updateDodgyNecklaceCharges(Integer.parseInt(dodgyCheckMatcher.group(1)));
|
updateDodgyNecklaceCharges(Integer.parseInt(dodgyCheckMatcher.group(1)));
|
||||||
}
|
}
|
||||||
else if (slaughterCheckMatcher.find())
|
|
||||||
{
|
|
||||||
updateBraceletOfSlaughterCharges(Integer.parseInt(slaughterCheckMatcher.group(1)));
|
|
||||||
}
|
|
||||||
else if (expeditiousCheckMatcher.find())
|
|
||||||
{
|
|
||||||
updateExpeditiousCharges(Integer.parseInt(expeditiousCheckMatcher.group(1)));
|
|
||||||
}
|
|
||||||
else if (dodgyProtectMatcher.find())
|
else if (dodgyProtectMatcher.find())
|
||||||
{
|
{
|
||||||
updateDodgyNecklaceCharges(Integer.parseInt(dodgyProtectMatcher.group(1)));
|
updateDodgyNecklaceCharges(Integer.parseInt(dodgyProtectMatcher.group(1)));
|
||||||
}
|
}
|
||||||
else if (slaughterActivateMatcher.find())
|
|
||||||
{
|
|
||||||
updateBraceletOfSlaughterCharges(Integer.parseInt(slaughterActivateMatcher.group(1)));
|
|
||||||
}
|
|
||||||
else if (expeditiousActivateMatcher.find())
|
|
||||||
{
|
|
||||||
updateExpeditiousCharges(Integer.parseInt(expeditiousActivateMatcher.group(1)));
|
|
||||||
}
|
|
||||||
else if (dodgyBreakMatcher.find())
|
else if (dodgyBreakMatcher.find())
|
||||||
{
|
{
|
||||||
if (this.dodgyNotification)
|
if (this.dodgyNotification)
|
||||||
@@ -955,4 +957,4 @@ public class ItemChargePlugin extends Plugin
|
|||||||
this.chronicle = config.chronicle();
|
this.chronicle = config.chronicle();
|
||||||
this.showSackCharges = config.showSackCharges();
|
this.showSackCharges = config.showSackCharges();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ import java.awt.Graphics2D;
|
|||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -124,10 +123,12 @@ public class PlayerIndicatorsOverlay extends Overlay
|
|||||||
{
|
{
|
||||||
if (clanManager.getRank(actor.getName()) != null)
|
if (clanManager.getRank(actor.getName()) != null)
|
||||||
{
|
{
|
||||||
OverlayUtil.renderActorTextAndImage(graphics, actor, builtString, color,
|
final BufferedImage clanRankImage = clanManager.getClanImage(clanManager.getRank(actor.getName()));
|
||||||
ImageUtil.resizeImage(Objects.requireNonNull(clanManager
|
if (clanRankImage != null)
|
||||||
.getClanImage(clanManager.getRank(actor.getName()))), y, y), 0, ACTOR_HORIZONTAL_TEXT_MARGIN);
|
{
|
||||||
return;
|
OverlayUtil.renderActorTextAndImage(graphics, actor, builtString, color,
|
||||||
|
ImageUtil.resizeImage(clanRankImage, y, y), 0, ACTOR_HORIZONTAL_TEXT_MARGIN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -393,8 +393,7 @@ public class SlayerPlugin extends Plugin
|
|||||||
currentTask.setPaused(true);
|
currentTask.setPaused(true);
|
||||||
break;
|
break;
|
||||||
case LOGGED_IN:
|
case LOGGED_IN:
|
||||||
if (loginTick && this.amount != -1
|
if (loginTick && this.amount != -1 && !this.taskName.isEmpty() && currentTask.getTaskName() == null)
|
||||||
&& !this.taskName.isEmpty())
|
|
||||||
{
|
{
|
||||||
setTask(this.taskName, this.amount, this.initialAmount, true, this.taskLocation, this.lastCertainAmount, false);
|
setTask(this.taskName, this.amount, this.initialAmount, true, this.taskLocation, this.lastCertainAmount, false);
|
||||||
}
|
}
|
||||||
@@ -753,6 +752,7 @@ public class SlayerPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
final Task task = Task.getTask(taskName);
|
final Task task = Task.getTask(taskName);
|
||||||
|
int delta = slayerExp - cachedXp;
|
||||||
|
|
||||||
// null tasks are technically valid, it only means they arent explicitly defined in the Task enum
|
// null tasks are technically valid, it only means they arent explicitly defined in the Task enum
|
||||||
// allow them through so that if there is a task capture failure the counter will still work
|
// allow them through so that if there is a task capture failure the counter will still work
|
||||||
@@ -762,7 +762,7 @@ public class SlayerPlugin extends Plugin
|
|||||||
// to the expected exp gain for the task.
|
// to the expected exp gain for the task.
|
||||||
if (taskKillExp == 0 || taskKillExp == slayerExp - cachedXp)
|
if (taskKillExp == 0 || taskKillExp == slayerExp - cachedXp)
|
||||||
{
|
{
|
||||||
killedOne();
|
killedOne(delta);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -780,9 +780,7 @@ public class SlayerPlugin extends Plugin
|
|||||||
int killCount = estimateKillCount(potentialNPCs, gains);
|
int killCount = estimateKillCount(potentialNPCs, gains);
|
||||||
for (int i = 0; i < killCount; i++)
|
for (int i = 0; i < killCount; i++)
|
||||||
{
|
{
|
||||||
killedOne();
|
killedOne(delta);
|
||||||
int delta = slayerExp - cachedXp;
|
|
||||||
currentTask.setElapsedXp(currentTask.getElapsedXp() + delta);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -822,25 +820,28 @@ public class SlayerPlugin extends Plugin
|
|||||||
|
|
||||||
private void onConfigChanged(ConfigChanged event)
|
private void onConfigChanged(ConfigChanged event)
|
||||||
{
|
{
|
||||||
if (!event.getGroup().equals("slayer") || !event.getKey().equals("infobox"))
|
if (!event.getGroup().equals("slayer"))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateConfig();
|
updateConfig();
|
||||||
|
|
||||||
if (this.showInfobox)
|
if (event.getKey().equals("infobox"))
|
||||||
{
|
{
|
||||||
clientThread.invoke(this::addCounter);
|
if (this.showInfobox)
|
||||||
}
|
{
|
||||||
else
|
clientThread.invoke(this::addCounter);
|
||||||
{
|
}
|
||||||
removeCounter();
|
else
|
||||||
|
{
|
||||||
|
removeCounter();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
private void killedOne()
|
private void killedOne(int delta)
|
||||||
{
|
{
|
||||||
if (currentTask.getAmount() == 0)
|
if (currentTask.getAmount() == 0)
|
||||||
{
|
{
|
||||||
@@ -849,6 +850,7 @@ public class SlayerPlugin extends Plugin
|
|||||||
|
|
||||||
currentTask.setAmount(currentTask.getAmount() - 1);
|
currentTask.setAmount(currentTask.getAmount() - 1);
|
||||||
currentTask.setElapsedKills(currentTask.getElapsedKills() + 1);
|
currentTask.setElapsedKills(currentTask.getElapsedKills() + 1);
|
||||||
|
currentTask.setElapsedXp(currentTask.getElapsedXp() + delta);
|
||||||
if (doubleTroubleExtraKill())
|
if (doubleTroubleExtraKill())
|
||||||
{
|
{
|
||||||
currentTask.setAmount(currentTask.getAmount() - 1);
|
currentTask.setAmount(currentTask.getAmount() - 1);
|
||||||
@@ -1208,31 +1210,13 @@ public class SlayerPlugin extends Plugin
|
|||||||
client.refreshChat();
|
client.refreshChat();
|
||||||
}
|
}
|
||||||
|
|
||||||
void pointsLookup(ChatMessage chatMessage, String message)
|
private void pointsLookup(ChatMessage chatMessage, String message)
|
||||||
{
|
{
|
||||||
if (!this.pointsCommand)
|
if (!this.pointsCommand)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatMessageType type = chatMessage.getType();
|
|
||||||
|
|
||||||
final String player;
|
|
||||||
if (type.equals(ChatMessageType.PRIVATECHATOUT))
|
|
||||||
{
|
|
||||||
player = client.getLocalPlayer().getName();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player = Text.removeTags(chatMessage.getName())
|
|
||||||
.replace('\u00A0', ' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Integer.toString(getPoints()) == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String response = new ChatMessageBuilder()
|
String response = new ChatMessageBuilder()
|
||||||
.append(ChatColorType.NORMAL)
|
.append(ChatColorType.NORMAL)
|
||||||
.append("Slayer Points: ")
|
.append("Slayer Points: ")
|
||||||
@@ -1313,7 +1297,7 @@ public class SlayerPlugin extends Plugin
|
|||||||
return str.substring(0, 1).toUpperCase() + str.substring(1);
|
return str.substring(0, 1).toUpperCase() + str.substring(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPoints(int points)
|
private void setPoints(int points)
|
||||||
{
|
{
|
||||||
this.points = points;
|
this.points = points;
|
||||||
this.cachedPoints = points;
|
this.cachedPoints = points;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public class WildernessLocationsMapOverlay extends Overlay
|
|||||||
{
|
{
|
||||||
setPosition(OverlayPosition.DYNAMIC);
|
setPosition(OverlayPosition.DYNAMIC);
|
||||||
setPriority(OverlayPriority.HIGH);
|
setPriority(OverlayPriority.HIGH);
|
||||||
setLayer(OverlayLayer.ALWAYS_ON_TOP);
|
setLayer(OverlayLayer.ABOVE_MAP);
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5801,16 +5801,7 @@
|
|||||||
"combatLevel": 66,
|
"combatLevel": 66,
|
||||||
"slayerLevel": 1,
|
"slayerLevel": 1,
|
||||||
"attackSpeed": 15,
|
"attackSpeed": 15,
|
||||||
"attackLevel": 90,
|
"magic": 70
|
||||||
"strengthLevel": 90,
|
|
||||||
"defenceLevel": 90,
|
|
||||||
"rangeLevel": 1,
|
|
||||||
"magicLevel": 70,
|
|
||||||
"magic": 70,
|
|
||||||
"stabDef": 40,
|
|
||||||
"slashDef": 90,
|
|
||||||
"crushDef": 90,
|
|
||||||
"magicDef": 34
|
|
||||||
},
|
},
|
||||||
"800": {
|
"800": {
|
||||||
"name": "Locust rider",
|
"name": "Locust rider",
|
||||||
@@ -6958,18 +6949,6 @@
|
|||||||
"rangeLevel": 1,
|
"rangeLevel": 1,
|
||||||
"magicLevel": 1
|
"magicLevel": 1
|
||||||
},
|
},
|
||||||
"1038": {
|
|
||||||
"name": "Monkey",
|
|
||||||
"hitpoints": 6,
|
|
||||||
"combatLevel": 3,
|
|
||||||
"slayerLevel": 1,
|
|
||||||
"attackSpeed": 4,
|
|
||||||
"attackLevel": 2,
|
|
||||||
"strengthLevel": 3,
|
|
||||||
"defenceLevel": 2,
|
|
||||||
"rangeLevel": 1,
|
|
||||||
"magicLevel": 1
|
|
||||||
},
|
|
||||||
"1039": {
|
"1039": {
|
||||||
"name": "Albino bat",
|
"name": "Albino bat",
|
||||||
"hitpoints": 33,
|
"hitpoints": 33,
|
||||||
@@ -8168,7 +8147,9 @@
|
|||||||
"strengthLevel": 35,
|
"strengthLevel": 35,
|
||||||
"defenceLevel": 35,
|
"defenceLevel": 35,
|
||||||
"rangeLevel": 30,
|
"rangeLevel": 30,
|
||||||
"magicLevel": 10
|
"magicLevel": 10,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
},
|
},
|
||||||
"1369": {
|
"1369": {
|
||||||
"name": "Air elemental",
|
"name": "Air elemental",
|
||||||
@@ -11839,24 +11820,6 @@
|
|||||||
"crushDef": 175,
|
"crushDef": 175,
|
||||||
"rangeDef": 250
|
"rangeDef": 250
|
||||||
},
|
},
|
||||||
"2263": {
|
|
||||||
"name": "Bardur",
|
|
||||||
"hitpoints": 99,
|
|
||||||
"combatLevel": 94,
|
|
||||||
"attackSpeed": 6,
|
|
||||||
"attackLevel": 99,
|
|
||||||
"strengthLevel": 40,
|
|
||||||
"defenceLevel": 99,
|
|
||||||
"rangeLevel": 1,
|
|
||||||
"magicLevel": 1,
|
|
||||||
"stabDef": 150,
|
|
||||||
"slashDef": 150,
|
|
||||||
"crushDef": 150,
|
|
||||||
"rangeDef": 150,
|
|
||||||
"magicDef": 150,
|
|
||||||
"bonusAttack": 100,
|
|
||||||
"bonusStrength": 100
|
|
||||||
},
|
|
||||||
"2264": {
|
"2264": {
|
||||||
"name": "Dagannoth fledgeling",
|
"name": "Dagannoth fledgeling",
|
||||||
"hitpoints": 100,
|
"hitpoints": 100,
|
||||||
@@ -13681,7 +13644,9 @@
|
|||||||
"strengthLevel": 1,
|
"strengthLevel": 1,
|
||||||
"defenceLevel": 1,
|
"defenceLevel": 1,
|
||||||
"rangeLevel": 1,
|
"rangeLevel": 1,
|
||||||
"magicLevel": 1
|
"magicLevel": 1,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
},
|
},
|
||||||
"2791": {
|
"2791": {
|
||||||
"name": "Cow",
|
"name": "Cow",
|
||||||
@@ -13693,7 +13658,9 @@
|
|||||||
"strengthLevel": 1,
|
"strengthLevel": 1,
|
||||||
"defenceLevel": 1,
|
"defenceLevel": 1,
|
||||||
"rangeLevel": 1,
|
"rangeLevel": 1,
|
||||||
"magicLevel": 1
|
"magicLevel": 1,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
},
|
},
|
||||||
"2792": {
|
"2792": {
|
||||||
"name": "Cow calf",
|
"name": "Cow calf",
|
||||||
@@ -13717,7 +13684,9 @@
|
|||||||
"strengthLevel": 1,
|
"strengthLevel": 1,
|
||||||
"defenceLevel": 1,
|
"defenceLevel": 1,
|
||||||
"rangeLevel": 1,
|
"rangeLevel": 1,
|
||||||
"magicLevel": 1
|
"magicLevel": 1,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
},
|
},
|
||||||
"2794": {
|
"2794": {
|
||||||
"name": "Cow calf",
|
"name": "Cow calf",
|
||||||
@@ -13741,7 +13710,9 @@
|
|||||||
"strengthLevel": 1,
|
"strengthLevel": 1,
|
||||||
"defenceLevel": 1,
|
"defenceLevel": 1,
|
||||||
"rangeLevel": 1,
|
"rangeLevel": 1,
|
||||||
"magicLevel": 1
|
"magicLevel": 1,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
},
|
},
|
||||||
"2801": {
|
"2801": {
|
||||||
"name": "Cow calf",
|
"name": "Cow calf",
|
||||||
@@ -16031,7 +16002,7 @@
|
|||||||
"hitpoints": 20,
|
"hitpoints": 20,
|
||||||
"combatLevel": 18,
|
"combatLevel": 18,
|
||||||
"slayerLevel": 1,
|
"slayerLevel": 1,
|
||||||
"attackSpeed": 6,
|
"attackSpeed": 4,
|
||||||
"attackLevel": 12,
|
"attackLevel": 12,
|
||||||
"strengthLevel": 16,
|
"strengthLevel": 16,
|
||||||
"defenceLevel": 19,
|
"defenceLevel": 19,
|
||||||
@@ -18716,26 +18687,6 @@
|
|||||||
"rangeLevel": 1,
|
"rangeLevel": 1,
|
||||||
"magicLevel": 1
|
"magicLevel": 1
|
||||||
},
|
},
|
||||||
"3897": {
|
|
||||||
"name": "Koschei the deathless",
|
|
||||||
"hitpoints": 79,
|
|
||||||
"attackSpeed": 4
|
|
||||||
},
|
|
||||||
"3898": {
|
|
||||||
"name": "Koschei the deathless",
|
|
||||||
"hitpoints": 79,
|
|
||||||
"attackSpeed": 4
|
|
||||||
},
|
|
||||||
"3899": {
|
|
||||||
"name": "Koschei the deathless",
|
|
||||||
"hitpoints": 79,
|
|
||||||
"attackSpeed": 4
|
|
||||||
},
|
|
||||||
"3900": {
|
|
||||||
"name": "Koschei the deathless",
|
|
||||||
"hitpoints": 79,
|
|
||||||
"attackSpeed": 4
|
|
||||||
},
|
|
||||||
"3901": {
|
"3901": {
|
||||||
"name": "Fox",
|
"name": "Fox",
|
||||||
"hitpoints": 30,
|
"hitpoints": 30,
|
||||||
@@ -18877,18 +18828,6 @@
|
|||||||
"magicLevel": 1,
|
"magicLevel": 1,
|
||||||
"bonusStrength": 20
|
"bonusStrength": 20
|
||||||
},
|
},
|
||||||
"3942": {
|
|
||||||
"name": "Freygerd",
|
|
||||||
"hitpoints": 50,
|
|
||||||
"combatLevel": 48,
|
|
||||||
"attackSpeed": 4,
|
|
||||||
"attackLevel": 40,
|
|
||||||
"strengthLevel": 40,
|
|
||||||
"defenceLevel": 40,
|
|
||||||
"rangeLevel": 1,
|
|
||||||
"magicLevel": 1,
|
|
||||||
"bonusStrength": 20
|
|
||||||
},
|
|
||||||
"3943": {
|
"3943": {
|
||||||
"name": "Lensa",
|
"name": "Lensa",
|
||||||
"hitpoints": 50,
|
"hitpoints": 50,
|
||||||
@@ -22127,7 +22066,7 @@
|
|||||||
"hitpoints": 15,
|
"hitpoints": 15,
|
||||||
"combatLevel": 13,
|
"combatLevel": 13,
|
||||||
"slayerLevel": 1,
|
"slayerLevel": 1,
|
||||||
"attackSpeed": 6,
|
"attackSpeed": 4,
|
||||||
"attackLevel": 10,
|
"attackLevel": 10,
|
||||||
"strengthLevel": 10,
|
"strengthLevel": 10,
|
||||||
"defenceLevel": 12,
|
"defenceLevel": 12,
|
||||||
@@ -25428,7 +25367,9 @@
|
|||||||
"strengthLevel": 1,
|
"strengthLevel": 1,
|
||||||
"defenceLevel": 1,
|
"defenceLevel": 1,
|
||||||
"rangeLevel": 1,
|
"rangeLevel": 1,
|
||||||
"magicLevel": 1
|
"magicLevel": 1,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
},
|
},
|
||||||
"5848": {
|
"5848": {
|
||||||
"name": "Tanglefoot",
|
"name": "Tanglefoot",
|
||||||
@@ -27385,10 +27326,15 @@
|
|||||||
},
|
},
|
||||||
"6340": {
|
"6340": {
|
||||||
"name": "Cow (hard)",
|
"name": "Cow (hard)",
|
||||||
"hitpoints": 8,
|
"hitpoints": 160,
|
||||||
"combatLevel": 170,
|
"combatLevel": 170,
|
||||||
"slayerLevel": 1,
|
"slayerLevel": 1,
|
||||||
"attackSpeed": 4
|
"attackSpeed": 4,
|
||||||
|
"attackLevel": 200,
|
||||||
|
"strengthLevel": 200,
|
||||||
|
"defenceLevel": 1,
|
||||||
|
"rangeLevel": 1,
|
||||||
|
"magicLevel": 1
|
||||||
},
|
},
|
||||||
"6342": {
|
"6342": {
|
||||||
"name": "Barrelchest",
|
"name": "Barrelchest",
|
||||||
@@ -28249,7 +28195,9 @@
|
|||||||
"strengthLevel": 1,
|
"strengthLevel": 1,
|
||||||
"defenceLevel": 1,
|
"defenceLevel": 1,
|
||||||
"rangeLevel": 1,
|
"rangeLevel": 1,
|
||||||
"magicLevel": 1
|
"magicLevel": 1,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
},
|
},
|
||||||
"6402": {
|
"6402": {
|
||||||
"name": "Mosquito swarm",
|
"name": "Mosquito swarm",
|
||||||
@@ -29533,7 +29481,7 @@
|
|||||||
"hitpoints": 130,
|
"hitpoints": 130,
|
||||||
"combatLevel": 80,
|
"combatLevel": 80,
|
||||||
"slayerLevel": 1,
|
"slayerLevel": 1,
|
||||||
"attackSpeed": 6,
|
"attackSpeed": 4,
|
||||||
"attackLevel": 55,
|
"attackLevel": 55,
|
||||||
"strengthLevel": 60,
|
"strengthLevel": 60,
|
||||||
"defenceLevel": 50,
|
"defenceLevel": 50,
|
||||||
@@ -35559,6 +35507,7 @@
|
|||||||
"name": "Galvek",
|
"name": "Galvek",
|
||||||
"hitpoints": 1200,
|
"hitpoints": 1200,
|
||||||
"combatLevel": 608,
|
"combatLevel": 608,
|
||||||
|
"attackSpeed": 6,
|
||||||
"attackLevel": 632,
|
"attackLevel": 632,
|
||||||
"strengthLevel": 268,
|
"strengthLevel": 268,
|
||||||
"defenceLevel": 188,
|
"defenceLevel": 188,
|
||||||
@@ -35575,12 +35524,14 @@
|
|||||||
"bonusRangeStrength": 6,
|
"bonusRangeStrength": 6,
|
||||||
"bonusMagicDamage": 42,
|
"bonusMagicDamage": 42,
|
||||||
"poisonImmune": true,
|
"poisonImmune": true,
|
||||||
"venomImmune": true
|
"venomImmune": true,
|
||||||
|
"dragon": true
|
||||||
},
|
},
|
||||||
"8095": {
|
"8095": {
|
||||||
"name": "Galvek",
|
"name": "Galvek",
|
||||||
"hitpoints": 1200,
|
"hitpoints": 1200,
|
||||||
"combatLevel": 608,
|
"combatLevel": 608,
|
||||||
|
"attackSpeed": 6,
|
||||||
"attackLevel": 632,
|
"attackLevel": 632,
|
||||||
"strengthLevel": 268,
|
"strengthLevel": 268,
|
||||||
"defenceLevel": 188,
|
"defenceLevel": 188,
|
||||||
@@ -35597,7 +35548,8 @@
|
|||||||
"bonusRangeStrength": 6,
|
"bonusRangeStrength": 6,
|
||||||
"bonusMagicDamage": 42,
|
"bonusMagicDamage": 42,
|
||||||
"poisonImmune": true,
|
"poisonImmune": true,
|
||||||
"venomImmune": true
|
"venomImmune": true,
|
||||||
|
"dragon": true
|
||||||
},
|
},
|
||||||
"8096": {
|
"8096": {
|
||||||
"name": "Galvek",
|
"name": "Galvek",
|
||||||
@@ -35753,6 +35705,7 @@
|
|||||||
"name": "Galvek",
|
"name": "Galvek",
|
||||||
"hitpoints": 1200,
|
"hitpoints": 1200,
|
||||||
"combatLevel": 608,
|
"combatLevel": 608,
|
||||||
|
"attackSpeed": 6,
|
||||||
"attackLevel": 632,
|
"attackLevel": 632,
|
||||||
"strengthLevel": 268,
|
"strengthLevel": 268,
|
||||||
"defenceLevel": 188,
|
"defenceLevel": 188,
|
||||||
@@ -35769,7 +35722,8 @@
|
|||||||
"bonusRangeStrength": 6,
|
"bonusRangeStrength": 6,
|
||||||
"bonusMagicDamage": 42,
|
"bonusMagicDamage": 42,
|
||||||
"poisonImmune": true,
|
"poisonImmune": true,
|
||||||
"venomImmune": true
|
"venomImmune": true,
|
||||||
|
"dragon": true
|
||||||
},
|
},
|
||||||
"8178": {
|
"8178": {
|
||||||
"name": "Galvek",
|
"name": "Galvek",
|
||||||
@@ -38227,5 +38181,196 @@
|
|||||||
"bonusAttack": 14,
|
"bonusAttack": 14,
|
||||||
"bonusStrength": 28,
|
"bonusStrength": 28,
|
||||||
"bonusRangeStrength": 28
|
"bonusRangeStrength": 28
|
||||||
|
},
|
||||||
|
"9258": {
|
||||||
|
"name": "Basilisk Sentinel",
|
||||||
|
"hitpoints": 460,
|
||||||
|
"combatLevel": 351,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 4,
|
||||||
|
"attackLevel": 274,
|
||||||
|
"strengthLevel": 274,
|
||||||
|
"defenceLevel": 274,
|
||||||
|
"rangeLevel": 1,
|
||||||
|
"magicLevel": 274,
|
||||||
|
"stabDef": 40,
|
||||||
|
"slashDef": 40,
|
||||||
|
"magicDef": 40
|
||||||
|
},
|
||||||
|
"9282": {
|
||||||
|
"name": "Basilisk Youngling",
|
||||||
|
"hitpoints": 60,
|
||||||
|
"combatLevel": 57,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 4,
|
||||||
|
"attackLevel": 25,
|
||||||
|
"strengthLevel": 40,
|
||||||
|
"defenceLevel": 70,
|
||||||
|
"rangeLevel": 1,
|
||||||
|
"magicLevel": 1,
|
||||||
|
"stabDef": 20,
|
||||||
|
"slashDef": 20,
|
||||||
|
"magicDef": 20
|
||||||
|
},
|
||||||
|
"9287": {
|
||||||
|
"name": "Monstrous Basilisk",
|
||||||
|
"hitpoints": 170,
|
||||||
|
"combatLevel": 135,
|
||||||
|
"attackSpeed": 4,
|
||||||
|
"attackLevel": 88,
|
||||||
|
"strengthLevel": 98,
|
||||||
|
"defenceLevel": 130,
|
||||||
|
"rangeLevel": 1,
|
||||||
|
"magicLevel": 1,
|
||||||
|
"stabDef": 35,
|
||||||
|
"slashDef": 35,
|
||||||
|
"magicDef": 35,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
|
},
|
||||||
|
"9288": {
|
||||||
|
"name": "Monstrous Basilisk",
|
||||||
|
"hitpoints": 170,
|
||||||
|
"combatLevel": 135,
|
||||||
|
"attackSpeed": 4,
|
||||||
|
"attackLevel": 88,
|
||||||
|
"strengthLevel": 98,
|
||||||
|
"defenceLevel": 130,
|
||||||
|
"rangeLevel": 1,
|
||||||
|
"magicLevel": 1,
|
||||||
|
"stabDef": 35,
|
||||||
|
"slashDef": 35,
|
||||||
|
"magicDef": 35,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
|
},
|
||||||
|
"9289": {
|
||||||
|
"name": "The Jormungand",
|
||||||
|
"hitpoints": 600,
|
||||||
|
"combatLevel": 363,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 5,
|
||||||
|
"attackLevel": 180,
|
||||||
|
"strengthLevel": 180,
|
||||||
|
"defenceLevel": 180,
|
||||||
|
"rangeLevel": 180,
|
||||||
|
"magicLevel": 180,
|
||||||
|
"stabDef": 50,
|
||||||
|
"slashDef": 50,
|
||||||
|
"crushDef": 10,
|
||||||
|
"rangeDef": 50,
|
||||||
|
"magicDef": 50,
|
||||||
|
"bonusStrength": 12,
|
||||||
|
"bonusRangeStrength": 12,
|
||||||
|
"bonusMagicDamage": 12
|
||||||
|
},
|
||||||
|
"9290": {
|
||||||
|
"name": "The Jormungand",
|
||||||
|
"hitpoints": 600,
|
||||||
|
"combatLevel": 363,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 5,
|
||||||
|
"attackLevel": 180,
|
||||||
|
"strengthLevel": 180,
|
||||||
|
"defenceLevel": 180,
|
||||||
|
"rangeLevel": 180,
|
||||||
|
"magicLevel": 180,
|
||||||
|
"stabDef": 50,
|
||||||
|
"slashDef": 50,
|
||||||
|
"crushDef": 10,
|
||||||
|
"rangeDef": 50,
|
||||||
|
"magicDef": 50,
|
||||||
|
"bonusStrength": 12,
|
||||||
|
"bonusRangeStrength": 12,
|
||||||
|
"bonusMagicDamage": 12
|
||||||
|
},
|
||||||
|
"9291": {
|
||||||
|
"name": "The Jormungand",
|
||||||
|
"hitpoints": 600,
|
||||||
|
"combatLevel": 363,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 5,
|
||||||
|
"attackLevel": 180,
|
||||||
|
"strengthLevel": 180,
|
||||||
|
"defenceLevel": 180,
|
||||||
|
"rangeLevel": 180,
|
||||||
|
"magicLevel": 180,
|
||||||
|
"stabDef": 50,
|
||||||
|
"slashDef": 50,
|
||||||
|
"crushDef": 10,
|
||||||
|
"rangeDef": 50,
|
||||||
|
"magicDef": 50,
|
||||||
|
"bonusStrength": 12,
|
||||||
|
"bonusRangeStrength": 12,
|
||||||
|
"bonusMagicDamage": 12
|
||||||
|
},
|
||||||
|
"9292": {
|
||||||
|
"name": "The Jormungand",
|
||||||
|
"hitpoints": 600,
|
||||||
|
"combatLevel": 363,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 5,
|
||||||
|
"attackLevel": 180,
|
||||||
|
"strengthLevel": 180,
|
||||||
|
"defenceLevel": 180,
|
||||||
|
"rangeLevel": 180,
|
||||||
|
"magicLevel": 180,
|
||||||
|
"stabDef": 50,
|
||||||
|
"slashDef": 50,
|
||||||
|
"crushDef": 10,
|
||||||
|
"rangeDef": 50,
|
||||||
|
"magicDef": 50,
|
||||||
|
"bonusStrength": 12,
|
||||||
|
"bonusRangeStrength": 12,
|
||||||
|
"bonusMagicDamage": 12
|
||||||
|
},
|
||||||
|
"9293": {
|
||||||
|
"name": "Basilisk Knight",
|
||||||
|
"hitpoints": 200,
|
||||||
|
"combatLevel": 182,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 4,
|
||||||
|
"attackLevel": 150,
|
||||||
|
"strengthLevel": 150,
|
||||||
|
"defenceLevel": 150,
|
||||||
|
"rangeLevel": 1,
|
||||||
|
"magicLevel": 150,
|
||||||
|
"stabDef": 25,
|
||||||
|
"slashDef": 25,
|
||||||
|
"magicDef": 25
|
||||||
|
},
|
||||||
|
"9295": {
|
||||||
|
"name": "Typhor",
|
||||||
|
"hitpoints": 280,
|
||||||
|
"combatLevel": 194,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 4,
|
||||||
|
"attackLevel": 150,
|
||||||
|
"strengthLevel": 150,
|
||||||
|
"defenceLevel": 150,
|
||||||
|
"rangeLevel": 1,
|
||||||
|
"magicLevel": 150,
|
||||||
|
"stabDef": 25,
|
||||||
|
"slashDef": 25,
|
||||||
|
"magicDef": 25,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
|
},
|
||||||
|
"9296": {
|
||||||
|
"name": "Typhor",
|
||||||
|
"hitpoints": 280,
|
||||||
|
"combatLevel": 194,
|
||||||
|
"slayerLevel": 40,
|
||||||
|
"attackSpeed": 4,
|
||||||
|
"attackLevel": 150,
|
||||||
|
"strengthLevel": 150,
|
||||||
|
"defenceLevel": 150,
|
||||||
|
"rangeLevel": 1,
|
||||||
|
"magicLevel": 150,
|
||||||
|
"stabDef": 25,
|
||||||
|
"slashDef": 25,
|
||||||
|
"magicDef": 25,
|
||||||
|
"poisonImmune": true,
|
||||||
|
"venomImmune": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user