diff --git a/buildSrc/src/main/kotlin/BootstrapPlugin.kt b/buildSrc/src/main/kotlin/BootstrapPlugin.kt index 27cd666f45..445959fe45 100644 --- a/buildSrc/src/main/kotlin/BootstrapPlugin.kt +++ b/buildSrc/src/main/kotlin/BootstrapPlugin.kt @@ -14,7 +14,6 @@ class BootstrapPlugin : Plugin { bootstrapDependencies(project(":runelite-api")) bootstrapDependencies(project(":runescape-api")) bootstrapDependencies(project(":http-api")) - bootstrapDependencies(project(":injector")) bootstrapDependencies(project(":runelite-client")) } @@ -31,7 +30,6 @@ class BootstrapPlugin : Plugin { dependsOn(project(":runelite-api").tasks["publish"]) dependsOn(project(":runescape-api").tasks["publish"]) dependsOn(project(":http-api").tasks["publish"]) - dependsOn(project(":injector").tasks["publish"]) doLast { copy { @@ -41,7 +39,6 @@ class BootstrapPlugin : Plugin { copy { from( "${buildDir}/repo/.", - "${parent?.projectDir}/injector/build/repo/.", "${parent?.projectDir}/runelite-api/build/repo/.", "${parent?.projectDir}/http-api/build/repo/.", "${parent?.projectDir}/runescape-api/build/repo/." diff --git a/buildSrc/src/main/kotlin/BootstrapTask.kt b/buildSrc/src/main/kotlin/BootstrapTask.kt index b4769207c8..3eaf7dcebb 100644 --- a/buildSrc/src/main/kotlin/BootstrapTask.kt +++ b/buildSrc/src/main/kotlin/BootstrapTask.kt @@ -6,6 +6,7 @@ import org.gradle.kotlin.dsl.get import java.io.File import java.security.MessageDigest import javax.inject.Inject +import kotlin.system.exitProcess open class BootstrapTask @Inject constructor(@Input val type: String) : DefaultTask() { @@ -42,8 +43,7 @@ open class BootstrapTask @Inject constructor(@Input val type: String) : DefaultT val version = splat[2] lateinit var path: String - if (it.file.name.contains("injected-client") || - it.file.name.contains("runelite-client") || + if (it.file.name.contains("runelite-client") || it.file.name.contains("http-api") || it.file.name.contains("runescape-api") || it.file.name.contains("runelite-api")) { @@ -63,6 +63,21 @@ open class BootstrapTask @Inject constructor(@Input val type: String) : DefaultT } path += "${name}/$version/${name}-$version.jar" } + else if (it.file.name.contains("gluegen")) + { + path = "http://repo.runelite.net/net/runelite/gluegen/gluegen-rt/" + version + "/" + it.file.name + } + else if (it.file.name.contains("jogl")) + { + path = "http://repo.runelite.net/net/runelite/jogl/jogl-all/" + version + "/" + it.file.name + } + else + { + println("ERROR: " + it.file.name + " has no download path!") + exitProcess(-1) + } + + val filePath = it.file.absolutePath val artifactFile = File(filePath) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index d4748a80ee..7f661d29d5 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -25,7 +25,7 @@ object ProjectVersions { const val launcherVersion = "2.2.0" - const val rlVersion = "1.6.35" + const val rlVersion = "1.6.36" const val openosrsVersion = "3.5.4" diff --git a/deobfuscator/src/main/java/net/runelite/deob/Deob.java b/deobfuscator/src/main/java/net/runelite/deob/Deob.java index ebe8aca6df..ae6e4a71a5 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/Deob.java +++ b/deobfuscator/src/main/java/net/runelite/deob/Deob.java @@ -77,7 +77,7 @@ public class Deob Stopwatch stopwatch = Stopwatch.createStarted(); - ClassGroup group = JarUtil.loadJar(new File(args[0])); + ClassGroup group = JarUtil.load(new File(args[0])); // remove except RuntimeException run(group, new RuntimeExceptions()); @@ -137,7 +137,7 @@ public class Deob //new MaxMemoryTransformer().transform(group); //new RuneliteBufferTransformer().transform(group); - JarUtil.saveJar(group, new File(args[1])); + JarUtil.save(group, new File(args[1])); stopwatch.stop(); logger.info("Done in {}", stopwatch); diff --git a/deobfuscator/src/main/java/net/runelite/deob/updater/UpdateMappings.java b/deobfuscator/src/main/java/net/runelite/deob/updater/UpdateMappings.java index 456eef2c8f..e1bb33be68 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/updater/UpdateMappings.java +++ b/deobfuscator/src/main/java/net/runelite/deob/updater/UpdateMappings.java @@ -82,7 +82,7 @@ public class UpdateMappings public void save(File out) throws IOException { - JarUtil.saveJar(group2, out); + JarUtil.save(group2, out); } public static void main(String[] args) throws IOException @@ -93,8 +93,8 @@ public class UpdateMappings } UpdateMappings u = new UpdateMappings( - JarUtil.loadJar(new File(args[0])), - JarUtil.loadJar(new File(args[1])) + JarUtil.load(new File(args[0])), + JarUtil.load(new File(args[1])) ); u.update(); u.save(new File(args[2])); diff --git a/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java b/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java index 8cd73d50ef..eeac2fdf71 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java +++ b/deobfuscator/src/main/java/net/runelite/deob/util/JarUtil.java @@ -49,7 +49,7 @@ public class JarUtil { private static final Logger logger = LoggerFactory.getLogger(JarUtil.class); - public static ClassGroup loadJar(File jarfile) throws IOException + public static ClassGroup load(File jarfile) { ClassGroup group = new ClassGroup(); @@ -74,6 +74,10 @@ public class JarUtil group.addClass(cv.getClassFile()); } } + catch (IOException e) + { + e.printStackTrace(); + } group.initialize(); @@ -115,7 +119,7 @@ public class JarUtil return group; } - public static void saveJar(ClassGroup group, File jarfile) throws IOException + public static void save(ClassGroup group, File jarfile) { try (JarOutputStream jout = new JarOutputStream(new FileOutputStream(jarfile))) { @@ -131,6 +135,10 @@ public class JarUtil jout.closeEntry(); } } + catch (IOException e) + { + e.printStackTrace(); + } } public static byte[] writeClass(ClassGroup group, ClassFile cf) diff --git a/deobfuscator/src/test/java/net/runelite/asm/execution/ExecutionTest.java b/deobfuscator/src/test/java/net/runelite/asm/execution/ExecutionTest.java index ddc8c728f5..df7c3d20e3 100644 --- a/deobfuscator/src/test/java/net/runelite/asm/execution/ExecutionTest.java +++ b/deobfuscator/src/test/java/net/runelite/asm/execution/ExecutionTest.java @@ -39,7 +39,7 @@ public class ExecutionTest @Test public void test() throws Exception { - ClassGroup group1 = JarUtil.loadJar(new File(properties.getVanillaClient())); + ClassGroup group1 = JarUtil.load(new File(properties.getVanillaClient())); Execution e = new Execution(group1); e.populateInitialMethods(); e.run(); diff --git a/deobfuscator/src/test/java/net/runelite/asm/visitors/ClassFileVisitorTest.java b/deobfuscator/src/test/java/net/runelite/asm/visitors/ClassFileVisitorTest.java index 6c9ec91978..4c19f8bc00 100644 --- a/deobfuscator/src/test/java/net/runelite/asm/visitors/ClassFileVisitorTest.java +++ b/deobfuscator/src/test/java/net/runelite/asm/visitors/ClassFileVisitorTest.java @@ -45,9 +45,9 @@ public class ClassFileVisitorTest @Test public void test() throws Exception { - ClassGroup group = JarUtil.loadJar(new File(properties.getVanillaClient())); + ClassGroup group = JarUtil.load(new File(properties.getVanillaClient())); - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } } diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/EnumDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/EnumDeobfuscatorTest.java index e601721f10..3ff974e67e 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/EnumDeobfuscatorTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/EnumDeobfuscatorTest.java @@ -50,13 +50,13 @@ public class EnumDeobfuscatorTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getRsClient())); + group = JarUtil.load(new File(properties.getRsClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/FieldInlinerTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/FieldInlinerTest.java index 873bc2fea8..330ad80257 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/FieldInlinerTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/FieldInlinerTest.java @@ -50,13 +50,13 @@ public class FieldInlinerTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/IllegalStateExceptionsTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/IllegalStateExceptionsTest.java index a377150da4..f11fa566ba 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/IllegalStateExceptionsTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/IllegalStateExceptionsTest.java @@ -50,13 +50,13 @@ public class IllegalStateExceptionsTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/OrderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/OrderTest.java index 99ea7e14f9..bfd1bb3f95 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/OrderTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/OrderTest.java @@ -50,13 +50,13 @@ public class OrderTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/PacketHandlerOrderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/PacketHandlerOrderTest.java index cbe09d27b1..cc8bb41fee 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/PacketHandlerOrderTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/PacketHandlerOrderTest.java @@ -50,13 +50,13 @@ public class PacketHandlerOrderTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getRsClient())); + group = JarUtil.load(new File(properties.getRsClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RenameUniqueTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RenameUniqueTest.java index 5082b90737..fc0c556d52 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RenameUniqueTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RenameUniqueTest.java @@ -58,13 +58,13 @@ public class RenameUniqueTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RuntimeExceptionsTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RuntimeExceptionsTest.java index 90dcf26624..f0f0311a1d 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RuntimeExceptionsTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/RuntimeExceptionsTest.java @@ -50,13 +50,13 @@ public class RuntimeExceptionsTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnreachedCodeTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnreachedCodeTest.java index fe018ccca6..d20f72641c 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnreachedCodeTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnreachedCodeTest.java @@ -59,7 +59,7 @@ public class UnreachedCodeTest @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedClassTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedClassTest.java index 7944334633..da2ae00fb9 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedClassTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedClassTest.java @@ -75,7 +75,7 @@ public class UnusedClassTest @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedFieldsTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedFieldsTest.java index 58a92d69ba..653e1f0a4a 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedFieldsTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedFieldsTest.java @@ -50,13 +50,13 @@ public class UnusedFieldsTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedMethodsTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedMethodsTest.java index d76e5a929b..ee016e3294 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedMethodsTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedMethodsTest.java @@ -50,13 +50,13 @@ public class UnusedMethodsTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedParametersTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedParametersTest.java index 584c96315a..36d6894dfc 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedParametersTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/UnusedParametersTest.java @@ -50,13 +50,13 @@ public class UnusedParametersTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/ModArithTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/ModArithTest.java index 3b9a386d16..7cab6cb79e 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/ModArithTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/ModArithTest.java @@ -51,13 +51,13 @@ public class ModArithTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyZeroDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyZeroDeobfuscatorTest.java index 038276978c..7efdbc72b0 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyZeroDeobfuscatorTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/arithmetic/MultiplyZeroDeobfuscatorTest.java @@ -51,13 +51,13 @@ public class MultiplyZeroDeobfuscatorTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/cfg/ControlFlowDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/cfg/ControlFlowDeobfuscatorTest.java index 0b79273ff0..87e5386bde 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/cfg/ControlFlowDeobfuscatorTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/cfg/ControlFlowDeobfuscatorTest.java @@ -50,13 +50,13 @@ public class ControlFlowDeobfuscatorTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/constparam/ConstantParameterTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/constparam/ConstantParameterTest.java index e2b5d6f7a4..6499f781b1 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/constparam/ConstantParameterTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/constparam/ConstantParameterTest.java @@ -50,13 +50,13 @@ public class ConstantParameterTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getVanillaClient())); + group = JarUtil.load(new File(properties.getVanillaClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/mapping/MappingDumper.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/mapping/MappingDumper.java index 7818f9cf7e..8941ca2eb3 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/mapping/MappingDumper.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/mapping/MappingDumper.java @@ -59,7 +59,7 @@ public class MappingDumper @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getRsClient())); + group = JarUtil.load(new File(properties.getRsClient())); } @Test @@ -72,7 +72,7 @@ public class MappingDumper @Test public void dump() throws IOException { - ClassGroup group = JarUtil.loadJar(new File(properties.getRsClient())); + ClassGroup group = JarUtil.load(new File(properties.getRsClient())); final String GAP = "%-40s"; int classes = 0, methods = 0, fields = 0; @@ -321,7 +321,7 @@ public class MappingDumper @Test public void dumpTiny() throws IOException { - ClassGroup group = JarUtil.loadJar(new File(properties.getRsClient())); + ClassGroup group = JarUtil.load(new File(properties.getRsClient())); System.out.println("v1\tofficial\tintermediary"); for (ClassFile clazz : group.getClasses()) { @@ -379,7 +379,7 @@ public class MappingDumper @Test public void dumpJson() throws IOException { - ClassGroup group = JarUtil.loadJar(new File(properties.getRsClient())); + ClassGroup group = JarUtil.load(new File(properties.getRsClient())); Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonObject jObject = new JsonObject(); diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/menuaction/MenuActionDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/menuaction/MenuActionDeobfuscatorTest.java index 04cac6d48b..f301a1a550 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/menuaction/MenuActionDeobfuscatorTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/menuaction/MenuActionDeobfuscatorTest.java @@ -50,13 +50,13 @@ public class MenuActionDeobfuscatorTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getRsClient())); + group = JarUtil.load(new File(properties.getRsClient())); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packethandler/PacketTypeFinderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packethandler/PacketTypeFinderTest.java index 7d99526284..bae9445ed5 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packethandler/PacketTypeFinderTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packethandler/PacketTypeFinderTest.java @@ -49,7 +49,7 @@ public class PacketTypeFinderTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getRsClient())); + group = JarUtil.load(new File(properties.getRsClient())); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packetwrite/PacketWriteDeobfuscatorTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packetwrite/PacketWriteDeobfuscatorTest.java index 690994ec9b..0db78f67fa 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packetwrite/PacketWriteDeobfuscatorTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/packetwrite/PacketWriteDeobfuscatorTest.java @@ -51,14 +51,14 @@ public class PacketWriteDeobfuscatorTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getRsClient())); + group = JarUtil.load(new File(properties.getRsClient())); group.removeClass(group.findClass("net/runelite/rs/Reflection")); } @After public void after() throws IOException { - JarUtil.saveJar(group, folder.newFile()); + JarUtil.save(group, folder.newFile()); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/ClientErrorTransformerTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/ClientErrorTransformerTest.java index e6652df964..4e66d5517b 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/ClientErrorTransformerTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/ClientErrorTransformerTest.java @@ -51,7 +51,7 @@ public class ClientErrorTransformerTest @Before public void before() throws IOException { - group = JarUtil.loadJar(GAMEPACK); + group = JarUtil.load(GAMEPACK); } @After @@ -59,7 +59,7 @@ public class ClientErrorTransformerTest { File out = folder.newFile(); - JarUtil.saveJar(group, out); + JarUtil.save(group, out); logger.info("Wrote to {}", out); } diff --git a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/BufferFinderTest.java b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/BufferFinderTest.java index b15af465e1..29e874f2ae 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/BufferFinderTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/deobfuscators/transformers/buffer/BufferFinderTest.java @@ -49,7 +49,7 @@ public class BufferFinderTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getRsClient())); + group = JarUtil.load(new File(properties.getRsClient())); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java index 04571a31b3..0971830c5b 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java @@ -31,7 +31,7 @@ public class AnnotationCleaner { final List missing = new ArrayList<>(); File client = new File(properties.getRsClient()); - ClassGroup group = JarUtil.loadJar(client); + ClassGroup group = JarUtil.load(client); for (ClassFile c : group.getClasses()) { @@ -113,11 +113,11 @@ public class AnnotationCleaner { File client = new File(properties.getRsClient()); - ClassGroup group = JarUtil.loadJar(client); + ClassGroup group = JarUtil.load(client); new AnnotationAdder(group).run(); - JarUtil.saveJar(group, new File("C:/Users/Lucas/Desktop/niec.jar")); + JarUtil.save(group, new File("C:/Users/Lucas/Desktop/niec.jar")); } private static class OhNoException extends Exception diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCopierTest.java b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCopierTest.java index da8f3938d3..5462708b59 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCopierTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCopierTest.java @@ -47,14 +47,14 @@ public class AnnotationCopierTest @Before public void before() throws IOException { - group1 = JarUtil.loadJar(new File(JAR1)); - group2 = JarUtil.loadJar(new File(JAR2)); + group1 = JarUtil.load(new File(JAR1)); + group2 = JarUtil.load(new File(JAR2)); } @After public void after() throws IOException { - JarUtil.saveJar(group2, new File(OUT)); + JarUtil.save(group2, new File(OUT)); } //@Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationRenamerTest.java b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationRenamerTest.java index b13f0754d3..f47251d1c2 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationRenamerTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationRenamerTest.java @@ -42,13 +42,13 @@ public class AnnotationRenamerTest @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(JAR)); + group = JarUtil.load(new File(JAR)); } @After public void after() throws IOException { - JarUtil.saveJar(group, new File(OUT)); + JarUtil.save(group, new File(OUT)); } //@Test diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/UpdateMappingsTest.java b/deobfuscator/src/test/java/net/runelite/deob/updater/UpdateMappingsTest.java index eea6cea7ab..677549b692 100644 --- a/deobfuscator/src/test/java/net/runelite/deob/updater/UpdateMappingsTest.java +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/UpdateMappingsTest.java @@ -62,12 +62,12 @@ public class UpdateMappingsTest { File client = new File(properties.getRsClient()); - ClassGroup group1 = JarUtil.loadJar(client); - ClassGroup group2 = JarUtil.loadJar(new File(JAR)); + ClassGroup group1 = JarUtil.load(client); + ClassGroup group2 = JarUtil.load(new File(JAR)); map(group1, group2); - JarUtil.saveJar(group2, new File(OUT)); + JarUtil.save(group2, new File(OUT)); } @Test @@ -76,8 +76,8 @@ public class UpdateMappingsTest { File client = new File(properties.getRsClient()); - ClassGroup group1 = JarUtil.loadJar(client); - ClassGroup group2 = JarUtil.loadJar(client); + ClassGroup group1 = JarUtil.load(client); + ClassGroup group2 = JarUtil.load(client); // Remove existing annotations unannotate(group2); @@ -94,11 +94,11 @@ public class UpdateMappingsTest { File client = new File("C:\\Users\\Lucas\\IdeaProjects\\runelitexxx\\client.jar"); - ClassGroup group = JarUtil.loadJar(client); + ClassGroup group = JarUtil.load(client); new ScriptOpcodesTransformer().transform(group); - JarUtil.saveJar(group, new File("C:/Users/Lucas/Desktop/Apapapapapap.jar")); + JarUtil.save(group, new File("C:/Users/Lucas/Desktop/Apapapapapap.jar")); } private void unannotate(ClassGroup group) diff --git a/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java b/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java index 5475b69558..79a6b823da 100644 --- a/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java +++ b/deobfuscator/src/test/java/net/runelite/osb/HookImporter.java @@ -72,13 +72,13 @@ public class HookImporter java.lang.reflect.Type type = new TypeToken>() {}.getType(); hooks = gson.fromJson(new InputStreamReader(is), type); - group = JarUtil.loadJar(IN); + group = JarUtil.load(IN); } @After public void after() throws IOException { - JarUtil.saveJar(group, OUT); + JarUtil.save(group, OUT); } @Test diff --git a/deobfuscator/src/test/java/net/runelite/runeloader/MappingImporter.java b/deobfuscator/src/test/java/net/runelite/runeloader/MappingImporter.java index 62c23e3651..5ae4e13b2c 100644 --- a/deobfuscator/src/test/java/net/runelite/runeloader/MappingImporter.java +++ b/deobfuscator/src/test/java/net/runelite/runeloader/MappingImporter.java @@ -64,13 +64,13 @@ public class MappingImporter @Before public void before() throws IOException { - group = JarUtil.loadJar(IN); + group = JarUtil.load(IN); } @After public void after() throws IOException { - JarUtil.saveJar(group, OUT); + JarUtil.save(group, OUT); } private boolean hasObfuscatedName(Annotated an, String name) diff --git a/deobfuscator/src/test/java/net/runelite/runesuite/HookImporter.java b/deobfuscator/src/test/java/net/runelite/runesuite/HookImporter.java index 0c661b69df..c15b5336b0 100644 --- a/deobfuscator/src/test/java/net/runelite/runesuite/HookImporter.java +++ b/deobfuscator/src/test/java/net/runelite/runesuite/HookImporter.java @@ -75,7 +75,7 @@ public class HookImporter @Before public void before() throws IOException { - group = JarUtil.loadJar(new File(properties.getRsClient())); + group = JarUtil.load(new File(properties.getRsClient())); InputStream is = getClass().getResourceAsStream("hooks.json"); Gson gson = new Gson(); @@ -87,7 +87,7 @@ public class HookImporter public void after() throws IOException { File out = folder.newFile("client.jar"); - JarUtil.saveJar(group, out); + JarUtil.save(group, out); logger.info("Wrote to {}", out); } diff --git a/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeTrade.java b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeTrade.java index bb49ea6393..fd6f6635d3 100644 --- a/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeTrade.java +++ b/http-api/src/main/java/net/runelite/http/api/ge/GrandExchangeTrade.java @@ -45,4 +45,4 @@ public class GrandExchangeTrade private WorldType worldType; private int seq; private Instant resetTime; -} \ No newline at end of file +} diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java index aae95b9b83..949a022254 100644 --- a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java @@ -65,6 +65,7 @@ public class HiscoreResult private Skill clueScrollElite; private Skill clueScrollMaster; private Skill lastManStanding; + private Skill soulWarsZeal; private Skill abyssalSire; private Skill alchemicalHydra; private Skill barrowsChests; @@ -184,6 +185,8 @@ public class HiscoreResult return getClueScrollMaster(); case LAST_MAN_STANDING: return getLastManStanding(); + case SOUL_WARS_ZEAL: + return getSoulWarsZeal(); case ABYSSAL_SIRE: return abyssalSire; case ALCHEMICAL_HYDRA: diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java index 430755e7dd..5631a5b713 100644 --- a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java @@ -87,6 +87,7 @@ class HiscoreResultBuilder hiscoreResult.setClueScrollElite(skills.get(index++)); hiscoreResult.setClueScrollMaster(skills.get(index++)); hiscoreResult.setLastManStanding(skills.get(index++)); + hiscoreResult.setSoulWarsZeal(skills.get(index++)); // seasonal doesn't have boss hiscores if (index < skills.size()) { diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java index e20fafac0f..caebed437d 100644 --- a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java @@ -69,6 +69,7 @@ public enum HiscoreSkill CLUE_SCROLL_ELITE("Clue Scrolls (elite)", ACTIVITY), CLUE_SCROLL_MASTER("Clue Scrolls (master)", ACTIVITY), LAST_MAN_STANDING("Last Man Standing", ACTIVITY), + SOUL_WARS_ZEAL("Soul Wars Zeal", ACTIVITY), ABYSSAL_SIRE("Abyssal Sire", BOSS), ALCHEMICAL_HYDRA("Alchemical Hydra", BOSS), BARROWS_CHESTS("Barrows Chests", BOSS), diff --git a/injector/injector.gradle.kts b/injector/injector.gradle.kts index 79e4cfc2c0..00c2bb7d3f 100644 --- a/injector/injector.gradle.kts +++ b/injector/injector.gradle.kts @@ -31,6 +31,9 @@ tasks.register("inject") { main = "com.openosrs.injector.Injector" classpath = sourceSets["main"].runtimeClasspath args(vanillaDep.singleFile, openosrsVersion) + outputs.upToDateWhen { + false + } } tasks { diff --git a/injector/src/main/java/com/openosrs/injector/Injector.java b/injector/src/main/java/com/openosrs/injector/Injector.java index 84d1429680..08294eb0d1 100644 --- a/injector/src/main/java/com/openosrs/injector/Injector.java +++ b/injector/src/main/java/com/openosrs/injector/Injector.java @@ -24,49 +24,36 @@ import com.openosrs.injector.injectors.raw.ScriptVM; import com.openosrs.injector.rsapi.RSApi; import com.openosrs.injector.transformers.InjectTransformer; import com.openosrs.injector.transformers.SourceChanger; +import static net.runelite.deob.util.JarUtil.load; +import static net.runelite.deob.util.JarUtil.save; import java.io.File; -import java.io.IOException; -import net.runelite.deob.util.JarUtil; +import java.util.Objects; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; public class Injector extends InjectData implements InjectTaskHandler { - private static final Logger log = Logging.getLogger(Injector.class); - - public Injector(File vanilla, File rsclient, File mixins, File[] rsapi) throws IOException - { - super( - JarUtil.loadJar(vanilla), - JarUtil.loadJar(rsclient), - JarUtil.loadJar(mixins), - new RSApi(rsapi) - ); - inject(); - save(new File("../runelite-client/src/main/resources/net/runelite/client/injected-client.oprs")); - } + static final Logger log = Logging.getLogger(Injector.class); + static Injector injector = new Injector(); + static File injectedClient = + new File("../runelite-client/src/main/resources/net/runelite/client/injected-client.oprs"); public static void main(String[] args) { - try - { - args = new String[] - { - args[0], - "../runescape-client/build/libs/runescape-client-" + args[1] + ".jar", - "../runelite-mixins/build/libs/runelite-mixins-" + args[1] + ".jar", - "../runescape-api/build/classes/java/main/net/runelite/rs/api/" - }; - new Injector(new File(args[0]), new File(args[1]), new File(args[2]), new File(args[3]).listFiles()); - } - catch (Exception e) - { - e.printStackTrace(); - } - + injector.vanilla = load(new File(args[0])); + injector.deobfuscated = load( + new File("../runescape-client/build/libs/runescape-client-" + args[1] + ".jar")); + injector.rsApi = new RSApi(Objects.requireNonNull( + new File("../runescape-api/build/classes/java/main/net/runelite/rs/api/") + .listFiles())); + injector.mixins = load( + new File("../runelite-mixins/build/libs/runelite-mixins-" + args[1] + ".jar")); + injector.initToVanilla(); + injector.injectVanilla(); + save(injector.getVanilla(), injectedClient); } - public void inject() + public void injectVanilla() { log.debug("[DEBUG] Starting injection"); @@ -106,13 +93,6 @@ public class Injector extends InjectData implements InjectTaskHandler transform(new SourceChanger(this)); } - public void save(File outputJar) throws IOException - { - log.info("[INFO] Saving jar to {}", outputJar.toString()); - - JarUtil.saveJar(this.getVanilla(), outputJar); - } - private void inject(com.openosrs.injector.injectors.Injector injector) { final String name = injector.getName(); diff --git a/injector/src/main/java/com/openosrs/injector/injection/InjectData.java b/injector/src/main/java/com/openosrs/injector/injection/InjectData.java index 28c763aec0..b201d83c06 100644 --- a/injector/src/main/java/com/openosrs/injector/injection/InjectData.java +++ b/injector/src/main/java/com/openosrs/injector/injection/InjectData.java @@ -31,21 +31,21 @@ public abstract class InjectData public static final String CALLBACKS = "net/runelite/api/hooks/Callbacks"; @Getter - private final ClassGroup vanilla; + public ClassGroup vanilla; @Getter - private final ClassGroup deobfuscated; + public ClassGroup deobfuscated; @Getter - private final ClassGroup mixins; + public ClassGroup mixins; @Getter - private final RSApi rsApi; + public RSApi rsApi; /** * Deobfuscated ClassFiles -> Vanilla ClassFiles */ - private final Map toVanilla; + public Map toVanilla; /** * Strings -> Deobfuscated ClassFiles @@ -55,18 +55,9 @@ public abstract class InjectData */ private final Map toDeob = new HashMap<>(); - public InjectData(ClassGroup vanilla, ClassGroup deobfuscated, ClassGroup mixins, RSApi rsApi) - { - this.vanilla = vanilla; - this.deobfuscated = deobfuscated; - this.rsApi = rsApi; - this.mixins = mixins; - this.toVanilla = initToVanilla(); - } - public abstract void runChildInjector(Injector injector); - private Map initToVanilla() + public void initToVanilla() { ImmutableMap.Builder toVanillaB = ImmutableMap.builder(); @@ -88,7 +79,7 @@ public abstract class InjectData } } - return toVanillaB.build(); + this.toVanilla = toVanillaB.build(); } /** diff --git a/injector/src/main/java/com/openosrs/injector/injection/InjectTaskHandler.java b/injector/src/main/java/com/openosrs/injector/injection/InjectTaskHandler.java index 4f7fad4586..a6f29b6f3e 100644 --- a/injector/src/main/java/com/openosrs/injector/injection/InjectTaskHandler.java +++ b/injector/src/main/java/com/openosrs/injector/injection/InjectTaskHandler.java @@ -7,9 +7,6 @@ */ package com.openosrs.injector.injection; -import java.io.File; -import java.io.IOException; - /** * Interface containing all the methods gradle needs to know about */ @@ -18,10 +15,5 @@ public interface InjectTaskHandler /** * The actual method that does all the work */ - void inject(); - - /** - * Call this to save the injected jar to outputJar - */ - void save(File outputJar) throws IOException; + void injectVanilla(); } diff --git a/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java b/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java index a9b4bf6b26..d904d3cb26 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java @@ -118,9 +118,9 @@ public class RSApiInjector extends AbstractInjector final Signature sig = apiMethod.getSignature(); - if (sig.isVoid()) + if (sig.size() == 1) { - if (sig.size() == 1) + if (sig.isVoid() || sig.getReturnValue().equals(Type.fromAsmString(apiMethod.getClazz().getName()))) { Type type = InjectUtil.apiToDeob(inject, sig.getTypeOfArg(0)); if (deobType.equals(type)) @@ -276,7 +276,7 @@ public class RSApiInjector extends AbstractInjector final ClassFile targetClass = InjectUtil.vanillaFromApiMethod(inject, apiMethod); apiMethod.setInjected(true); - if (apiMethod.getSignature().isVoid()) + if (apiMethod.getSignature().getArguments().size() == 1) { ++set; log.debug("[DEBUG] Injecting setter {} for {} into {}", apiMethod.getMethod(), field.getPoolField(), targetClass.getPoolClass()); diff --git a/injector/src/main/java/com/openosrs/injector/injectors/rsapi/InjectSetter.java b/injector/src/main/java/com/openosrs/injector/injectors/rsapi/InjectSetter.java index 492c5649f1..9eb137d2b7 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/rsapi/InjectSetter.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/rsapi/InjectSetter.java @@ -102,7 +102,15 @@ public class InjectSetter ins.add(new PutField(instructions, field)); } - ins.add(new VReturn(instructions)); + if (!apiMethod.getSignature().getReturnValue().equals(Type.VOID)) + { + ins.add(new ALoad(instructions, 0)); + ins.add(InjectUtil.createReturnForType(instructions, apiMethod.getSignature().getReturnValue())); + } + else + { + ins.add(new VReturn(instructions)); + } targetClass.addMethod(method); } diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index bdb614c17b..3ea377157c 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -526,6 +526,16 @@ public interface Client extends GameShell @Nullable Widget getWidget(int groupId, int childId); + /** + * Gets a widget by it's packed ID. + * + *

+ * Note: Use {@link #getWidget(WidgetInfo)} or {@link #getWidget(int, int)} for + * a more readable version of this method. + */ + @Nullable + Widget getWidget(int packedID); + /** * Gets an array containing the x-axis canvas positions * of all widgets. @@ -784,6 +794,15 @@ public interface Client extends GameShell */ void setVarbit(Varbits varbit, int value); + /** + * Gets the varbit composition for a given varbit id + * + * @param id + * @return + */ + @Nullable + VarbitComposition getVarbit(int id); + /** * Gets the value of a given variable. * @@ -817,10 +836,11 @@ public interface Client extends GameShell void setVarbitValue(int[] varps, int varbit, int value); /** - * Gets the varbit composition for a given varbit id + * Mark the given varp as changed, causing var listeners to be + * triggered next tick + * @param varp */ - @Nullable - VarbitComposition getVarbitDefinition(int id); + void queueChangedVarp(int varp); /** * Gets the widget flags table. @@ -898,16 +918,6 @@ public interface Client extends GameShell */ IterableHashTable getMessages(); - /** - * Gets the viewport widget. - *

- * The viewport is the area of the game above the chatbox - * and to the left of the mini-map. - * - * @return the viewport widget - */ - Widget getViewportWidget(); - /** * Gets the object composition corresponding to an objects ID. * @@ -926,6 +936,18 @@ public interface Client extends GameShell */ NPCComposition getNpcDefinition(int npcId); + /** + * Gets the {@link StructComposition} for a given struct ID + * + * @see StructID + */ + StructComposition getStructComposition(int structID); + + /** + * Gets the client's cache of in memory struct compositions + */ + NodeCache getStructCompositionCache(); + /** * Gets an array of all world areas * @@ -1017,6 +1039,18 @@ public interface Client extends GameShell */ List getGraphicsObjects(); + /** + * Gets the music volume + * @return volume 0-255 inclusive + */ + int getMusicVolume(); + + /** + * Sets the music volume + * @param volume 0-255 inclusive + */ + void setMusicVolume(int volume); + /** * Play a sound effect at the player's current location. This is how UI, * and player-generated (e.g. mining, woodcutting) sound effects are @@ -1160,6 +1194,20 @@ public interface Client extends GameShell */ String[] getStringStack(); + /** + * Gets the cs2 vm's active widget + * + * This is used for all {@code cc_*} operations with a {@code 0} operand + */ + Widget getScriptActiveWidget(); + + /** + * Gets the cs2 vm's "dot" widget + * + * This is used for all {@code .cc_*} operations with a {@code 1} operand + */ + Widget getScriptDotWidget(); + /** * Checks whether a player is on the friends list. * @@ -1329,11 +1377,21 @@ public interface Client extends GameShell *

* This method must be ran on the client thread and is not reentrant * + * This method is shorthand for {@code client.createScriptEvent(args).run()} + * * @param args the script id, then any additional arguments to execute the script with * @see ScriptID */ void runScript(Object... args); + /** + * Creates a blank ScriptEvent for executing a ClientScript2 script + * + * @param args the script id, then any additional arguments to execute the script with + * @see ScriptID + */ + ScriptEvent createScriptEvent(Object ...args); + /** * Checks whether or not there is any active hint arrow. * @@ -2063,15 +2121,4 @@ public interface Client extends GameShell void setOutdatedScript(String outdatedScript); List getOutdatedScripts(); - - //TODO: Implement - void queueChangedVarp(int varp); - - //TODO: Implement - VarbitComposition getVarbit(Integer id); - - Widget getWidget(int param1); - - //TODO: Implement - Widget getScriptActiveWidget(); } diff --git a/runelite-api/src/main/java/net/runelite/api/ItemComposition.java b/runelite-api/src/main/java/net/runelite/api/ItemComposition.java index b556ef1748..fcd0ce25a0 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemComposition.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemComposition.java @@ -5,7 +5,7 @@ import javax.annotation.Nullable; /** * Represents the template of a specific item type. */ -public interface ItemComposition +public interface ItemComposition extends ParamHolder { /** * Gets the items name. diff --git a/runelite-api/src/main/java/net/runelite/api/ItemID.java b/runelite-api/src/main/java/net/runelite/api/ItemID.java index 7228e36667..ed667b6b68 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemID.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemID.java @@ -624,7 +624,7 @@ public final class ItemID public static final int SILK = 950; public static final int SPADE = 952; public static final int ROPE = 954; - public static final int FLIER = 956; + public static final int FLYER = 956; public static final int GREY_WOLF_FUR = 958; public static final int PLANK = 960; public static final int CHRISTMAS_CRACKER = 962; @@ -3330,7 +3330,6 @@ public final class ItemID public static final int TILES = 5569; public static final int TILES_5570 = 5570; public static final int TILES_5571 = 5571; - public static final int DIAL = 5572; public static final int DESERT_AMULET = 5573; public static final int INITIATE_SALLET = 5574; public static final int INITIATE_HAUBERK = 5575; @@ -5008,7 +5007,7 @@ public final class ItemID public static final int SARADOMIN_ICON = 8058; public static final int ZAMORAK_ICON = 8059; public static final int GUTHIX_ICON = 8060; - public static final int ICON_OF_BOB = 8061; + public static final int BOB_ICON = 8061; public static final int OAK_ALTAR = 8062; public static final int TEAK_ALTAR = 8063; public static final int CLOTHCOVERED_ALTAR = 8064; @@ -10754,7 +10753,7 @@ public final class ItemID public static final int CRYSTAL_SAPLING = 23659; public static final int CRYSTAL_ACORN = 23661; public static final int DRAGONSTONE_ARMOUR_SET = 23667; - public static final int FLIER_23670 = 23670; + public static final int FLYER_23670 = 23670; public static final int CRYSTAL_AXE = 23673; public static final int CRYSTAL_AXE_INACTIVE = 23675; public static final int DRAGON_PICKAXE_OR = 23677; @@ -10946,9 +10945,7 @@ public final class ItemID public static final int CRYSTAL_SHIELD = 23991; public static final int CRYSTAL_SHIELD_INACTIVE = 23993; public static final int BLADE_OF_SAELDOR = 23995; - public static final int BLADE_OF_SAELDOR_23996 = 23996; public static final int BLADE_OF_SAELDOR_INACTIVE = 23997; - public static final int BLADE_OF_SAELDOR_INACTIVE_23999 = 23999; public static final int CRYSTAL_GRAIL = 24000; public static final int ELVEN_BOOTS = 24003; public static final int ELVEN_GLOVES = 24006; @@ -11494,19 +11491,18 @@ public final class ItemID public static final int CABBAGE_24994 = 24994; public static final int CABBAGE_24996 = 24996; public static final int TRAILBLAZER_HOOD_T3 = 25001; - public static final int TRAILBLAZER_COAT_T3 = 25004; + public static final int TRAILBLAZER_TOP_T3 = 25004; public static final int TRAILBLAZER_TROUSERS_T3 = 25007; public static final int TRAILBLAZER_BOOTS_T3 = 25010; public static final int TRAILBLAZER_CANE = 25013; public static final int TRAILBLAZER_HOOD_T2 = 25016; - public static final int TRAILBLAZER_COAT_T2 = 25019; + public static final int TRAILBLAZER_TOP_T2 = 25019; public static final int TRAILBLAZER_TROUSERS_T2 = 25022; public static final int TRAILBLAZER_BOOTS_T2 = 25025; public static final int TRAILBLAZER_HOOD_T1 = 25028; - public static final int TRAILBLAZER_COAT_T1 = 25031; + public static final int TRAILBLAZER_TOP_T1 = 25031; public static final int TRAILBLAZER_TROUSERS_T1 = 25034; public static final int TRAILBLAZER_BOOTS_T1 = 25037; - public static final int TRAILBLAZER_TROPHY = 25040; public static final int TRAILBLAZER_DRAGON_TROPHY = 25042; public static final int TRAILBLAZER_RUNE_TROPHY = 25044; public static final int TRAILBLAZER_ADAMANT_TROPHY = 25046; @@ -11515,9 +11511,9 @@ public final class ItemID public static final int TRAILBLAZER_IRON_TROPHY = 25052; public static final int TRAILBLAZER_BRONZE_TROPHY = 25054; public static final int TRAILBLAZER_BANNER = 25056; - public static final int TRAILBLAZER_HARPOON = 25059; - public static final int TRAILBLAZER_PICKAXE = 25063; - public static final int TRAILBLAZER_AXE = 25066; + public static final int INFERNAL_HARPOON_OR = 25059; + public static final int INFERNAL_PICKAXE_OR = 25063; + public static final int INFERNAL_AXE_OR = 25066; public static final int GRACEFUL_HOOD_25069 = 25069; public static final int GRACEFUL_HOOD_25071 = 25071; public static final int GRACEFUL_CAPE_25072 = 25072; @@ -11539,9 +11535,9 @@ public final class ItemID public static final int CRYSTAL_OF_MEMORIES = 25104; public static final int EXTRADIMENSIONAL_BAG = 25106; public static final int EXTRADIMENSIONAL_BAG_25108 = 25108; - public static final int TRAILBLAZER_AXE_25110 = 25110; - public static final int TRAILBLAZER_PICKAXE_25112 = 25112; - public static final int TRAILBLAZER_HARPOON_25114 = 25114; + public static final int TRAILBLAZER_AXE = 25110; + public static final int TRAILBLAZER_PICKAXE = 25112; + public static final int TRAILBLAZER_HARPOON = 25114; public static final int LEAGUE_TOMATO = 25117; public static final int BEEKEEPERS_HAT = 25129; public static final int BEEKEEPERS_TOP = 25131; @@ -11549,5 +11545,158 @@ public final class ItemID public static final int BEEKEEPERS_GLOVES = 25135; public static final int BEEKEEPERS_BOOTS = 25137; public static final int BONE_FRAGMENTS = 25139; + public static final int CLAY_HEAD = 25145; + public static final int FUR_HEAD = 25146; + public static final int BLOODY_HEAD = 25147; + public static final int NEILANS_JOURNAL = 25152; + public static final int ORNATE_UNDEAD_COMBAT_DUMMY = 25154; + public static final int DECORATIVE_BOOTS_BROKEN = 25155; + public static final int DECORATIVE_FULL_HELM_BROKEN = 25157; + public static final int CASTLEWARS_BREW4 = 25159; + public static final int CASTLEWARS_BREW3 = 25160; + public static final int CASTLEWARS_BREW2 = 25161; + public static final int CASTLEWARS_BREW1 = 25162; + public static final int DECORATIVE_BOOTS = 25163; + public static final int DECORATIVE_FULL_HELM = 25165; + public static final int DECORATIVE_BOOTS_25167 = 25167; + public static final int DECORATIVE_FULL_HELM_25169 = 25169; + public static final int DECORATIVE_BOOTS_25171 = 25171; + public static final int DECORATIVE_BOOTS_L = 25173; + public static final int DECORATIVE_FULL_HELM_25174 = 25174; + public static final int DECORATIVE_FULL_HELM_L = 25176; + public static final int SLAYER_HELMET_I_25177 = 25177; + public static final int BLACK_SLAYER_HELMET_I_25179 = 25179; + public static final int GREEN_SLAYER_HELMET_I_25181 = 25181; + public static final int RED_SLAYER_HELMET_I_25183 = 25183; + public static final int PURPLE_SLAYER_HELMET_I_25185 = 25185; + public static final int TURQUOISE_SLAYER_HELMET_I_25187 = 25187; + public static final int HYDRA_SLAYER_HELMET_I_25189 = 25189; + public static final int TWISTED_SLAYER_HELMET_I_25191 = 25191; + public static final int GRANITE_RING_I_25193 = 25193; + public static final int BLUE_CAPE_25195 = 25195; + public static final int SOUL_FRAGMENT = 25196; + public static final int SOUL_WARS_GUIDE = 25197; + public static final int BONES_25199 = 25199; + public static final int SOUL_FRAGMENT_25201 = 25201; + public static final int BANDAGES_25202 = 25202; + public static final int POTION_OF_POWER4 = 25203; + public static final int POTION_OF_POWER3 = 25204; + public static final int POTION_OF_POWER2 = 25205; + public static final int POTION_OF_POWER1 = 25206; + public static final int RED_CAPE_25207 = 25207; + public static final int BLUE_CAPE_25208 = 25208; + public static final int BARRICADE_25209 = 25209; + public static final int BARRICADE_25210 = 25210; + public static final int EXPLOSIVE_POTION_25211 = 25211; + public static final int BLUE_ICON = 25212; + public static final int BLUE_ICON_25213 = 25213; + public static final int BLUE_ICON_25214 = 25214; + public static final int BLUE_ICON_25215 = 25215; + public static final int BLUE_ICON_25216 = 25216; + public static final int BLUE_ICON_25217 = 25217; + public static final int BLUE_ICON_25218 = 25218; + public static final int BLUE_ICON_25219 = 25219; + public static final int BLUE_ICON_25220 = 25220; + public static final int BLUE_ICON_25221 = 25221; + public static final int BLUE_ICON_25222 = 25222; + public static final int BLUE_ICON_25223 = 25223; + public static final int BLUE_ICON_25224 = 25224; + public static final int BLUE_ICON_25225 = 25225; + public static final int BLUE_ICON_25226 = 25226; + public static final int BLUE_ICON_25227 = 25227; + public static final int RED_ICON = 25228; + public static final int RED_ICON_25229 = 25229; + public static final int RED_ICON_25230 = 25230; + public static final int RED_ICON_25231 = 25231; + public static final int RED_ICON_25232 = 25232; + public static final int RED_ICON_25233 = 25233; + public static final int RED_ICON_25234 = 25234; + public static final int RED_ICON_25235 = 25235; + public static final int RED_ICON_25236 = 25236; + public static final int RED_ICON_25237 = 25237; + public static final int RED_ICON_25238 = 25238; + public static final int RED_ICON_25239 = 25239; + public static final int RED_ICON_25240 = 25240; + public static final int RED_ICON_25241 = 25241; + public static final int RED_ICON_25242 = 25242; + public static final int RED_ICON_25243 = 25243; + public static final int OLD_KEY_25244 = 25244; + public static final int RING_OF_SUFFERING_I_25246 = 25246; + public static final int RING_OF_SUFFERING_RI_25248 = 25248; + public static final int SALVE_AMULETI_25250 = 25250; + public static final int RING_OF_THE_GODS_I_25252 = 25252; + public static final int TYRANNICAL_RING_I_25254 = 25254; + public static final int TREASONOUS_RING_I_25256 = 25256; + public static final int SEERS_RING_I_25258 = 25258; + public static final int ARCHERS_RING_I_25260 = 25260; + public static final int WARRIOR_RING_I_25262 = 25262; + public static final int BERSERKER_RING_I_25264 = 25264; + public static final int BLACK_MASK_10_I_25266 = 25266; + public static final int BLACK_MASK_9_I_25267 = 25267; + public static final int BLACK_MASK_8_I_25268 = 25268; + public static final int BLACK_MASK_7_I_25269 = 25269; + public static final int BLACK_MASK_6_I_25270 = 25270; + public static final int BLACK_MASK_5_I_25271 = 25271; + public static final int BLACK_MASK_4_I_25272 = 25272; + public static final int BLACK_MASK_3_I_25273 = 25273; + public static final int BLACK_MASK_2_I_25274 = 25274; + public static final int BLACK_MASK_1_I_25275 = 25275; + public static final int BLACK_MASK_I_25276 = 25276; + public static final int SALVE_AMULETEI_25278 = 25278; + public static final int PURE_ESSENCE_PACK = 25280; + public static final int SLED_25282 = 25282; + public static final int RED_FIREFLIES = 25283; + public static final int GREEN_FIREFLIES = 25284; + public static final int STICK_25285 = 25285; + public static final int MOULDY_SAWDUST = 25286; + public static final int ROTTEN_MEAT = 25287; + public static final int STALE_BREAD = 25288; + public static final int GOBLIN_STEW = 25289; + public static final int GOBLIN_GIFTS = 25290; + public static final int GIANT_BOULDER = 25314; + public static final int GOBLIN_DECORATIONS = 25316; + public static final int GNOME_CHILD_ICON = 25319; + public static final int GNOME_CHILD = 25320; + public static final int GNOME_CHILD_25321 = 25321; + public static final int _20TH_ANNIVERSARY_HAT = 25322; + public static final int _20TH_ANNIVERSARY_TOP = 25324; + public static final int _20TH_ANNIVERSARY_BOTTOM = 25326; + public static final int _20TH_ANNIVERSARY_BOOTS = 25328; + public static final int _20TH_ANNIVERSARY_GLOVES = 25330; + public static final int _20TH_ANNIVERSARY_NECKLACE = 25332; + public static final int _20TH_ANNIVERSARY_CAPE = 25334; + public static final int GNOME_CHILD_MASK = 25336; + public static final int GNOME_CHILD_ICON_25338 = 25338; + public static final int ECTOPLASMATOR = 25340; + public static final int SPOILS_OF_WAR = 25342; + public static final int SOUL_CAPE = 25344; + public static final int SOUL_CAPE_25346 = 25346; + public static final int LIL_CREATOR = 25348; + public static final int LIL_DESTRUCTOR = 25350; + public static final int TROPHY_PEDESTAL = 25351; + public static final int ORNATE_TROPHY_PEDESTAL = 25352; + public static final int OAK_TROPHY_CASE = 25353; + public static final int MAHOGANY_TROPHY_CASE = 25354; + public static final int BANNER_STAND = 25355; + public static final int ORNATE_BANNER_STAND = 25356; + public static final int OAK_OUTFIT_STAND = 25357; + public static final int MAHOGANY_OUTFIT_STAND = 25358; + public static final int LEAGUE_STATUE = 25359; + public static final int ORNATE_LEAGUE_STATUE = 25360; + public static final int TRAILBLAZER_GLOBE_25361 = 25361; + public static final int RUG_25362 = 25362; + public static final int OPULENT_RUG_25363 = 25363; + public static final int TRAILBLAZER_RUG_25364 = 25364; + public static final int LEAGUE_ACCOMPLISHMENTS_SCROLL = 25365; + public static final int LEAGUE_HALL = 25366; + public static final int INFERNAL_HARPOON_UNCHARGED_25367 = 25367; + public static final int INFERNAL_PICKAXE_UNCHARGED_25369 = 25369; + public static final int INFERNAL_AXE_UNCHARGED_25371 = 25371; + public static final int DRAGON_HARPOON_OR = 25373; + public static final int DRAGON_PICKAXE_OR_25376 = 25376; + public static final int DRAGON_AXE_OR = 25378; + public static final int TRAILBLAZER_RELIC_HUNTER_T1_ARMOUR_SET = 25380; + public static final int TRAILBLAZER_RELIC_HUNTER_T2_ARMOUR_SET = 25383; + public static final int TRAILBLAZER_RELIC_HUNTER_T3_ARMOUR_SET = 25386; /* This file is automatically generated. Do not edit. */ -} +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java b/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java index 48894f1863..016888cc80 100644 --- a/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java +++ b/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java @@ -27,4 +27,5 @@ package net.runelite.api; public interface IterableHashTable extends Iterable { T get(long hash); + void put(T node, long hash); } diff --git a/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java b/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java index 5c14f8cf1c..8d57b8efdc 100644 --- a/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java +++ b/runelite-api/src/main/java/net/runelite/api/MainBufferProvider.java @@ -36,5 +36,5 @@ public interface MainBufferProvider extends BufferProvider * * @return the loaded image */ - Image getImage(); //TODO + Image getImage(); } diff --git a/runelite-api/src/main/java/net/runelite/api/NPCComposition.java b/runelite-api/src/main/java/net/runelite/api/NPCComposition.java index d730529e42..07773db029 100644 --- a/runelite-api/src/main/java/net/runelite/api/NPCComposition.java +++ b/runelite-api/src/main/java/net/runelite/api/NPCComposition.java @@ -27,7 +27,7 @@ package net.runelite.api; /** * Information about a specific {@link NpcID} */ -public interface NPCComposition +public interface NPCComposition extends ParamHolder { /** * Gets the name of the NPC. diff --git a/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java b/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java index 43fa5aa88a..1d0357b78a 100644 --- a/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java +++ b/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java @@ -27,7 +27,7 @@ package net.runelite.api; /** * Information about a specific {@link ObjectID} */ -public interface ObjectComposition +public interface ObjectComposition extends ParamHolder { /** * Gets ID for the object. diff --git a/runelite-api/src/main/java/net/runelite/api/ParamHolder.java b/runelite-api/src/main/java/net/runelite/api/ParamHolder.java new file mode 100644 index 0000000000..9ccc1328bf --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/ParamHolder.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +/** + * A composition that can hold `param` keys. This lets Jagex attach arbitrary constant + * data to certain items, objects, npcs, or structs for use in cs2 + * + * @see ParamID + */ +public interface ParamHolder +{ + IterableHashTable getParams(); + void setParams(IterableHashTable params); + + /** + * Gets the value of a given {@link ParamID}, or its default if it is unset + */ + int getIntValue(int paramID); + + /** + * Sets the value of a given {@link ParamID} + */ + void setValue(int paramID, int value); + + /** + * Gets the value of a given {@link ParamID}, or its default if it is unset + */ + String getStringValue(int paramID); + + /** + * Sets the value of a given {@link ParamID} + */ + void setValue(int paramID, String value); +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/ParamID.java b/runelite-api/src/main/java/net/runelite/api/ParamID.java new file mode 100644 index 0000000000..3c2cae2109 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/ParamID.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +/** + * @see ParamHolder + */ +public class ParamID +{ + /** + * @see SettingID + */ + public static final int SETTING_ID = 1077; + // defaults to 5 + // 1 is continuous + public static final int SETTING_SLIDER_STEPS = 1101; + public static final int SETTING_CUSTOM_TRANSMIT = 1085; + // defaults to true + // track is foreground + public static final int SETTING_FOREGROUND_CLICKZONE = 1105; + public static final int SETTING_SLIDER_CUSTOM_ONOP = 1106; + public static final int SETTING_SLIDER_CUSTOM_SETPOS = 1107; + public static final int SETTING_SLIDER_IS_DRAGGABLE = 1108; + public static final int SETTING_SLIDER_DEADZONE = 1109; + public static final int SETTING_SLIDER_DEADTIME = 1110; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/Preferences.java b/runelite-api/src/main/java/net/runelite/api/Preferences.java index b134b96bdf..d7b67242bf 100644 --- a/runelite-api/src/main/java/net/runelite/api/Preferences.java +++ b/runelite-api/src/main/java/net/runelite/api/Preferences.java @@ -43,15 +43,27 @@ public interface Preferences */ void setRememberedUsername(String username); + /** + * Gets the sound effect volume + * @return volume 0-127 inclusive + */ int getSoundEffectVolume(); - void setSoundEffectVolume(int i); + /** + * Sets the sound effect volume + * @param volume 0-127 inclusive + */ + void setSoundEffectVolume(int volume); + /** + * Gets the area sound effect volume + * @return volume 0-127 inclusive + */ int getAreaSoundEffectVolume(); - void setAreaSoundEffectVolume(int i); - - int getMusicVolume(); - - void setClientMusicVolume(int i); + /** + * Sets the area sound effect volume + * @param volume 0-127 inclusive + */ + void setAreaSoundEffectVolume(int volume); } diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java index b94fbbc44a..361a71e3b1 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptEvent.java @@ -40,13 +40,19 @@ public interface ScriptEvent String NAME = "event_opbase"; /** - * Gets the widget of the event. - * - * @return the widget - * @see Widget + * Gets the widget the {@link #WIDGET_ID} and {@link #WIDGET_INDEX} args + * are substituted with */ Widget getSource(); + /** + * Sets the widget the {@link #WIDGET_ID} and {@link #WIDGET_INDEX} args + * are substituted with. This is useful for running widget listeners + * + * @see Widget#getOnLoadListener() + */ + ScriptEvent setSource(Widget widget); + /** * Gets the menu index of the event * @@ -80,4 +86,11 @@ public interface ScriptEvent * @return */ int getTypedKeyChar(); -} + + /** + * Executes a cs2 script specified by this event + * + * This method must be ran on the client thread and is not reentrant + */ + void run(); +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java index 40c5e09cc9..215a871a6f 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -348,6 +348,20 @@ public final class ScriptID @ScriptArguments() public static final int BANKMAIN_SEARCHING = 514; + /** + * Chooses the click handler for a {@link ParamID#SETTING_SLIDER_CUSTOM_ONOP} = 1 settings slider + * + * The active widget is set to the track created by {@link ParamID#SETTING_FOREGROUND_CLICKZONE} + *

    + *
  • int {@link ParamID#SETTING_ID}
  • + *
  • int (WidgetID) Slider handle ID
  • + *
  • int (widget index) Slider handle index
  • + *
  • int track width
  • + *
  • int y offset
  • + *
  • int x offset
  • + *
  • int (WidgetID) drag parent
  • + *
+ */ @ScriptArguments(integer = 7) public static final int SETTINGS_SLIDER_CHOOSE_ONOP = 3885; diff --git a/runelite-api/src/main/java/net/runelite/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java index bc9da1e230..67ccfc56ae 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpriteID.java +++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java @@ -1596,4 +1596,8 @@ public final class SpriteID public static final int FRIENDS_CHAT_RANK_TRIPLE_CHEVRON_SERGEANT = 2831; public static final int FRIENDS_CHAT_RANK_DOUBLE_CHEVRON_CORPORAL = 2832; public static final int FRIENDS_CHAT_RANK_SINGLE_CHEVRON_RECRUIT = 2833; + + public static final int SETTINGS_SLIDER_HANDLE_BLUE = 2858; + public static final int SETTINGS_SLIDER_HANDLE_RED = 2859; + public static final int SETTINGS_SLIDER_HANDLE_GREEN = 2860; } diff --git a/runelite-api/src/main/java/net/runelite/api/SpritePixels.java b/runelite-api/src/main/java/net/runelite/api/SpritePixels.java index f66f0a6f26..f0ccc08448 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpritePixels.java +++ b/runelite-api/src/main/java/net/runelite/api/SpritePixels.java @@ -56,6 +56,62 @@ public interface SpritePixels */ int getHeight(); + /** + * Gets the max width of the sprite image in pixels. + * + * @return the width + */ + int getMaxWidth(); + + /** + * Gets the max height of the sprite image in pixels. + * + * @return the height + */ + int getMaxHeight(); + + /** + * Gets the x offset of the sprite image in pixels. + * + * @return the offset + */ + int getOffsetX(); + + /** + * Gets the y offset of the sprite image in pixels. + * + * @return the offset + */ + int getOffsetY(); + + /** + * Sets the max width of the sprite image in pixels. + * + * @param maxWidth the width + */ + void setMaxWidth(int maxWidth); + + /** + * Sets the max height of the sprite image in pixels. + * + * @param maxHeight the height + */ + void setMaxHeight(int maxHeight); + + /** + * Sets the x offset of the sprite image in pixels. + * + * @param offsetX the offset + */ + void setOffsetX(int offsetX); + + /** + * Sets the y offset of the sprite image in pixels. + * + * @param offsetY the offset + */ + void setOffsetY(int offsetY); + /** * Gets an array of all pixels data in the sprite. * @@ -92,20 +148,4 @@ public interface SpritePixels * @param color target color */ void toBufferedOutline(BufferedImage img, int color); - - int getMaxWidth(); - - void setMaxWidth(int maxWidth); - - int getMaxHeight(); - - void setMaxHeight(int maxHeight); - - int getOffsetX(); - - void setOffsetX(int offsetX); - - int getOffsetY(); - - void setOffsetY(int offsetY); } diff --git a/runelite-api/src/main/java/net/runelite/api/StructComposition.java b/runelite-api/src/main/java/net/runelite/api/StructComposition.java new file mode 100644 index 0000000000..5edc073bd4 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/StructComposition.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api; + +/** + * A config type dedicated to holding params. + * + * Historically items were often used for this before structs were made + * available, and there are many of these still around. + * + * @see ParamHolder + */ +public interface StructComposition extends ParamHolder +{ + int getId(); +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/StructID.java b/runelite-api/src/main/java/net/runelite/api/StructID.java new file mode 100644 index 0000000000..d12d8ed0ec --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/StructID.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.runelite.api; + +/** + * @see StructComposition + * @see Client#getStructComposition(int) + */ +public class StructID +{ + public static final int SETTINGS_MUSIC_VOLUME = 2753; + public static final int SETTINGS_EFFECT_VOLUME = 2754; + public static final int SETTINGS_AREA_VOLUME = 2755; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/VarPlayer.java b/runelite-api/src/main/java/net/runelite/api/VarPlayer.java index 231752d927..d01cfc7350 100644 --- a/runelite-api/src/main/java/net/runelite/api/VarPlayer.java +++ b/runelite-api/src/main/java/net/runelite/api/VarPlayer.java @@ -197,104 +197,15 @@ public enum VarPlayer SOUND_EFFECT_VOLUME(169), AREA_EFFECT_VOLUME(872), - /** - * f2p Quest varbits, these don't hold the completion value. - */ - QUEST_BLACK_KNIGHTS_FORTRESS(130), - QUEST_COOKS_ASSISTANT(29), - QUEST_DORICS_QUEST(31), - QUEST_DRAGON_SLAYER(176), - QUEST_ERNEST_THE_CHICKEN(32), - QUEST_IMP_CATCHER(160), - QUEST_THE_KNIGHTS_SWORD(122), - QUEST_PIRATES_TREASURE(71), - QUEST_PRINCE_ALI_RESCUE(273), - QUEST_THE_RESTLESS_GHOST(107), - QUEST_ROMEO_AND_JULIET(144), - QUEST_RUNE_MYSTERIES(63), - QUEST_SHEEP_SHEARER(179), - QUEST_SHIELD_OF_ARRAV(145), - QUEST_SHIELD_OF_ARRAV_STATE_146(146), - QUEST_VAMPIRE_SLAYER(178), - QUEST_WITCHS_POTION(67), - - /** - * member Quest varbits, these don't hold the completion value. - */ - QUEST_BIG_CHOMPY_BIRD_HUNTING(293), - QUEST_BIOHAZARD(68), - QUEST_CABIN_FEVER(655), - QUEST_CLOCK_TOWER(10), - QUEST_CREATURE_OF_FENKENSTRAIN(399), - QUEST_DEATH_PLATEAU(314), - QUEST_THE_DIG_SITE(131), - QUEST_DRUIDIC_RITUAL(80), - QUEST_DWARF_CANNON(0), - QUEST_EADGARS_RUSE(335), - QUEST_ELEMENTAL_WORKSHOP_I(299), - QUEST_FAMILY_CREST(148), - QUEST_FIGHT_ARENA(17), - QUEST_FISHING_CONTEST(11), - QUEST_THE_FREMENNIK_TRIALS(347), - QUEST_WATERFALL_QUEST(65), - QUEST_GERTRUDES_CAT(180), - QUEST_THE_GRAND_TREE(150), - QUEST_HAUNTED_MINE(382), - QUEST_HAZEEL_CULT(223), - QUEST_HEROES_QUEST(188), - QUEST_HOLY_GRAIL(5), - QUEST_IN_SEARCH_OF_THE_MYREQUE(387), - QUEST_JUNGLE_POTION(175), - QUEST_LEGENDS_QUEST(139), - QUEST_LOST_CITY(147), - QUEST_MERLINS_CRYSTAL(14), - QUEST_MONKEY_MADNESS_I(365), - QUEST_MONKS_FRIEND(30), - QUEST_MOURNINGS_END_PART_I(517), - QUEST_MURDER_MYSTERY(192), - QUEST_NATURE_SPIRIT(307), - QUEST_OBSERVATORY_QUEST(112), - QUEST_ONE_SMALL_FAVOUR(416), - QUEST_PLAGUE_CITY(165), - QUEST_PRIEST_IN_PERIL(302), - QUEST_RAG_AND_BONE_MAN(714), - QUEST_REGICIDE(328), - QUEST_ROVING_ELVES(402), - QUEST_RUM_DEAL(600), - QUEST_SCORPION_CATCHER(76), - QUEST_SEA_SLUG(159), - QUEST_SHADES_OF_MORTTON(339), - QUEST_SHEEP_HERDER(60), - QUEST_SHILO_VILLAGE(116), - QUEST_TAI_BWO_WANNAI_TRIO(320), - QUEST_TEMPLE_OF_IKOV(26), - QUEST_THRONE_OF_MISCELLANIA(359), - QUEST_THE_TOURIST_TRAP(197), - QUEST_WITCHS_HOUSE(226), - QUEST_TREE_GNOME_VILLAGE(111), - QUEST_TRIBAL_TOTEM(200), - QUEST_TROLL_ROMANCE(385), - QUEST_TROLL_STRONGHOLD(317), - QUEST_UNDERGROUND_PASS(161), - QUEST_UNDERGROUND_PASS_STATE_162(162), - QUEST_WATCHTOWER(212), - QUEST_THE_GREAT_BRAIN_ROBBERY(980), - QUEST_RAG_AND_BONE_MAN_II(714), - - /** - * mini-quest varbits, these don't hold the completion value. - */ - QUEST_ENTER_THE_ABYSS(492), - QUEST_ALFRED_GRIMHANDS_BARCRAWL(77), - QUEST_ALFRED_GRIMHANDS_BARCRAWL_STATE_76(76), - QUEST_THE_MAGE_ARENA(267), - /** * 0 = 2 buttons, 1 = 1 button */ MOUSE_BUTTONS(170), - ZALCANO_FORM(1683); + /** + * {@link NpcID} for the HP HUD + */ + HP_HUD_NPC_ID(1683); - public final int id; -} + private final int id; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 213aea68a5..90128c71d6 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -784,6 +784,13 @@ public enum Varbits LEAGUE_RELIC_5(10053), LEAGUE_RELIC_6(11696), + /** + * Muted volume restore values + */ + MUTED_MUSIC_VOLUME(9666), + MUTED_SOUND_EFFECT_VOLUME(9674), + MUTED_AREA_EFFECT_VOLUME(9675), + /** * Whether the Special Attack orb is disabled due to being in a PvP area * diff --git a/runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java b/runelite-api/src/main/java/net/runelite/api/events/PostStructComposition.java similarity index 80% rename from runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java rename to runelite-api/src/main/java/net/runelite/api/events/PostStructComposition.java index 578adbe296..1d947572a6 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java +++ b/runelite-api/src/main/java/net/runelite/api/events/PostStructComposition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Adam + * Copyright (c) 2020 Abex * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,21 +24,18 @@ */ package net.runelite.api.events; -import net.runelite.api.widgets.Widget; import lombok.Data; +import net.runelite.api.StructComposition; /** - * An event where the hidden state of a {@link Widget} has been modified. + * An event called after a new {@link StructComposition} is created and + * its data is initialized. */ @Data -public class WidgetHiddenChanged implements Event +public class PostStructComposition { /** - * The affected widget. + * The newly created struct. */ - private Widget widget; - /** - * The new hidden state of the widget. - */ - private boolean hidden; -} + private StructComposition structComposition; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java b/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java index dc244b8ff8..3d109ef982 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java +++ b/runelite-api/src/main/java/net/runelite/api/events/RemovedFriend.java @@ -25,15 +25,16 @@ package net.runelite.api.events; import lombok.Value; +import net.runelite.api.Nameable; /** - * An event where a request to remove a friend is sent to the server. + * An event trigger when a player is removed from the friend or ignore list. */ @Value -public class RemovedFriend implements Event +public class RemovedFriend { /** - * The name of the removed friend. + * The removed friend or ignore entry */ - String name; -} + private final Nameable nameable; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/events/WorldChanged.java b/runelite-api/src/main/java/net/runelite/api/events/WorldChanged.java new file mode 100644 index 0000000000..8976298faf --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/WorldChanged.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.events; + +import net.runelite.api.Client; + +/** + * Posted when the game world the client wants to connect to has changed + * This is posted after the world ID and type have updated, but before a new + * connection is established + * + * @see Client#getWorld() + * @see Client#getWorldType() + */ +public class WorldChanged +{ +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java b/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java index 59111a5eda..82257ace52 100644 --- a/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java +++ b/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java @@ -72,9 +72,6 @@ public interface Callbacks */ void drawAboveOverheads(); - void drawLayer(Widget layer, List widgetItems); - - void drawInterface(int interfaceId, List widgetItems); /** * Client top-most draw method, rendering over top of most of game interfaces. * @@ -85,6 +82,20 @@ public interface Callbacks */ void draw(MainBufferProvider mainBufferProvider, Graphics graphics, int x, int y); + /** + * Called after an interface has been drawn + * @param interfaceId the interface id + * @param widgetItems Widget items within the interface + */ + void drawInterface(int interfaceId, List widgetItems); + + /** + * Called after a widget layer has been drawn + * @param layer The layer + * @param widgetItems Widget items within the layer + */ + void drawLayer(Widget layer, List widgetItems); + /** * Mouse pressed event. If this event will be consumed it will not be propagated further to client. * diff --git a/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java b/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java index 6452500d48..ef5213b40b 100644 --- a/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java +++ b/runelite-api/src/main/java/net/runelite/api/hooks/DrawCallbacks.java @@ -43,11 +43,30 @@ public interface DrawCallbacks SceneTileModel model, int tileZ, int tileX, int tileY, int zoom, int centerX, int centerY); - void draw(); + /** + * Called when a frame should be drawn. + * + * @param overlayColor Color of full-viewport overlays, if any + */ + void draw(int overlayColor); boolean drawFace(Model model, int face); + /** + * Called before the scene is drawn + * @param cameraX + * @param cameraY + * @param cameraZ + * @param cameraPitch + * @param cameraYaw + * @param plane + */ void drawScene(int cameraX, int cameraY, int cameraZ, int cameraPitch, int cameraYaw, int plane); + /** + * Called after the scene has been drawn + */ + void postDrawScene(); + void animate(Texture texture, int diff); } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java index 8df03376da..5e35a8cccf 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java @@ -70,6 +70,10 @@ public interface Widget int getButtonType(); + boolean isWidgetItemDragged(int index); + + Point getWidgetItemDragOffsets(); + /** * Gets the type of content displayed by the widget. */ @@ -1017,13 +1021,34 @@ public interface Widget */ void setOnReleaseListener(Object ...args); - boolean isWidgetItemDragged(int index); + /** + * Sets a script to be ran when a drag operation is finished on this widget + * + * @param args A ScriptID, then the args for the script + */ + void setOnDragCompleteListener(Object ...args); - Point getWidgetItemDragOffsets(); + /** + * Sets a script to be ran when this widget moves due to a drag + * + * @param args A ScriptID, then the args for the script + */ + void setOnDragListener(Object ...args); - static boolean getDragParent(Widget widget) - { - System.out.println("ERROR: IMPLEMENT"); //Would throw but that breaks widget inspector - return false; - } + /** + * Container this can be dragged in + */ + Widget getDragParent(); + + /** + * Container this can be dragged in + */ + void setDragParent(Widget dragParent); + + /** + * Sets a script to be ran when a varplayer changes + * + * @param args A ScriptID, then the args for the script + */ + void setOnVarTransmitListener(Object ...args); } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index a6a02c17a7..a7fcb7f709 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -141,7 +141,7 @@ public class WidgetID public static final int LOOTING_BAG_GROUP_ID = 81; public static final int SKOTIZO_GROUP_ID = 308; public static final int ENTERING_HOUSE_GROUP_ID = 71; - public static final int FULLSCREEN_MAP_GROUP_ID = 165; + public static final int FULLSCREEN_CONTAINER_TLI = 165; public static final int QUESTLIST_GROUP_ID = 399; public static final int SKILLS_GROUP_ID = 320; public static final int DIALOG_SPRITE2_ID = 11; diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index ea614afd36..d074b92c07 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -827,7 +827,7 @@ public enum WidgetInfo MULTICOMBAT_FIXED(WidgetID.FIXED_VIEWPORT_GROUP_ID, WidgetID.FixedViewport.MULTICOMBAT_INDICATOR), MULTICOMBAT_RESIZEABLE(WidgetID.RESIZABLE_VIEWPORT_BOTTOM_LINE_GROUP_ID, WidgetID.ResizableViewport.MULTICOMBAT_INDICATOR), - FULLSCREEN_MAP_ROOT(WidgetID.FULLSCREEN_MAP_GROUP_ID, WidgetID.FullScreenMap.ROOT), + FULLSCREEN_MAP_ROOT(WidgetID.FULLSCREEN_CONTAINER_TLI, WidgetID.FullScreenMap.ROOT), QUESTLIST_BOX(WidgetID.QUESTLIST_GROUP_ID, WidgetID.QuestList.BOX), QUESTLIST_CONTAINER(WidgetID.QUESTLIST_GROUP_ID, WidgetID.QuestList.CONTAINER), @@ -888,6 +888,12 @@ public enum WidgetInfo SEED_VAULT_ITEM_CONTAINER(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_CONTAINER), SEED_VAULT_ITEM_TEXT(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_TEXT), SEED_VAULT_INVENTORY_ITEMS_CONTAINER(WidgetID.SEED_VAULT_INVENTORY_GROUP_ID, WidgetID.SeedVault.INVENTORY_ITEM_CONTAINER), + + SETTINGS_SIDE_CAMERA_ZOOM_SLIDER_TRACK(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.CAMERA_ZOOM_SLIDER_TRACK), + SETTINGS_SIDE_MUSIC_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.MUSIC_SLIDER), + SETTINGS_SIDE_SOUND_EFFECT_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.SOUND_EFFECT_SLIDER), + SETTINGS_SIDE_AREA_SOUND_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.AREA_SOUND_SLIDER), + JEWELLERY_BOX_DUEL_RING(WidgetID.JEWELLERY_BOX_GROUP_ID, WidgetID.JewelBox.DUEL_RING), JEWELLERY_BOX_GAME_NECK(WidgetID.JEWELLERY_BOX_GROUP_ID, WidgetID.JewelBox.GAME_NECK), JEWELLERY_BOX_COMB_BRAC(WidgetID.JEWELLERY_BOX_GROUP_ID, WidgetID.JewelBox.COMB_BRAC), @@ -921,7 +927,6 @@ public enum WidgetInfo HEALTH_OVERLAY_BAR(WidgetID.HEALTH_OVERLAY_BAR_GROUP_ID, WidgetID.EncounterHealthBar.CONTAINER), SETTINGS_INIT(WidgetID.SETTINGS_GROUP_ID, WidgetID.Settings.INIT), - SETTINGS_SIDE_CAMERA_ZOOM_SLIDER_TRACK(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.CAMERA_ZOOM_SLIDER_TRACK), TRAILBLAZER_AREA_TELEPORT(WidgetID.TRAILBLAZER_AREAS_GROUP_ID, WidgetID.TrailblazerAreas.TELEPORT), ; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/BuiltInPluginManager.java b/runelite-client/src/main/java/com/openosrs/client/plugins/BuiltInPluginManager.java deleted file mode 100644 index 56397a78e7..0000000000 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/BuiltInPluginManager.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.openosrs.client.plugins; - -import com.openosrs.client.plugins.openosrs.OpenOSRSPlugin; -import java.util.ArrayList; -import java.util.List; -import net.runelite.client.externalplugins.ExternalPluginManager; -import net.runelite.client.plugins.PluginInstantiationException; - -public class BuiltInPluginManager -{ - public static List> oprsPlugins = new ArrayList<>(); - - public static void loadPlugins() - { - try - { - ExternalPluginManager.pluginManager.loadPlugins(oprsPlugins, null); - } - catch (PluginInstantiationException e) - { - e.printStackTrace(); - } - } - - static - { - oprsPlugins.add(OpenOSRSPlugin.class); - } -} diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/ExternalPluginManager.java b/runelite-client/src/main/java/com/openosrs/client/plugins/ExternalPluginManager.java index 0159a2f36b..add932f725 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/ExternalPluginManager.java +++ b/runelite-client/src/main/java/com/openosrs/client/plugins/ExternalPluginManager.java @@ -33,6 +33,15 @@ import com.google.inject.CreationException; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; +import static com.openosrs.client.OpenOSRS.EXTERNALPLUGIN_DIR; +import static com.openosrs.client.OpenOSRS.SYSTEM_VERSION; +import com.openosrs.client.config.OpenOSRSConfig; +import com.openosrs.client.events.ExternalPluginChanged; +import com.openosrs.client.events.ExternalRepositoryChanged; +import com.openosrs.client.ui.OpenOSRSSplashScreen; +import com.openosrs.client.util.Groups; +import com.openosrs.client.util.MiscUtils; +import com.openosrs.client.util.SwingUtil; import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; @@ -61,24 +70,15 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.client.RuneLite; -import static com.openosrs.client.OpenOSRS.EXTERNALPLUGIN_DIR; -import static com.openosrs.client.OpenOSRS.SYSTEM_VERSION; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigManager; -import com.openosrs.client.config.OpenOSRSConfig; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.eventbus.EventBus; import net.runelite.client.events.ConfigChanged; -import com.openosrs.client.events.ExternalPluginChanged; -import com.openosrs.client.events.ExternalRepositoryChanged; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginInstantiationException; import net.runelite.client.plugins.PluginManager; import net.runelite.client.ui.ClientUI; -import com.openosrs.client.ui.OpenOSRSSplashScreen; -import com.openosrs.client.util.Groups; -import com.openosrs.client.util.MiscUtils; -import com.openosrs.client.util.SwingUtil; import org.jgroups.Message; import org.pf4j.DefaultPluginManager; import org.pf4j.DependencyResolver; @@ -117,7 +117,7 @@ public class ExternalPluginManager @Inject public ExternalPluginManager( @Named("safeMode") final boolean safeMode, - net.runelite.client.plugins.PluginManager pluginManager, + PluginManager pluginManager, OpenOSRSConfig openOSRSConfig, EventBus eventBus, ExecutorService executorService, diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/OpenOSRSPlugin.java b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/OpenOSRSPlugin.java index cd3d914413..3f0ca8d288 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/OpenOSRSPlugin.java +++ b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/OpenOSRSPlugin.java @@ -27,6 +27,8 @@ package com.openosrs.client.plugins.openosrs; import ch.qos.logback.classic.Logger; +import com.openosrs.client.plugins.openosrs.externals.ExternalPluginManagerPanel; +import com.openosrs.client.config.OpenOSRSConfig; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import javax.inject.Inject; @@ -55,14 +57,12 @@ import static net.runelite.api.widgets.WidgetInfo.BANK_PIN_SECOND_ENTERED; import static net.runelite.api.widgets.WidgetInfo.BANK_PIN_THIRD_ENTERED; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.Keybind; -import com.openosrs.client.config.OpenOSRSConfig; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ConfigChanged; import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import com.openosrs.client.plugins.openosrs.externals.ExternalPluginManagerPanel; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.NavigationButton; import net.runelite.client.util.HotkeyListener; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java index da49d567b9..43211002e5 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java +++ b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/ExternalPluginManagerPanel.java @@ -1,5 +1,6 @@ package com.openosrs.client.plugins.openosrs.externals; +import com.openosrs.client.plugins.ExternalPluginManager; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; @@ -21,7 +22,6 @@ import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import net.runelite.client.eventbus.EventBus; -import com.openosrs.client.plugins.ExternalPluginManager; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/PluginsPanel.java b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/PluginsPanel.java index be1a350243..fa3af31ca2 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/PluginsPanel.java +++ b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/PluginsPanel.java @@ -1,6 +1,12 @@ package com.openosrs.client.plugins.openosrs.externals; +import com.openosrs.client.plugins.ExternalPluginManager; import com.google.gson.JsonSyntaxException; +import com.openosrs.client.events.ExternalPluginChanged; +import com.openosrs.client.events.ExternalRepositoryChanged; +import com.openosrs.client.util.DeferredDocumentChangedListener; +import com.openosrs.client.util.ImageUtil; +import com.openosrs.client.util.SwingUtil; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -32,10 +38,6 @@ import javax.swing.border.EmptyBorder; import lombok.extern.slf4j.Slf4j; import static net.runelite.api.util.Text.DISTANCE; import net.runelite.client.eventbus.EventBus; -import com.openosrs.client.events.ExternalPluginChanged; -import com.openosrs.client.events.ExternalRepositoryChanged; -import com.openosrs.client.plugins.ExternalPluginManager; -import static com.openosrs.client.plugins.openosrs.externals.ExternalPluginManagerPanel.wrapContainer; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.ColorScheme; @@ -43,9 +45,6 @@ import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.components.IconTextField; import net.runelite.client.ui.components.shadowlabel.JShadowedLabel; -import com.openosrs.client.util.DeferredDocumentChangedListener; -import com.openosrs.client.util.ImageUtil; -import com.openosrs.client.util.SwingUtil; import org.pf4j.update.PluginInfo; import org.pf4j.update.UpdateManager; import org.pf4j.update.UpdateRepository; @@ -112,8 +111,8 @@ public class PluginsPanel extends JPanel JTabbedPane mainTabPane = new JTabbedPane(); - mainTabPane.add("Installed", wrapContainer(installedPluginsPanel())); - mainTabPane.add("Available", wrapContainer(availablePluginsPanel())); + mainTabPane.add("Installed", ExternalPluginManagerPanel.wrapContainer(installedPluginsPanel())); + mainTabPane.add("Available", ExternalPluginManagerPanel.wrapContainer(availablePluginsPanel())); add(filterwrapper, BorderLayout.NORTH); add(mainTabPane, BorderLayout.CENTER); diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryBox.java b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryBox.java index 13727ec01d..9a1171d726 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryBox.java +++ b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryBox.java @@ -1,5 +1,8 @@ package com.openosrs.client.plugins.openosrs.externals; +import com.openosrs.client.plugins.ExternalPluginManager; +import com.openosrs.client.ui.JMultilineLabel; +import com.openosrs.client.util.ImageUtil; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; @@ -14,11 +17,8 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; -import com.openosrs.client.plugins.ExternalPluginManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; -import com.openosrs.client.ui.JMultilineLabel; -import com.openosrs.client.util.ImageUtil; import net.runelite.client.util.LinkBrowser; import org.pf4j.update.PluginInfo; import org.pf4j.update.UpdateRepository; diff --git a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryPanel.java b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryPanel.java index 4009194b83..1f8973aa88 100644 --- a/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryPanel.java +++ b/runelite-client/src/main/java/com/openosrs/client/plugins/openosrs/externals/RepositoryPanel.java @@ -1,5 +1,7 @@ package com.openosrs.client.plugins.openosrs.externals; +import com.openosrs.client.plugins.ExternalPluginManager; +import com.openosrs.client.events.ExternalRepositoryChanged; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; @@ -7,8 +9,6 @@ import javax.inject.Inject; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import net.runelite.client.eventbus.EventBus; -import com.openosrs.client.events.ExternalRepositoryChanged; -import com.openosrs.client.plugins.ExternalPluginManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.ColorScheme; import org.pf4j.update.UpdateRepository; diff --git a/runelite-client/src/main/java/com/openosrs/client/ui/components/InfoPanel.java b/runelite-client/src/main/java/com/openosrs/client/ui/components/InfoPanel.java index f966797a93..07efae32cb 100644 --- a/runelite-client/src/main/java/com/openosrs/client/ui/components/InfoPanel.java +++ b/runelite-client/src/main/java/com/openosrs/client/ui/components/InfoPanel.java @@ -46,7 +46,7 @@ import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import com.openosrs.client.ui.OpenOSRSSplashScreen; import net.runelite.client.util.ImageUtil; -import net.runelite.client.util.LinkBrowser; +import com.openosrs.client.util.LinkBrowser; @Slf4j public class InfoPanel extends JPanel diff --git a/runelite-client/src/main/java/com/openosrs/client/util/LinkBrowser.java b/runelite-client/src/main/java/com/openosrs/client/util/LinkBrowser.java new file mode 100644 index 0000000000..64df5e1127 --- /dev/null +++ b/runelite-client/src/main/java/com/openosrs/client/util/LinkBrowser.java @@ -0,0 +1,83 @@ +package com.openosrs.client.util; + +import java.awt.Desktop; +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.io.File; +import java.io.IOException; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class LinkBrowser extends net.runelite.client.util.LinkBrowser +{ + /** + * Tries to open the specified {@code File} with the systems default text editor. If operation fails + * an error message is displayed with the option to copy the absolute file path to clipboard. + * + * @param file the File instance of the log file + * @return did the file open successfully? + */ + public static boolean openLocalFile(final File file) + { + if (file == null || !file.exists()) + { + return false; + } + + if (attemptOpenLocalFile(file)) + { + log.debug("Opened log file through Desktop#edit to {}", file); + return true; + } + + showMessageBox("Unable to open log file. Press 'OK' and the file path will be copied to your clipboard", file.getAbsolutePath()); + return false; + } + + private static boolean attemptOpenLocalFile(final File file) + { + if (!Desktop.isDesktopSupported()) + { + return false; + } + + final Desktop desktop = Desktop.getDesktop(); + + if (!desktop.isSupported(Desktop.Action.OPEN)) + { + return false; + } + + try + { + desktop.open(file); + return true; + } + catch (IOException ex) + { + log.warn("Failed to open Desktop#edit {}", file, ex); + return false; + } + } + + /** + * Open swing message box with specified message and copy data to clipboard + * @param message message to show + */ + private static void showMessageBox(final String message, final String data) + { + SwingUtilities.invokeLater(() -> + { + final int result = JOptionPane.showConfirmDialog(null, message, "Message", + JOptionPane.OK_CANCEL_OPTION); + + if (result == JOptionPane.OK_OPTION) + { + final StringSelection stringSelection = new StringSelection(data); + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null); + } + }); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/Notifier.java b/runelite-client/src/main/java/net/runelite/client/Notifier.java index 872866c415..30a9ad4c3b 100644 --- a/runelite-client/src/main/java/net/runelite/client/Notifier.java +++ b/runelite-client/src/main/java/net/runelite/client/Notifier.java @@ -45,6 +45,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import javax.inject.Named; import javax.inject.Singleton; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; @@ -101,8 +102,6 @@ public class Notifier private static final int MINIMUM_FLASH_DURATION_MILLIS = 2000; private static final int MINIMUM_FLASH_DURATION_TICKS = MINIMUM_FLASH_DURATION_MILLIS / Constants.CLIENT_TICK_LENGTH; - private static final String appName = RuneLiteProperties.getTitle(); - private static final File NOTIFICATION_FILE = new File(RuneLite.RUNELITE_DIR, "notification.wav"); private static final long CLIP_MTIME_UNLOADED = -2; private static final long CLIP_MTIME_BUILTIN = -1; @@ -113,6 +112,7 @@ public class Notifier private final ScheduledExecutorService executorService; private final ChatMessageManager chatMessageManager; private final EventBus eventBus; + private final String appName; private final Path notifyIconPath; private boolean terminalNotifierAvailable; private Instant flashStart; @@ -127,7 +127,9 @@ public class Notifier final RuneLiteConfig runeliteConfig, final ScheduledExecutorService executorService, final ChatMessageManager chatMessageManager, - final EventBus eventBus) + final EventBus eventBus, + @Named("runelite.title") final String appName + ) { this.client = client; this.clientUI = clientUI; @@ -135,6 +137,7 @@ public class Notifier this.executorService = executorService; this.chatMessageManager = chatMessageManager; this.eventBus = eventBus; + this.appName = appName; this.notifyIconPath = RuneLite.RUNELITE_DIR.toPath().resolve("icon.png"); // First check if we are running in launcher @@ -377,7 +380,7 @@ public class Notifier { if (OSType.getOSType() == OSType.Linux && !Files.exists(notifyIconPath)) { - try (InputStream stream = Notifier.class.getResourceAsStream("/runelite.png")) + try (InputStream stream = Notifier.class.getResourceAsStream("/openosrs.png")) { Files.copy(stream, notifyIconPath); } diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 5eabee491c..1309cba17e 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -30,7 +30,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; -import com.openosrs.client.plugins.BuiltInPluginManager; import java.io.File; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; @@ -390,9 +389,6 @@ public class RuneLite overlayManager.add(tooltipOverlay.get()); } - //Load built-in OPRS plugins - BuiltInPluginManager.loadPlugins(); - // Start plugins pluginManager.startPlugins(); diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java index 381d945a34..c20df7d8e5 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java @@ -32,6 +32,7 @@ import com.openosrs.client.config.OpenOSRSConfig; import com.openosrs.client.util.NonScheduledExecutorServiceExceptionLogger; import java.applet.Applet; import java.io.File; +import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; @@ -75,6 +76,12 @@ public class RuneLiteModule extends AbstractModule @Override protected void configure() { + Properties properties = RuneLiteProperties.getProperties(); + for (String key : properties.stringPropertyNames()) + { + String value = properties.getProperty(key); + bindConstant().annotatedWith(Names.named(key)).to(value); + } bindConstant().annotatedWith(Names.named("developerMode")).to(developerMode); bindConstant().annotatedWith(Names.named("safeMode")).to(safeMode); bind(File.class).annotatedWith(Names.named("sessionfile")).toInstance(sessionfile); diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java index ab0911c1f4..2be480f85e 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java @@ -28,18 +28,14 @@ import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.annotation.Nullable; +import lombok.AccessLevel; +import lombok.Getter; import okhttp3.HttpUrl; public class RuneLiteProperties { - private static final String RUNELITE_TITLE = "runelite.title"; private static final String RUNELITE_VERSION = "runelite.version"; - private static final String RUNESCAPE_VERSION = "runescape.version"; - private static final String DISCORD_APP_ID = "runelite.discord.appid"; private static final String DISCORD_INVITE = "runelite.discord.invite"; - private static final String GITHUB_LINK = "runelite.github.link"; - private static final String WIKI_LINK = "runelite.wiki.link"; - private static final String PATREON_LINK = "runelite.patreon.link"; private static final String LAUNCHER_VERSION_PROPERTY = "runelite.launcher.version"; private static final String INSECURE_SKIP_TLS_VERIFICATION_PROPERTY = "runelite.insecure-skip-tls-verification"; private static final String TROUBLESHOOTING_LINK = "runelite.wiki.troubleshooting.link"; @@ -49,8 +45,8 @@ public class RuneLiteProperties private static final String JAV_CONFIG_BACKUP = "runelite.jav_config_backup"; private static final String PLUGINHUB_BASE = "runelite.pluginhub.url"; private static final String PLUGINHUB_VERSION = "runelite.pluginhub.version"; - private static final String IMGUR_CLIENT_ID = "runelite.imgur.client.id"; + @Getter(AccessLevel.PACKAGE) private static final Properties properties = new Properties(); static @@ -65,46 +61,16 @@ public class RuneLiteProperties } } - public static String getTitle() - { - return properties.getProperty(RUNELITE_TITLE); - } - public static String getVersion() { return properties.getProperty(RUNELITE_VERSION); } - public static String getRunescapeVersion() - { - return properties.getProperty(RUNESCAPE_VERSION); - } - - public static String getDiscordAppId() - { - return properties.getProperty(DISCORD_APP_ID); - } - public static String getDiscordInvite() { return properties.getProperty(DISCORD_INVITE); } - public static String getGithubLink() - { - return properties.getProperty(GITHUB_LINK); - } - - public static String getWikiLink() - { - return properties.getProperty(WIKI_LINK); - } - - public static String getPatreonLink() - { - return properties.getProperty(PATREON_LINK); - } - @Nullable public static String getLauncherVersion() { @@ -146,9 +112,4 @@ public class RuneLiteProperties String version = System.getProperty(PLUGINHUB_VERSION, properties.getProperty(PLUGINHUB_VERSION)); return HttpUrl.parse(properties.get(PLUGINHUB_BASE) + "/" + version); } - - public static String getImgurClientId() - { - return properties.getProperty(IMGUR_CLIENT_ID); - } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index 0c33297e11..01d8ebfe1d 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -85,6 +85,7 @@ import net.runelite.api.Player; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.PlayerChanged; import net.runelite.api.events.UsernameChanged; +import net.runelite.api.events.WorldChanged; import net.runelite.client.RuneLite; import net.runelite.client.account.AccountSession; import net.runelite.client.eventbus.EventBus; @@ -1041,7 +1042,13 @@ public class ConfigManager { updateRSProfile(); } - + + @Subscribe + private void onWorldChanged(WorldChanged ev) + { + updateRSProfile(); + } + @Subscribe private void onPlayerChanged(PlayerChanged ev) { diff --git a/runelite-client/src/main/java/net/runelite/client/discord/DiscordService.java b/runelite-client/src/main/java/net/runelite/client/discord/DiscordService.java index cf2a16fd37..cc6ebe3b10 100644 --- a/runelite-client/src/main/java/net/runelite/client/discord/DiscordService.java +++ b/runelite-client/src/main/java/net/runelite/client/discord/DiscordService.java @@ -28,10 +28,10 @@ import com.google.common.base.Strings; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import net.runelite.client.RuneLiteProperties; import net.runelite.client.discord.events.DiscordDisconnected; import net.runelite.client.discord.events.DiscordErrored; import net.runelite.client.discord.events.DiscordJoinGame; @@ -50,6 +50,7 @@ public class DiscordService implements AutoCloseable { private final EventBus eventBus; private final ScheduledExecutorService executorService; + private final String discordAppId; private final DiscordRPC discordRPC; // Hold a reference to the event handlers to prevent the garbage collector from deleting them @@ -61,11 +62,14 @@ public class DiscordService implements AutoCloseable @Inject private DiscordService( final EventBus eventBus, - final ScheduledExecutorService executorService) + final ScheduledExecutorService executorService, + @Named("runelite.discord.appid") final String discordAppId + ) { this.eventBus = eventBus; this.executorService = executorService; + this.discordAppId = discordAppId; DiscordRPC discordRPC = null; DiscordEventHandlers discordEventHandlers = null; @@ -103,7 +107,7 @@ public class DiscordService implements AutoCloseable discordEventHandlers.joinGame = this::joinGame; discordEventHandlers.spectateGame = this::spectateGame; discordEventHandlers.joinRequest = this::joinRequest; - discordRPC.Discord_Initialize(RuneLiteProperties.getDiscordAppId(), discordEventHandlers, true, null); + discordRPC.Discord_Initialize(discordAppId, discordEventHandlers, true, null); executorService.scheduleAtFixedRate(discordRPC::Discord_RunCallbacks, 0, 2, TimeUnit.SECONDS); } diff --git a/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java b/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java index 6a7311bea1..187a936dac 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java @@ -49,7 +49,7 @@ public class SkillIconManager String skillIconPath = (small ? "/skill_icons_small/" : "/skill_icons/") + skill.getName().toLowerCase() + ".png"; log.debug("Loading skill icon from {}", skillIconPath); - BufferedImage skillImage = ImageUtil.getResourceStreamFromClass(getClass(), skillIconPath); + BufferedImage skillImage = ImageUtil.loadImageResource(getClass(), skillIconPath); imgCache[skillIdx] = skillImage; return skillImage; diff --git a/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java b/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java index 3d7271af7f..7c0bd4f2fc 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/SpriteManager.java @@ -162,7 +162,7 @@ public class SpriteManager Class owner = add[0].getClass(); for (SpriteOverride o : add) { - BufferedImage image = ImageUtil.getResourceStreamFromClass(owner, o.getFileName()); + BufferedImage image = ImageUtil.loadImageResource(owner, o.getFileName()); SpritePixels sp = ImageUtil.getImageSpritePixels(image, client); overrides.put(o.getSpriteId(), sp); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index 292f7b7414..b4d5934f2f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -87,6 +87,7 @@ public class PluginManager * Base package where the core plugins are */ private static final String PLUGIN_PACKAGE = "net.runelite.client.plugins"; + private static final String OPENOSRS_PACKAGE = "com.openosrs.client.plugins"; private final boolean developerMode; private final boolean safeMode; @@ -290,6 +291,10 @@ public class PluginManager .map(ClassInfo::load) .collect(Collectors.toList()); + plugins.addAll(classPath.getTopLevelClassesRecursive(OPENOSRS_PACKAGE).stream() + .map(ClassInfo::load) + .collect(Collectors.toList())); + loadPlugins(plugins, (loaded, total) -> SplashScreen.stage(.60, .70, null, "Loading Plugins", loaded, total, false)); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java index 901987356c..501537654e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java @@ -65,8 +65,8 @@ public class AccountPlugin extends Plugin static { - LOGIN_IMAGE = ImageUtil.getResourceStreamFromClass(AccountPlugin.class, "login_icon.png"); - LOGOUT_IMAGE = ImageUtil.getResourceStreamFromClass(AccountPlugin.class, "logout_icon.png"); + LOGIN_IMAGE = ImageUtil.loadImageResource(AccountPlugin.class, "login_icon.png"); + LOGOUT_IMAGE = ImageUtil.loadImageResource(AccountPlugin.class, "logout_icon.png"); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java index 73eb79037d..61db1d7cf9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java @@ -100,7 +100,7 @@ public class BarbarianAssaultPlugin extends Plugin overlayManager.add(timerOverlay); overlayManager.add(healerOverlay); - clockImage = ImageUtil.getResourceStreamFromClass(getClass(), "clock.png"); + clockImage = ImageUtil.loadImageResource(getClass(), "clock.png"); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java index 22103f5e79..c7cdef0058 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.barrows; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; +import java.text.DecimalFormat; import javax.inject.Inject; import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; @@ -42,6 +43,8 @@ import net.runelite.client.ui.overlay.components.LineComponent; public class BarrowsBrotherSlainOverlay extends OverlayPanel { + private static final DecimalFormat REWARD_POTENTIAL_FORMATTER = new DecimalFormat("##0.00%"); + private final Client client; @Inject @@ -84,10 +87,9 @@ public class BarrowsBrotherSlainOverlay extends OverlayPanel } final int rewardPotential = rewardPotential(); - float rewardPercent = rewardPotential / 10.12f; panelComponent.getChildren().add(LineComponent.builder() .left("Potential") - .right(rewardPercent != 0 ? rewardPercent + "%" : "0%") + .right(REWARD_POTENTIAL_FORMATTER.format(rewardPotential / 1012f)) .rightColor(rewardPotential >= 756 && rewardPotential < 881 ? Color.GREEN : rewardPotential < 631 ? Color.WHITE : Color.YELLOW) .build()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java index c9fd49c97b..dac873dbf7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java @@ -119,8 +119,8 @@ public class BoostsPlugin extends Plugin Arrays.fill(lastSkillLevels, -1); // Add infoboxes for everything at startup and then determine inside if it will be rendered - infoBoxManager.addInfoBox(new StatChangeIndicator(true, ImageUtil.getResourceStreamFromClass(getClass(), "debuffed.png"), this, config)); - infoBoxManager.addInfoBox(new StatChangeIndicator(false, ImageUtil.getResourceStreamFromClass(getClass(), "buffed.png"), this, config)); + infoBoxManager.addInfoBox(new StatChangeIndicator(true, ImageUtil.loadImageResource(getClass(), "debuffed.png"), this, config)); + infoBoxManager.addInfoBox(new StatChangeIndicator(false, ImageUtil.loadImageResource(getClass(), "buffed.png"), this, config)); for (final Skill skill : Skill.values()) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraPlugin.java index 7f9c9284b5..3c2076a1aa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraPlugin.java @@ -132,6 +132,14 @@ public class CameraPlugin extends Plugin implements KeyListener, MouseListener { addZoomTooltip(sideSlider); } + + Widget settingsInit = client.getWidget(WidgetInfo.SETTINGS_INIT); + if (settingsInit != null) + { + client.createScriptEvent(settingsInit.getOnLoadListener()) + .setSource(settingsInit) + .run(); + } }); } @@ -152,6 +160,14 @@ public class CameraPlugin extends Plugin implements KeyListener, MouseListener { sideSlider.setOnMouseRepeatListener((Object[]) null); } + + Widget settingsInit = client.getWidget(WidgetInfo.SETTINGS_INIT); + if (settingsInit != null) + { + client.createScriptEvent(settingsInit.getOnLoadListener()) + .setSource(settingsInit) + .run(); + } }); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java index 44069b177d..4ccfd1925e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java @@ -34,13 +34,13 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.inject.Inject; +import javax.inject.Named; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.MessageNode; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameStateChanged; import net.runelite.client.Notifier; -import net.runelite.client.RuneLiteProperties; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; @@ -70,6 +70,10 @@ public class ChatNotificationsPlugin extends Plugin @Inject private Notifier notifier; + @Inject + @Named("runelite.title") + private String runeliteTitle; + //Custom Highlights private Pattern usernameMatcher = null; private String usernameReplacer = ""; @@ -163,7 +167,7 @@ public class ChatNotificationsPlugin extends Plugin break; case CONSOLE: // Don't notify for notification messages - if (chatMessage.getName().equals(RuneLiteProperties.getTitle())) + if (chatMessage.getName().equals(runeliteTitle)) { return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 1cca0adfb3..06dee6142a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -625,7 +625,7 @@ public class ClueScrollPlugin extends Plugin return emoteImage; } - emoteImage = ImageUtil.getResourceStreamFromClass(getClass(), "emote.png"); + emoteImage = ImageUtil.loadImageResource(getClass(), "emote.png"); return emoteImage; } @@ -642,7 +642,7 @@ public class ClueScrollPlugin extends Plugin return mapArrow; } - mapArrow = ImageUtil.getResourceStreamFromClass(getClass(), "/util/clue_arrow.png"); + mapArrow = ImageUtil.loadImageResource(getClass(), "/util/clue_arrow.png"); return mapArrow; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java index ded2628348..a8aff43840 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java @@ -52,7 +52,7 @@ public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScr new CipherClue("OVEXON", "Eluned", new WorldPoint(2289, 3144, 0), "Outside Lletya or in Prifddinas after Song of the Elves", "A question on elven crystal math. I have 5 and 3 crystals, large and small respectively. A large crystal is worth 10,000 coins and a small is worth but 1,000. How much are all my crystals worth?", "53,000"), new CipherClue("VTYR APCNTGLW", "King Percival", new WorldPoint(2634, 4682, 1), "Fisher Realm, first floor. Fairy ring BJR", "How many cannons are on this here castle?", "5"), new CipherClue("UZZU MUJHRKYYKJ", "Otto Godblessed", new WorldPoint(2501, 3487, 0), "Otto's Grotto", "How many pyre sites are found around this lake?", "3"), - new CipherClue("USBJCPSO", "Traiborn", new WorldPoint(3112, 3162, 0), "First floor of Wizards Tower", "How many air runes would I need to cast 630 wind waves?", "3150"), + new CipherClue("USBJCPSO", "Traiborn", new WorldPoint(3112, 3162, 0), "First floor of Wizards Tower. Fairy ring DIS", "How many air runes would I need to cast 630 wind waves?", "3150"), new CipherClue("HCKTA IQFHCVJGT", "Fairy Godfather", new WorldPoint(2446, 4428, 0), "Zanaris throne room", "There are 3 inputs and 4 letters on each ring How many total individual fairy ring codes are possible?", "64"), new CipherClue("ZSBKDO ZODO", "Pirate Pete", new WorldPoint(3680, 3537, 0), "Dock northeast of the Ectofunctus"), new CipherClue("GBJSZ RVFFO", "Fairy Queen", new WorldPoint(2347, 4435, 0), "Fairy Resistance Hideout"), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java index 278864ea15..fe6a5b54a2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java @@ -134,11 +134,11 @@ class ConfigPanel extends PluginPanel static { - final BufferedImage backIcon = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "config_back_icon.png"); + final BufferedImage backIcon = ImageUtil.loadImageResource(ConfigPanel.class, "config_back_icon.png"); BACK_ICON = new ImageIcon(backIcon); BACK_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(backIcon, -100)); - BufferedImage sectionRetractIcon = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "/util/arrow_right.png"); + BufferedImage sectionRetractIcon = ImageUtil.loadImageResource(ConfigPanel.class, "/util/arrow_right.png"); sectionRetractIcon = ImageUtil.luminanceOffset(sectionRetractIcon, -121); SECTION_EXPAND_ICON = new ImageIcon(sectionRetractIcon); SECTION_EXPAND_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(sectionRetractIcon, -100)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java index ac93dcf96b..41372e3895 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java @@ -83,7 +83,7 @@ public class ConfigPlugin extends Plugin )); pluginListPanel.rebuildPluginList(); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "config_icon.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "config_icon.png"); navButton = NavigationButton.builder() .tooltip("Configuration") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java index 978be1b4c5..562a8517e2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java @@ -102,14 +102,14 @@ class PluginHubPanel extends PluginPanel static { - BufferedImage missingIcon = ImageUtil.getResourceStreamFromClass(PluginHubPanel.class, "pluginhub_missingicon.png"); + BufferedImage missingIcon = ImageUtil.loadImageResource(PluginHubPanel.class, "pluginhub_missingicon.png"); MISSING_ICON = new ImageIcon(missingIcon); - BufferedImage helpIcon = ImageUtil.getResourceStreamFromClass(PluginHubPanel.class, "pluginhub_help.png"); + BufferedImage helpIcon = ImageUtil.loadImageResource(PluginHubPanel.class, "pluginhub_help.png"); HELP_ICON = new ImageIcon(helpIcon); HELP_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(helpIcon, -100)); - BufferedImage configureIcon = ImageUtil.getResourceStreamFromClass(PluginHubPanel.class, "pluginhub_configure.png"); + BufferedImage configureIcon = ImageUtil.loadImageResource(PluginHubPanel.class, "pluginhub_configure.png"); CONFIGURE_ICON = new ImageIcon(configureIcon); CONFIGURE_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(configureIcon, -100)); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java index c71bcc8788..767fddbc1a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java @@ -73,8 +73,8 @@ class PluginListItem extends JPanel implements SearchablePlugin static { - BufferedImage configIcon = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "config_edit_icon.png"); - BufferedImage onStar = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "star_on.png"); + BufferedImage configIcon = ImageUtil.loadImageResource(ConfigPanel.class, "config_edit_icon.png"); + BufferedImage onStar = ImageUtil.loadImageResource(ConfigPanel.class, "star_on.png"); CONFIG_ICON = new ImageIcon(configIcon); ON_STAR = new ImageIcon(onStar); CONFIG_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(configIcon, -100)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java index a2eb72719f..185a5e7ecc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginToggleButton.java @@ -29,7 +29,8 @@ import java.awt.Dimension; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JToggleButton; -import net.runelite.client.util.ImageUtil; +import com.openosrs.client.util.ImageUtil; +import net.runelite.client.ui.ColorScheme; import net.runelite.client.util.SwingUtil; class PluginToggleButton extends JToggleButton @@ -39,8 +40,8 @@ class PluginToggleButton extends JToggleButton static { - BufferedImage onSwitcher = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "switcher_on.png"); - ON_SWITCHER = new ImageIcon(onSwitcher); + BufferedImage onSwitcher = ImageUtil.loadImageResource(ConfigPanel.class, "switcher_on.png"); + ON_SWITCHER = new ImageIcon(ImageUtil.recolorImage(onSwitcher, ColorScheme.BRAND_BLUE)); OFF_SWITCHER = new ImageIcon(ImageUtil.flipImage( ImageUtil.luminanceScale( ImageUtil.grayscaleImage(onSwitcher), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/woodcutting/CrowdsourcingWoodcutting.java b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/woodcutting/CrowdsourcingWoodcutting.java index c8499575cf..e61a017960 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/woodcutting/CrowdsourcingWoodcutting.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/woodcutting/CrowdsourcingWoodcutting.java @@ -88,7 +88,7 @@ public class CrowdsourcingWoodcutting put(AnimationID.WOODCUTTING_INFERNAL, ItemID.INFERNAL_AXE). put(AnimationID.WOODCUTTING_3A_AXE, ItemID._3RD_AGE_AXE). put(AnimationID.WOODCUTTING_CRYSTAL, ItemID.CRYSTAL_AXE). - put(AnimationID.WOODCUTTING_TRAILBLAZER, ItemID.TRAILBLAZER_AXE).build(); + put(AnimationID.WOODCUTTING_TRAILBLAZER, ItemID.INFERNAL_AXE_OR).build(); private static final Set SUCCESS_MESSAGES = new ImmutableSet.Builder(). add("You get some logs."). diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java index 37208ddd23..3baf137c96 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java @@ -54,6 +54,6 @@ public enum CustomCursor CustomCursor(String name, String icon) { this.name = name; - this.cursorImage = ImageUtil.getResourceStreamFromClass(CustomCursorPlugin.class, icon); + this.cursorImage = ImageUtil.loadImageResource(CustomCursorPlugin.class, icon); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java index 7ee247f92c..abc63546d9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java @@ -174,7 +174,7 @@ class DevToolsPanel extends PluginPanel final JButton newInfoboxBtn = new JButton("Infobox"); newInfoboxBtn.addActionListener(e -> { - Counter counter = new Counter(ImageUtil.getResourceStreamFromClass(getClass(), "devtools_icon.png"), plugin, 42) + Counter counter = new Counter(ImageUtil.loadImageResource(getClass(), "devtools_icon.png"), plugin, 42) { @Override public String getName() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java index df0b342c3b..424c26e4c3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java @@ -198,7 +198,7 @@ public class DevToolsPlugin extends Plugin final DevToolsPanel panel = injector.getInstance(DevToolsPanel.class); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "devtools_icon.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "devtools_icon.png"); navButton = NavigationButton.builder() .tooltip("Developer Tools") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspectorOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspectorOverlay.java index 27b83f0f2a..bd89bd90c5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspectorOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetInspectorOverlay.java @@ -62,7 +62,7 @@ public class WidgetInspectorOverlay extends Overlay setPosition(OverlayPosition.DYNAMIC); setLayer(OverlayLayer.ABOVE_WIDGETS); setPriority(OverlayPriority.HIGHEST); - drawAfterInterface(WidgetID.FULLSCREEN_MAP_GROUP_ID); + drawAfterInterface(WidgetID.FULLSCREEN_CONTAINER_TLI); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java index d5a728a368..17b72b5d6e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java @@ -121,7 +121,7 @@ enum DiscordGameEventType CITY_JATIZSO("Jatizso" , DiscordAreaType.CITIES, 9531), CITY_KELDAGRIM("Keldagrim" , DiscordAreaType.CITIES, 11423, 11422, 11679, 11678), CITY_LANDS_END("Land's End", DiscordAreaType.CITIES, 5941), - CITY_LLETYA("Lletya" , DiscordAreaType.CITIES, 9265), + CITY_LLETYA("Lletya" , DiscordAreaType.CITIES, 9265, 11103), CITY_LOVAKENGJ_HOUSE("Lovakengj" , DiscordAreaType.CITIES, 5692, 5691, 5947, 6203, 6202, 5690, 5946), CITY_LUMBRIDGE("Lumbridge" , DiscordAreaType.CITIES, 12850), CITY_LUNAR_ISLE("Lunar Isle" , DiscordAreaType.CITIES, 8253, 8252, 8509, 8508), @@ -297,6 +297,7 @@ enum DiscordGameEventType MG_PYRAMID_PLUNDER("Pyramid Plunder", DiscordAreaType.MINIGAMES, 7749), MG_ROGUES_DEN("Rogues' Den", DiscordAreaType.MINIGAMES, 11855, 11854, 12111, 12110), MG_SORCERESS_GARDEN("Sorceress's Garden", DiscordAreaType.MINIGAMES, 11605), + MG_SOUL_WARS("Soul Wars", DiscordAreaType.MINIGAMES, 8493, 8748, 8749, 9005), MG_TEMPLE_TREKKING("Temple Trekking", DiscordAreaType.MINIGAMES, 8014, 8270, 8256, 8782, 9038, 9294, 9550, 9806), MG_TITHE_FARM("Tithe Farm", DiscordAreaType.MINIGAMES, 7222), MG_TROUBLE_BREWING("Trouble Brewing", DiscordAreaType.MINIGAMES, 15150), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index f4cdaa34a5..6f5ffbdcd1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -37,6 +37,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.imageio.ImageIO; +import javax.inject.Named; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; @@ -46,7 +47,6 @@ import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.StatChanged; import net.runelite.api.events.VarbitChanged; -import net.runelite.client.RuneLiteProperties; import net.runelite.client.config.ConfigManager; import net.runelite.client.discord.DiscordService; import net.runelite.client.discord.events.DiscordJoinGame; @@ -106,6 +106,10 @@ public class DiscordPlugin extends Plugin @Inject private OkHttpClient okHttpClient; + @Inject + @Named("runelite.discord.invite") + private String discordInvite; + private final Map skillExp = new HashMap<>(); private NavigationButton discordButton; private boolean loginFlag; @@ -119,13 +123,13 @@ public class DiscordPlugin extends Plugin @Override protected void startUp() throws Exception { - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "discord.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "discord.png"); discordButton = NavigationButton.builder() .tab(false) .tooltip("Join Discord") .icon(icon) - .onClick(() -> LinkBrowser.browse(RuneLiteProperties.getDiscordInvite())) + .onClick(() -> LinkBrowser.browse(discordInvite)) .build(); clientToolbar.addNavigation(discordButton); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java index 671107833e..f311511d26 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java @@ -35,8 +35,8 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import javax.inject.Inject; +import javax.inject.Named; import lombok.Data; -import net.runelite.client.RuneLiteProperties; import net.runelite.client.discord.DiscordPresence; import net.runelite.client.discord.DiscordService; import net.runelite.client.ws.PartyService; @@ -60,14 +60,24 @@ class DiscordState private final DiscordService discordService; private final DiscordConfig config; private final PartyService party; + private final String runeliteTitle; + private final String runeliteVersion; private DiscordPresence lastPresence; @Inject - private DiscordState(final DiscordService discordService, final DiscordConfig config, final PartyService party) + private DiscordState( + final DiscordService discordService, + final DiscordConfig config, + final PartyService party, + @Named("runelite.title") final String runeliteTitle, + @Named("runelite.version") final String runeliteVersion + ) { this.discordService = discordService; this.config = config; this.party = party; + this.runeliteTitle = runeliteTitle; + this.runeliteVersion = runeliteVersion; } /** @@ -188,12 +198,12 @@ class DiscordState } // Replace snapshot with + to make tooltip shorter (so it will span only 1 line) - final String versionShortHand = RuneLiteProperties.getVersion().replace("-SNAPSHOT", "+"); + final String versionShortHand = runeliteVersion.replace("-SNAPSHOT", "+"); final DiscordPresence.DiscordPresenceBuilder presenceBuilder = DiscordPresence.builder() .state(MoreObjects.firstNonNull(state, "")) .details(MoreObjects.firstNonNull(details, "")) - .largeImageText(RuneLiteProperties.getTitle() + " v" + versionShortHand) + .largeImageText(runeliteTitle + " v" + versionShortHand) .smallImageKey(imageKey) .partyMax(PARTY_MAX) .partySize(party.getMembers().size()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java index acee57ab0f..37cc934ce2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java @@ -116,7 +116,7 @@ enum Emoji BufferedImage loadImage() { - return ImageUtil.getResourceStreamFromClass(getClass(), this.name().toLowerCase() + ".png"); + return ImageUtil.loadImageResource(getClass(), this.name().toLowerCase() + ".png"); } static Emoji getEmoji(String trigger) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java index 976082dcd7..72e7f4a085 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java @@ -314,7 +314,7 @@ public class ExaminePlugin extends Plugin return new int[]{widgetItem.getItemQuantity(), widgetItem.getItemId()}; } } - else if (WidgetInfo.SHOP_ITEMS_CONTAINER.getGroupId() == widgetGroup) + else if (WidgetID.SHOP_GROUP_ID == widgetGroup) { Widget widgetItem = widget.getChild(actionParam); if (widgetItem != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java index 7b1d987c4e..66894b3cda 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java @@ -101,8 +101,8 @@ class FeedPanel extends PluginPanel static { - RUNELITE_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(FeedPanel.class, "runelite.png")); - OSRS_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(FeedPanel.class, "osrs.png")); + RUNELITE_ICON = new ImageIcon(ImageUtil.loadImageResource(FeedPanel.class, "runelite.png")); + OSRS_ICON = new ImageIcon(ImageUtil.loadImageResource(FeedPanel.class, "osrs.png")); } private final FeedConfig config; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java index 5cc4ea0bd9..ebe607d986 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java @@ -97,7 +97,7 @@ public class FeedPlugin extends Plugin { feedPanel = injector.getInstance(FeedPanel.class); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "icon.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "icon.png"); navButton = NavigationButton.builder() .tooltip("News Feed") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java index 65257adeb8..4715450f79 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java @@ -274,8 +274,8 @@ public class FishingPlugin extends Plugin case ItemID.KARAMBWAN_VESSEL_3159: case ItemID.CORMORANTS_GLOVE: case ItemID.CORMORANTS_GLOVE_22817: + case ItemID.INFERNAL_HARPOON_OR: case ItemID.TRAILBLAZER_HARPOON: - case ItemID.TRAILBLAZER_HARPOON_25114: case ItemID.CRYSTAL_HARPOON: case ItemID.CRYSTAL_HARPOON_23864: case ItemID.CRYSTAL_HARPOON_INACTIVE: diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java index c3b4426a2a..55183e9dff 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/friendnotes/FriendNotesPlugin.java @@ -327,7 +327,7 @@ public class FriendNotesPlugin extends Plugin public void onRemovedFriend(RemovedFriend event) { // Delete a friend's note if they are removed - final String displayName = Text.toJagexName(event.getName()); + final String displayName = Text.toJagexName(event.getNameable().getName()); log.debug("Remove friend: '{}'", displayName); setFriendNote(displayName, null); } @@ -416,7 +416,7 @@ public class FriendNotesPlugin extends Plugin return; } - final BufferedImage iconImg = ImageUtil.getResourceStreamFromClass(getClass(), "note_icon.png"); + final BufferedImage iconImg = ImageUtil.loadImageResource(getClass(), "note_icon.png"); if (iconImg == null) { return; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 67b2c1bcc1..a6be4e5872 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -242,8 +242,6 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private AntiAliasingMode lastAntiAliasingMode; private int lastAnisotropicFilteringLevel = -1; - private int centerX; - private int centerY; private int yaw; private int pitch; // fields for non-compute draw @@ -264,12 +262,14 @@ public class GpuPlugin extends Plugin implements DrawCallbacks private int uniTexSamplingMode; private int uniTexSourceDimensions; private int uniTexTargetDimensions; + private int uniUiAlphaOverlay; private int uniTextures; private int uniTextureOffsets; private int uniBlockSmall; private int uniBlockLarge; private int uniBlockMain; private int uniSmoothBanding; + private int uniTextureLightMode; @Override protected void startUp() @@ -539,12 +539,14 @@ public class GpuPlugin extends Plugin implements DrawCallbacks uniFogDepth = gl.glGetUniformLocation(glProgram, "fogDepth"); uniDrawDistance = gl.glGetUniformLocation(glProgram, "drawDistance"); uniColorBlindMode = gl.glGetUniformLocation(glProgram, "colorBlindMode"); + uniTextureLightMode = gl.glGetUniformLocation(glProgram, "textureLightMode"); uniTex = gl.glGetUniformLocation(glUiProgram, "tex"); uniTexSamplingMode = gl.glGetUniformLocation(glUiProgram, "samplingMode"); uniTexTargetDimensions = gl.glGetUniformLocation(glUiProgram, "targetDimensions"); uniTexSourceDimensions = gl.glGetUniformLocation(glUiProgram, "sourceDimensions"); uniUiColorBlindMode = gl.glGetUniformLocation(glUiProgram, "colorBlindMode"); + uniUiAlphaOverlay = gl.glGetUniformLocation(glUiProgram, "alphaOverlay"); uniTextures = gl.glGetUniformLocation(glProgram, "textures"); uniTextureOffsets = gl.glGetUniformLocation(glProgram, "textureOffsets"); @@ -774,13 +776,149 @@ public class GpuPlugin extends Plugin implements DrawCallbacks @Override public void drawScene(int cameraX, int cameraY, int cameraZ, int cameraPitch, int cameraYaw, int plane) { - centerX = client.getCenterX(); - centerY = client.getCenterY(); yaw = client.getCameraYaw(); pitch = client.getCameraPitch(); final Scene scene = client.getScene(); scene.setDrawDistance(getDrawDistance()); + + invokeOnMainThread(() -> + { + // UBO. Only the first 32 bytes get modified here, the rest is the constant sin/cos table. + gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, uniformBufferId); + uniformBuffer.clear(); + uniformBuffer + .put(yaw) + .put(pitch) + .put(client.getCenterX()) + .put(client.getCenterY()) + .put(client.getScale()) + .put(cameraX) + .put(cameraY) + .put(cameraZ); + uniformBuffer.flip(); + + gl.glBufferSubData(gl.GL_UNIFORM_BUFFER, 0, uniformBuffer.limit() * Integer.BYTES, uniformBuffer); + gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, 0); + + gl.glBindBufferBase(gl.GL_UNIFORM_BUFFER, 0, uniformBufferId); + }); + } + + @Override + public void postDrawScene() + { + invokeOnMainThread(this::postDraw); + } + + private void postDraw() + { + if (!useComputeShaders) + { + // Upload buffers + vertexBuffer.flip(); + uvBuffer.flip(); + + IntBuffer vertexBuffer = this.vertexBuffer.getBuffer(); + FloatBuffer uvBuffer = this.uvBuffer.getBuffer(); + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpBufferId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, vertexBuffer.limit() * Integer.BYTES, vertexBuffer, gl.GL_DYNAMIC_DRAW); + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpUvBufferId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, uvBuffer.limit() * Float.BYTES, uvBuffer, gl.GL_DYNAMIC_DRAW); + + return; + } + + // Upload buffers + vertexBuffer.flip(); + uvBuffer.flip(); + modelBuffer.flip(); + modelBufferSmall.flip(); + modelBufferUnordered.flip(); + + IntBuffer vertexBuffer = this.vertexBuffer.getBuffer(); + FloatBuffer uvBuffer = this.uvBuffer.getBuffer(); + IntBuffer modelBuffer = this.modelBuffer.getBuffer(); + IntBuffer modelBufferSmall = this.modelBufferSmall.getBuffer(); + IntBuffer modelBufferUnordered = this.modelBufferUnordered.getBuffer(); + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpBufferId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, vertexBuffer.limit() * Integer.BYTES, vertexBuffer, gl.GL_DYNAMIC_DRAW); + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpUvBufferId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, uvBuffer.limit() * Float.BYTES, uvBuffer, gl.GL_DYNAMIC_DRAW); + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpModelBufferId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, modelBuffer.limit() * Integer.BYTES, modelBuffer, gl.GL_DYNAMIC_DRAW); + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpModelBufferSmallId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, modelBufferSmall.limit() * Integer.BYTES, modelBufferSmall, gl.GL_DYNAMIC_DRAW); + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpModelBufferUnorderedId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, modelBufferUnordered.limit() * Integer.BYTES, modelBufferUnordered, gl.GL_DYNAMIC_DRAW); + + // Output buffers + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpOutBufferId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, + targetBufferOffset * 16, // each vertex is an ivec4, which is 16 bytes + null, + gl.GL_STREAM_DRAW); + + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpOutUvBufferId); + gl.glBufferData(gl.GL_ARRAY_BUFFER, + targetBufferOffset * 16, + null, + gl.GL_STREAM_DRAW); + + // Bind UBO to compute programs + gl.glUniformBlockBinding(glSmallComputeProgram, uniBlockSmall, 0); + gl.glUniformBlockBinding(glComputeProgram, uniBlockLarge, 0); + + /* + * Compute is split into three separate programs: 'unordered', 'small', and 'large' + * to save on GPU resources. Small will sort <= 512 faces, large will do <= 4096. + */ + + // unordered + gl.glUseProgram(glUnorderedComputeProgram); + + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferUnorderedId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); + + gl.glDispatchCompute(unorderedModels, 1, 1); + + // small + gl.glUseProgram(glSmallComputeProgram); + + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferSmallId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); + + gl.glDispatchCompute(smallModels, 1, 1); + + // large + gl.glUseProgram(glComputeProgram); + + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); + gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); + + gl.glDispatchCompute(largeModels, 1, 1); } @Override @@ -855,9 +993,9 @@ public class GpuPlugin extends Plugin implements DrawCallbacks } @Override - public void draw() + public void draw(int overlayColor) { - invokeOnMainThread(this::drawFrame); + invokeOnMainThread(() -> drawFrame(overlayColor)); } private void resize(int canvasWidth, int canvasHeight, int viewportWidth, int viewportHeight) @@ -883,7 +1021,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks } } - private void drawFrame() + private void drawFrame(int overlayColor) { if (jawtWindow.getAWTComponent() != client.getCanvas()) { @@ -953,121 +1091,10 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glClearColor((sky >> 16 & 0xFF) / 255f, (sky >> 8 & 0xFF) / 255f, (sky & 0xFF) / 255f, 1f); gl.glClear(gl.GL_COLOR_BUFFER_BIT); - // Upload buffers - vertexBuffer.flip(); - uvBuffer.flip(); - modelBuffer.flip(); - modelBufferSmall.flip(); - modelBufferUnordered.flip(); - - IntBuffer vertexBuffer = this.vertexBuffer.getBuffer(); - FloatBuffer uvBuffer = this.uvBuffer.getBuffer(); - IntBuffer modelBuffer = this.modelBuffer.getBuffer(); - IntBuffer modelBufferSmall = this.modelBufferSmall.getBuffer(); - IntBuffer modelBufferUnordered = this.modelBufferUnordered.getBuffer(); - - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpBufferId); - gl.glBufferData(gl.GL_ARRAY_BUFFER, vertexBuffer.limit() * Integer.BYTES, vertexBuffer, gl.GL_DYNAMIC_DRAW); - - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpUvBufferId); - gl.glBufferData(gl.GL_ARRAY_BUFFER, uvBuffer.limit() * Float.BYTES, uvBuffer, gl.GL_DYNAMIC_DRAW); - - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpModelBufferId); - gl.glBufferData(gl.GL_ARRAY_BUFFER, modelBuffer.limit() * Integer.BYTES, modelBuffer, gl.GL_DYNAMIC_DRAW); - - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpModelBufferSmallId); - gl.glBufferData(gl.GL_ARRAY_BUFFER, modelBufferSmall.limit() * Integer.BYTES, modelBufferSmall, gl.GL_DYNAMIC_DRAW); - - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpModelBufferUnorderedId); - gl.glBufferData(gl.GL_ARRAY_BUFFER, modelBufferUnordered.limit() * Integer.BYTES, modelBufferUnordered, gl.GL_DYNAMIC_DRAW); - - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpOutBufferId); - gl.glBufferData(gl.GL_ARRAY_BUFFER, - targetBufferOffset * 16, // each vertex is an ivec4, which is 16 bytes - null, - gl.GL_STREAM_DRAW); - - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, tmpOutUvBufferId); - gl.glBufferData(gl.GL_ARRAY_BUFFER, - targetBufferOffset * 16, - null, - gl.GL_STREAM_DRAW); - - // UBO. Only the first 32 bytes get modified here, the rest is the constant sin/cos table. - gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, uniformBufferId); - uniformBuffer.clear(); - uniformBuffer - .put(yaw) - .put(pitch) - .put(centerX) - .put(centerY) - .put(client.getScale()) - .put(client.getCameraX2()) - .put(client.getCameraY2()) - .put(client.getCameraZ2()); - uniformBuffer.flip(); - - gl.glBufferSubData(gl.GL_UNIFORM_BUFFER, 0, uniformBuffer.limit() * Integer.BYTES, uniformBuffer); - gl.glBindBuffer(gl.GL_UNIFORM_BUFFER, 0); - - gl.glBindBufferBase(gl.GL_UNIFORM_BUFFER, 0, uniformBufferId); - // Draw 3d scene final TextureProvider textureProvider = client.getTextureProvider(); if (textureProvider != null) { - if (useComputeShaders) - { - gl.glUniformBlockBinding(glSmallComputeProgram, uniBlockSmall, 0); - gl.glUniformBlockBinding(glComputeProgram, uniBlockLarge, 0); - - /* - * Compute is split into two separate programs 'small' and 'large' to - * save on GPU resources. Small will sort <= 512 faces, large will do <= 4096. - */ - - // unordered - gl.glUseProgram(glUnorderedComputeProgram); - - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferUnorderedId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); - - gl.glDispatchCompute(unorderedModels, 1, 1); - - // small - gl.glUseProgram(glSmallComputeProgram); - - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferSmallId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); - - gl.glDispatchCompute(smallModels, 1, 1); - - // large - gl.glUseProgram(glComputeProgram); - - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 0, tmpModelBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 1, this.bufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 2, tmpBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 3, tmpOutBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 4, tmpOutUvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 5, this.uvBufferId); - gl.glBindBufferBase(gl.GL_SHADER_STORAGE_BUFFER, 6, tmpUvBufferId); - - gl.glDispatchCompute(largeModels, 1, 1); - - gl.glMemoryBarrier(gl.GL_SHADER_STORAGE_BARRIER_BIT); - } - if (textureArrayId == -1) { // lazy init textures as they may not be loaded at plugin start. @@ -1126,6 +1153,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glUniform1f(uniBrightness, (float) textureProvider.getBrightness()); gl.glUniform1f(uniSmoothBanding, config.smoothBanding() ? 0f : 1f); gl.glUniform1i(uniColorBlindMode, config.colorBlindMode().ordinal()); + gl.glUniform1f(uniTextureLightMode, config.brightTextures() ? 1f : 0f); // Calculate projection matrix Matrix4 projectionMatrix = new Matrix4(); @@ -1166,14 +1194,28 @@ public class GpuPlugin extends Plugin implements DrawCallbacks // Draw buffers gl.glBindVertexArray(vaoHandle); - // When using compute shaders, draw using the output buffer of the compute. Otherwise - // only use the temporary buffers, which will contain the full scene. + int vertexBuffer, uvBuffer; + if (useComputeShaders) + { + // Before reading the SSBOs written to from postDrawScene() we must insert a barrier + gl.glMemoryBarrier(gl.GL_SHADER_STORAGE_BARRIER_BIT); + // Draw using the output buffer of the compute + vertexBuffer = tmpOutBufferId; + uvBuffer = tmpOutUvBufferId; + } + else + { + // Only use the temporary buffers, which will contain the full scene + vertexBuffer = tmpBufferId; + uvBuffer = tmpUvBufferId; + } + gl.glEnableVertexAttribArray(0); - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, useComputeShaders ? tmpOutBufferId : tmpBufferId); + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vertexBuffer); gl.glVertexAttribIPointer(0, 4, gl.GL_INT, 0, 0); gl.glEnableVertexAttribArray(1); - gl.glBindBuffer(gl.GL_ARRAY_BUFFER, useComputeShaders ? tmpOutUvBufferId : tmpUvBufferId); + gl.glBindBuffer(gl.GL_ARRAY_BUFFER, uvBuffer); gl.glVertexAttribPointer(1, 4, gl.GL_FLOAT, false, 0, 0); gl.glDrawArrays(gl.GL_TRIANGLES, 0, targetBufferOffset); @@ -1208,7 +1250,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks tempUvOffset = 0; // Texture on UI - drawUi(canvasHeight, canvasWidth); + drawUi(overlayColor, canvasHeight, canvasWidth); glDrawable.swapBuffers(); @@ -1226,7 +1268,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks }; } - private void drawUi(final int canvasHeight, final int canvasWidth) + private void drawUi(final int overlayColor, final int canvasHeight, final int canvasWidth) { final BufferProvider bufferProvider = client.getBufferProvider(); final int[] pixels = bufferProvider.getPixels(); @@ -1254,6 +1296,12 @@ public class GpuPlugin extends Plugin implements DrawCallbacks gl.glUniform1i(uniTexSamplingMode, uiScalingMode.getMode()); gl.glUniform2i(uniTexSourceDimensions, canvasWidth, canvasHeight); gl.glUniform1i(uniUiColorBlindMode, config.colorBlindMode().ordinal()); + gl.glUniform4f(uniUiAlphaOverlay, + (overlayColor >> 16 & 0xFF) / 255f, + (overlayColor >> 8 & 0xFF) / 255f, + (overlayColor & 0xFF) / 255f, + (overlayColor >>> 24) / 255f + ); if (client.isStretchedEnabled()) { @@ -1449,14 +1497,20 @@ public class GpuPlugin extends Plugin implements DrawCallbacks Model model = renderable instanceof Model ? (Model) renderable : renderable.getModel(); if (model != null) { + // Apply height to renderable from the model + if (model != renderable) + { + renderable.setModelHeight(model.getModelHeight()); + } + model.calculateBoundsCylinder(); - model.calculateExtreme(orientation); if (!isVisible(model, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash)) { return; } + model.calculateExtreme(orientation); client.checkClickbox(model, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); modelX = x + client.getCameraX2(); @@ -1480,13 +1534,13 @@ public class GpuPlugin extends Plugin implements DrawCallbacks Model model = (Model) renderable; model.calculateBoundsCylinder(); - model.calculateExtreme(orientation); if (!isVisible(model, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash)) { return; } + model.calculateExtreme(orientation); client.checkClickbox(model, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); int tc = Math.min(MAX_TRIANGLE, model.getTrianglesCount()); @@ -1512,16 +1566,19 @@ public class GpuPlugin extends Plugin implements DrawCallbacks if (model != null) { // Apply height to renderable from the model - model.setModelHeight(model.getModelHeight()); + if (model != renderable) + { + renderable.setModelHeight(model.getModelHeight()); + } model.calculateBoundsCylinder(); - model.calculateExtreme(orientation); if (!isVisible(model, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash)) { return; } + model.calculateExtreme(orientation); client.checkClickbox(model, orientation, pitchSin, pitchCos, yawSin, yawCos, x, y, z, hash); boolean hasUv = model.getFaceTextures() != null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java index bef0ce2921..9f276fa8e1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPluginConfig.java @@ -28,9 +28,9 @@ import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; import net.runelite.client.config.Range; +import static net.runelite.client.plugins.gpu.GpuPlugin.MAX_DISTANCE; import static net.runelite.client.plugins.gpu.GpuPlugin.MAX_FOG_DEPTH; import net.runelite.client.plugins.gpu.config.AntiAliasingMode; -import static net.runelite.client.plugins.gpu.GpuPlugin.MAX_DISTANCE; import net.runelite.client.plugins.gpu.config.ColorBlindMode; import net.runelite.client.plugins.gpu.config.UIScalingMode; @@ -135,4 +135,15 @@ public interface GpuPluginConfig extends Config { return ColorBlindMode.NONE; } + + @ConfigItem( + keyName = "brightTextures", + name = "Bright Textures", + description = "Use old texture lighting method which results in brighter game textures", + position = 9 + ) + default boolean brightTextures() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java index 9cb66911af..c7db3ab0ab 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java @@ -37,7 +37,7 @@ public interface GrandExchangeConfig extends Config position = 1, keyName = "quickLookup", name = "Hotkey lookup (Alt + Left click)", - description = "Configures whether to enable the hotkey lookup for ge searches" + description = "Configures whether to enable the hotkey lookup for GE searches" ) default boolean quickLookup() { @@ -59,7 +59,7 @@ public interface GrandExchangeConfig extends Config position = 3, keyName = "enableOsbPrices", name = "Enable OSB actively traded prices", - description = "Shows the OSBuddy actively traded price at the GE" + description = "Shows the OSBuddy actively traded price on the GE buy interface" ) default boolean enableOsbPrices() { @@ -92,8 +92,8 @@ public interface GrandExchangeConfig extends Config @ConfigItem( position = 6, keyName = "showTotal", - name = "Show grand exchange total", - description = "Show grand exchange total" + name = "Show GE total", + description = "Display the total value of all trades at the top of the GE interface" ) default boolean showTotal() { @@ -104,7 +104,7 @@ public interface GrandExchangeConfig extends Config position = 7, keyName = "showExact", name = "Show exact total value", - description = "Show exact total value" + description = "When enabled along with the ‘Show GE total’ option, the unabbreviated value will be displayed" ) default boolean showExact() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java index 13405426b9..ab9a04f5c2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java @@ -82,7 +82,7 @@ public class GrandExchangeOfferSlot extends JPanel static { - final BufferedImage rightArrow = ImageUtil.alphaOffset(ImageUtil.getResourceStreamFromClass(GrandExchangeOfferSlot.class, "/util/arrow_right.png"), 0.25f); + final BufferedImage rightArrow = ImageUtil.alphaOffset(ImageUtil.loadImageResource(GrandExchangeOfferSlot.class, "/util/arrow_right.png"), 0.25f); RIGHT_ARROW_ICON = new ImageIcon(rightArrow); LEFT_ARROW_ICON = new ImageIcon(ImageUtil.flipImage(rightArrow, true, false)); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index 4e7886292e..d28f4b0323 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -289,7 +289,7 @@ public class GrandExchangePlugin extends Plugin { panel = injector.getInstance(GrandExchangePanel.class); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "ge_icon.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "ge_icon.png"); button = NavigationButton.builder() .tooltip("Grand Exchange") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java index 7876289da6..25191a428f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -206,7 +206,7 @@ public class HiscorePanel extends PluginPanel for (HiscoreEndpoint endpoint : ENDPOINTS) { - final BufferedImage iconImage = ImageUtil.getResourceStreamFromClass(getClass(), endpoint.name().toLowerCase() + ".png"); + final BufferedImage iconImage = ImageUtil.loadImageResource(getClass(), endpoint.name().toLowerCase() + ".png"); MaterialTab tab = new MaterialTab(new ImageIcon(iconImage), tabGroup, null); tab.setToolTipText(endpoint.getName() + " Hiscores"); @@ -282,6 +282,7 @@ public class HiscorePanel extends PluginPanel minigamePanel.add(makeHiscorePanel(CLUE_SCROLL_ALL)); minigamePanel.add(makeHiscorePanel(LEAGUE_POINTS)); minigamePanel.add(makeHiscorePanel(LAST_MAN_STANDING)); + minigamePanel.add(makeHiscorePanel(SOUL_WARS_ZEAL)); minigamePanel.add(makeHiscorePanel(BOUNTY_HUNTER_ROGUE)); minigamePanel.add(makeHiscorePanel(BOUNTY_HUNTER_HUNTER)); @@ -345,7 +346,7 @@ public class HiscorePanel extends PluginPanel String skillIcon = directory + skillName + ".png"; log.debug("Loading skill icon from {}", skillIcon); - label.setIcon(new ImageIcon(ImageUtil.getResourceStreamFromClass(getClass(), skillIcon))); + label.setIcon(new ImageIcon(ImageUtil.loadImageResource(getClass(), skillIcon))); boolean totalLabel = skill == OVERALL || skill == null; //overall or combat label.setIconTextGap(totalLabel ? 10 : 4); @@ -595,6 +596,18 @@ public class HiscorePanel extends PluginPanel } break; } + case SOUL_WARS_ZEAL: + { + Skill soulWarsZeal = result.getSoulWarsZeal(); + String rank = (soulWarsZeal.getRank() == -1) ? "Unranked" : QuantityFormatter.formatNumber(soulWarsZeal.getRank()); + content += "

Soul Wars Zeal

"; + content += "

Rank: " + rank + "

"; + if (soulWarsZeal.getLevel() > -1) + { + content += "

Score: " + QuantityFormatter.formatNumber(soulWarsZeal.getLevel()) + "

"; + } + break; + } case LEAGUE_POINTS: { Skill leaguePoints = result.getLeaguePoints(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java index 75e41f6018..edb450d61b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java @@ -94,7 +94,7 @@ public class HiscorePlugin extends Plugin { hiscorePanel = injector.getInstance(HiscorePanel.class); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "normal.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "normal.png"); navButton = NavigationButton.builder() .tooltip("Hiscore") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java index d691cef668..c59fa78798 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java @@ -36,6 +36,7 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; +import javax.inject.Named; import javax.inject.Singleton; import javax.swing.Box; import javax.swing.ImageIcon; @@ -91,14 +92,34 @@ public class InfoPanel extends PluginPanel @Inject private ConfigManager configManager; + @Inject + @Named("runelite.version") + private String runeliteVersion; + + @Inject + @Named("runelite.github.link") + private String githubLink; + + @Inject + @Named("runelite.discord.invite") + private String discordInvite; + + @Inject + @Named("runelite.patreon.link") + private String patreonLink; + + @Inject + @Named("runelite.wiki.link") + private String wikiLink; + static { - ARROW_RIGHT_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "/util/arrow_right.png")); - GITHUB_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "github_icon.png")); - DISCORD_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "discord_icon.png")); - PATREON_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "patreon_icon.png")); - WIKI_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "wiki_icon.png")); - IMPORT_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "import_icon.png")); + ARROW_RIGHT_ICON = new ImageIcon(ImageUtil.loadImageResource(InfoPanel.class, "/util/arrow_right.png")); + GITHUB_ICON = new ImageIcon(ImageUtil.loadImageResource(InfoPanel.class, "github_icon.png")); + DISCORD_ICON = new ImageIcon(ImageUtil.loadImageResource(InfoPanel.class, "discord_icon.png")); + PATREON_ICON = new ImageIcon(ImageUtil.loadImageResource(InfoPanel.class, "patreon_icon.png")); + WIKI_ICON = new ImageIcon(ImageUtil.loadImageResource(InfoPanel.class, "wiki_icon.png")); + IMPORT_ICON = new ImageIcon(ImageUtil.loadImageResource(InfoPanel.class, "import_icon.png")); } void init() @@ -114,7 +135,7 @@ public class InfoPanel extends PluginPanel final Font smallFont = FontManager.getRunescapeSmallFont(); - JLabel version = new JLabel(htmlLabel("RuneLite version: ", RuneLiteProperties.getVersion())); + JLabel version = new JLabel(htmlLabel("RuneLite version: ", runeliteVersion)); version.setFont(smallFont); JLabel revision = new JLabel(); @@ -173,10 +194,10 @@ public class InfoPanel extends PluginPanel } }); - actionsContainer.add(buildLinkPanel(GITHUB_ICON, "Report an issue or", "make a suggestion", RuneLiteProperties.getGithubLink())); - actionsContainer.add(buildLinkPanel(DISCORD_ICON, "Talk to us on our", "Discord server", RuneLiteProperties.getDiscordInvite())); - actionsContainer.add(buildLinkPanel(PATREON_ICON, "Become a patron to", "help support RuneLite", RuneLiteProperties.getPatreonLink())); - actionsContainer.add(buildLinkPanel(WIKI_ICON, "Information about", "RuneLite and plugins", RuneLiteProperties.getWikiLink())); + actionsContainer.add(buildLinkPanel(GITHUB_ICON, "Report an issue or", "make a suggestion", githubLink)); + actionsContainer.add(buildLinkPanel(DISCORD_ICON, "Talk to us on our", "Discord server", discordInvite)); + actionsContainer.add(buildLinkPanel(PATREON_ICON, "Become a patron to", "help support RuneLite", patreonLink)); + actionsContainer.add(buildLinkPanel(WIKI_ICON, "Information about", "RuneLite and plugins", wikiLink)); add(versionPanel, BorderLayout.NORTH); add(actionsContainer, BorderLayout.CENTER); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java index f986a28ffa..6b85037e67 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java @@ -50,7 +50,7 @@ public class InfoPlugin extends Plugin final InfoPanel panel = injector.getInstance(InfoPanel.class); panel.init(); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "info_icon.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "info_icon.png"); navButton = NavigationButton.builder() .tooltip("Info") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java index 48ee9313fa..f224fa55f7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interfacestyles/InterfaceStylesPlugin.java @@ -264,7 +264,7 @@ public class InterfaceStylesPlugin extends Plugin try { log.debug("Loading: {}", file); - BufferedImage image = ImageUtil.getResourceStreamFromClass(this.getClass(), file); + BufferedImage image = ImageUtil.loadImageResource(this.getClass(), file); return ImageUtil.getImageSpritePixels(image, client); } catch (RuntimeException ex) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java index 6391628e4d..a5dc493f5b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java @@ -60,7 +60,7 @@ public class ItemStatChanges add(food(3), SHRIMPS, COOKED_MEAT, COOKED_CHICKEN, ROE, CHOCOLATE_BAR); add(food(4), SARDINE, CAKE, _23_CAKE, SLICE_OF_CAKE, CHOCOLATEY_MILK, BAKED_POTATO, EDIBLE_SEAWEED, MOONLIGHT_MEAD); add(food(5), BREAD, HERRING, CHOCOLATE_CAKE, _23_CHOCOLATE_CAKE, CHOCOLATE_SLICE, COOKED_RABBIT, CHILLI_CON_CARNE, - FRIED_MUSHROOMS, FRIED_ONIONS, REDBERRY_PIE, HALF_A_REDBERRY_PIE, CAVIAR, PYSK_FISH_0); + FRIED_MUSHROOMS, FRIED_ONIONS, REDBERRY_PIE, HALF_A_REDBERRY_PIE, CAVIAR, PYSK_FISH_0, COOKED_MYSTERY_MEAT); add(food(6), CHOCICE, MACKEREL, MEAT_PIE, HALF_A_MEAT_PIE, GUANIC_BAT_0, ROAST_BIRD_MEAT, SQUARE_SANDWICH, ROLL, BAGUETTE, TRIANGLE_SANDWICH, GIANT_CARP); add(food(7), TROUT, COD, PLAIN_PIZZA, _12_PLAIN_PIZZA, APPLE_PIE, HALF_AN_APPLE_PIE, ROAST_RABBIT, @@ -111,6 +111,7 @@ public class ItemStatChanges add(combo(2, food(5), boost(STRENGTH, 4), heal(ATTACK, -3)), PREMADE_SGG, SHORT_GREEN_GUY); add(combo(2, food(5), boost(STRENGTH, 7), heal(ATTACK, -4)), PREMADE_DR_DRAGON, DRUNK_DRAGON); add(combo(2, food(5), boost(STRENGTH, 7), heal(ATTACK, -4)), PREMADE_CHOC_SDY, CHOC_SATURDAY); + add(combo(4, boost(ATTACK, 5), boost(STRENGTH, 5), heal(MAGIC, -5), heal(PRAYER, -5)), BLOOD_PINT); // Sq'irk Juice add(heal(RUN_ENERGY, 5), WINTER_SQIRKJUICE); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java index 73d5a1937f..513127a248 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java @@ -59,7 +59,7 @@ class KourendLibraryPanel extends PluginPanel static { - final BufferedImage resetIcon = ImageUtil.getResourceStreamFromClass(KourendLibraryPanel.class, "/util/reset.png"); + final BufferedImage resetIcon = ImageUtil.loadImageResource(KourendLibraryPanel.class, "/util/reset.png"); RESET_ICON = new ImageIcon(resetIcon); RESET_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(resetIcon, -100)); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java index d0bd3c11cf..b79ee73720 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java @@ -134,7 +134,7 @@ public class KourendLibraryPlugin extends Plugin panel = injector.getInstance(KourendLibraryPanel.class); panel.init(); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "panel_icon.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "panel_icon.png"); navButton = NavigationButton.builder() .tooltip("Kourend Library") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java index e338af7fe6..a4ede4f9dc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java @@ -308,7 +308,7 @@ public class LoginScreenPlugin extends Plugin implements KeyListener try { log.debug("Loading: {}", file); - BufferedImage image = ImageUtil.getResourceStreamFromClass(this.getClass(), file); + BufferedImage image = ImageUtil.loadImageResource(this.getClass(), file); return ImageUtil.getImageSpritePixels(image, client); } catch (RuntimeException ex) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index f90563954a..cb4802cdaf 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -131,13 +131,13 @@ class LootTrackerPanel extends PluginPanel static { - final BufferedImage singleLootImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "single_loot_icon.png"); - final BufferedImage groupedLootImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "grouped_loot_icon.png"); - final BufferedImage backArrowImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "back_icon.png"); - final BufferedImage visibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "visible_icon.png"); - final BufferedImage invisibleImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "invisible_icon.png"); - final BufferedImage collapseImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "collapsed.png"); - final BufferedImage expandedImg = ImageUtil.getResourceStreamFromClass(LootTrackerPlugin.class, "expanded.png"); + final BufferedImage singleLootImg = ImageUtil.loadImageResource(LootTrackerPlugin.class, "single_loot_icon.png"); + final BufferedImage groupedLootImg = ImageUtil.loadImageResource(LootTrackerPlugin.class, "grouped_loot_icon.png"); + final BufferedImage backArrowImg = ImageUtil.loadImageResource(LootTrackerPlugin.class, "back_icon.png"); + final BufferedImage visibleImg = ImageUtil.loadImageResource(LootTrackerPlugin.class, "visible_icon.png"); + final BufferedImage invisibleImg = ImageUtil.loadImageResource(LootTrackerPlugin.class, "invisible_icon.png"); + final BufferedImage collapseImg = ImageUtil.loadImageResource(LootTrackerPlugin.class, "collapsed.png"); + final BufferedImage expandedImg = ImageUtil.loadImageResource(LootTrackerPlugin.class, "expanded.png"); SINGLE_LOOT_VIEW = new ImageIcon(singleLootImg); SINGLE_LOOT_VIEW_FADED = new ImageIcon(ImageUtil.alphaOffset(singleLootImg, -180)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index ed085b081c..6f8c1d966d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -363,7 +363,7 @@ public class LootTrackerPlugin extends Plugin panel = new LootTrackerPanel(this, itemManager, config); spriteManager.getSpriteAsync(SpriteID.TAB_INVENTORY, 0, panel::loadHeaderIcon); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "panel_icon.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "panel_icon.png"); navButton = NavigationButton.builder() .tooltip("Loot Tracker") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index fd60d7eef2..3ac2489645 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -125,7 +125,7 @@ public class MenuEntrySwapperPlugin extends Plugin private static final Set ESSENCE_MINE_NPCS = ImmutableSet.of( "aubury", - "wizard sedridor", + "sedridor", "wizard distentor", "wizard cromperty", "brimstail" diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mining/Pickaxe.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/Pickaxe.java index edfd2826ff..c0531ac091 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mining/Pickaxe.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/Pickaxe.java @@ -73,7 +73,7 @@ import static net.runelite.api.ItemID.MITHRIL_PICKAXE; import static net.runelite.api.ItemID.RUNE_PICKAXE; import static net.runelite.api.ItemID.STEEL_PICKAXE; import static net.runelite.api.ItemID._3RD_AGE_PICKAXE; -import static net.runelite.api.ItemID.TRAILBLAZER_PICKAXE; +import static net.runelite.api.ItemID.INFERNAL_PICKAXE_OR; import net.runelite.api.Player; @Getter @@ -93,7 +93,7 @@ enum Pickaxe INFERNAL(INFERNAL_PICKAXE, MINING_INFERNAL_PICKAXE, MINING_MOTHERLODE_INFERNAL), THIRDAGE(_3RD_AGE_PICKAXE, MINING_3A_PICKAXE, MINING_MOTHERLODE_3A), CRYSTAL(CRYSTAL_PICKAXE, MINING_CRYSTAL_PICKAXE, MINING_MOTHERLODE_CRYSTAL), - TRAILBLAZER(TRAILBLAZER_PICKAXE, MINING_TRAILBLAZER_PICKAXE, MINING_TRAILBLAZER_PICKAXE_2, + TRAILBLAZER(INFERNAL_PICKAXE_OR, MINING_TRAILBLAZER_PICKAXE, MINING_TRAILBLAZER_PICKAXE_2, MINING_TRAILBLAZER_PICKAXE_3, MINING_MOTHERLODE_TRAILBLAZER); private final int itemId; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java index be6001241d..1e56b743eb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mousehighlight/MouseHighlightOverlay.java @@ -37,6 +37,7 @@ import net.runelite.api.VarClientInt; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; @@ -80,6 +81,9 @@ class MouseHighlightOverlay extends Overlay MouseHighlightOverlay(Client client, TooltipManager tooltipManager, MouseHighlightConfig config) { setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_WIDGETS); + // additionally allow tooltips above the full screen world map and welcome screen + drawAfterInterface(WidgetID.FULLSCREEN_CONTAINER_TLI); this.client = client; this.tooltipManager = tooltipManager; this.config = config; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java index 693e0517c9..8609ae66bc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java @@ -48,7 +48,7 @@ public class AlchemyRoomTimer extends Timer return image; } - image = ImageUtil.getResourceStreamFromClass(AlchemyRoomTimer.class, "/util/reset.png"); + image = ImageUtil.loadImageResource(AlchemyRoomTimer.class, "/util/reset.png"); return image; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java new file mode 100644 index 0000000000..1458855db8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2019, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.music; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("music") +public interface MusicConfig extends Config +{ + String GRANULAR_SLIDERS = "granularSliders"; + + @ConfigItem( + keyName = "muteOwnAreaSounds", + name = "Mute player area sounds", + description = "Mute area sounds caused by yourself", + position = 0 + ) + default boolean muteOwnAreaSounds() + { + return false; + } + + @ConfigItem( + keyName = "muteOtherAreaSounds", + name = "Mute other players' area sounds", + description = "Mute area sounds caused by other players", + position = 1 + ) + default boolean muteOtherAreaSounds() + { + return false; + } + + @ConfigItem( + keyName = "muteOtherAreaNPCSounds", + name = "Mute NPCs' area sounds", + description = "Mute area sounds caused by NPCs", + position = 2 + ) + default boolean muteNpcAreaSounds() + { + return false; + } + + @ConfigItem( + keyName = "muteOtherAreaEnvironmentSounds", + name = "Mute environment area sounds", + description = "Mute area sounds caused by neither NPCs nor players", + position = 3 + ) + default boolean muteEnvironmentAreaSounds() + { + return false; + } + + @ConfigItem( + keyName = "mutePrayerSounds", + name = "Mute prayer sounds", + description = "Mute prayer activation and deactivation sounds", + position = 4 + ) + default boolean mutePrayerSounds() + { + return false; + } + + @ConfigItem( + keyName = GRANULAR_SLIDERS, + name = "Granular volume sliders", + description = "Make the volume sliders allow better control of volume", + position = 5 + ) + default boolean granularSliders() + { + return true; + } + + @ConfigItem( + keyName = "musicVolume", + name = "", + description = "", + hidden = true + ) + default int getMusicVolume() + { + return 0; + } + + @ConfigItem( + keyName = "musicVolume", + name = "", + description = "", + hidden = true + ) + void setMusicVolume(int vol); + + @ConfigItem( + keyName = "soundEffectVolume", + name = "", + description = "", + hidden = true + ) + default int getSoundEffectVolume() + { + return 0; + } + + @ConfigItem( + keyName = "soundEffectVolume", + name = "", + description = "", + hidden = true + ) + void setSoundEffectVolume(int val); + + @ConfigItem( + keyName = "areaSoundEffectVolume", + name = "", + description = "", + hidden = true + ) + default int getAreaSoundEffectVolume() + { + return 0; + } + + @ConfigItem( + keyName = "areaSoundEffectVolume", + name = "", + description = "", + hidden = true + ) + void setAreaSoundEffectVolume(int vol); +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java new file mode 100644 index 0000000000..6f3421b08a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -0,0 +1,927 @@ +/* + * Copyright (c) 2019, Anthony Chen + * Copyright (c) 2019, Adam + * Copyright (c) 2020, Sean Dewar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.music; + +import com.google.common.collect.ImmutableSet; +import com.google.common.primitives.Ints; +import com.google.inject.Provides; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; +import java.util.stream.Collectors; +import javax.inject.Inject; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.ParamID; +import net.runelite.api.Player; +import net.runelite.api.Preferences; +import net.runelite.api.ScriptEvent; +import net.runelite.api.ScriptID; +import net.runelite.api.SettingID; +import net.runelite.api.SoundEffectID; +import net.runelite.api.SpriteID; +import net.runelite.api.StructComposition; +import net.runelite.api.StructID; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.AreaSoundEffectPlayed; +import net.runelite.api.events.BeforeRender; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.PostStructComposition; +import net.runelite.api.events.ScriptPreFired; +import net.runelite.api.events.SoundEffectPlayed; +import net.runelite.api.events.VarClientIntChanged; +import net.runelite.api.events.VolumeChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetType; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; +import net.runelite.client.game.chatbox.ChatboxPanelManager; +import net.runelite.client.game.chatbox.ChatboxTextInput; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.overlay.tooltip.Tooltip; +import net.runelite.client.ui.overlay.tooltip.TooltipManager; + +@Slf4j +@PluginDescriptor( + name = "Music", + description = "Adds search and filter for the music list, and additional volume control", + tags = {"sound", "volume"} +) +public class MusicPlugin extends Plugin +{ + private static final int SLIDER_HANDLE_SIZE = 16; + + private static final Set SOURCELESS_PLAYER_SOUNDS = ImmutableSet.of( + SoundEffectID.TELEPORT_VWOOP + ); + + private static final Set PRAYER_SOUNDS = ImmutableSet.of( + SoundEffectID.PRAYER_ACTIVATE_THICK_SKIN, + SoundEffectID.PRAYER_ACTIVATE_BURST_OF_STRENGTH, + SoundEffectID.PRAYER_ACTIVATE_CLARITY_OF_THOUGHT, + SoundEffectID.PRAYER_ACTIVATE_SHARP_EYE_RIGOUR, + SoundEffectID.PRAYER_ACTIVATE_MYSTIC_WILL_AUGURY, + SoundEffectID.PRAYER_ACTIVATE_ROCK_SKIN, + SoundEffectID.PRAYER_ACTIVATE_SUPERHUMAN_STRENGTH, + SoundEffectID.PRAYER_ACTIVATE_IMPROVED_REFLEXES, + SoundEffectID.PRAYER_ACTIVATE_RAPID_RESTORE_PRESERVE, + SoundEffectID.PRAYER_ACTIVATE_RAPID_HEAL, + SoundEffectID.PRAYER_ACTIVATE_PROTECT_ITEM, + SoundEffectID.PRAYER_ACTIVATE_HAWK_EYE, + SoundEffectID.PRAYER_ACTIVATE_MYSTIC_LORE, + SoundEffectID.PRAYER_ACTIVATE_STEEL_SKIN, + SoundEffectID.PRAYER_ACTIVATE_ULTIMATE_STRENGTH, + SoundEffectID.PRAYER_ACTIVATE_INCREDIBLE_REFLEXES, + SoundEffectID.PRAYER_ACTIVATE_PROTECT_FROM_MAGIC, + SoundEffectID.PRAYER_ACTIVATE_PROTECT_FROM_MISSILES, + SoundEffectID.PRAYER_ACTIVATE_PROTECT_FROM_MELEE, + SoundEffectID.PRAYER_ACTIVATE_EAGLE_EYE, + SoundEffectID.PRAYER_ACTIVATE_MYSTIC_MIGHT, + SoundEffectID.PRAYER_ACTIVATE_RETRIBUTION, + SoundEffectID.PRAYER_ACTIVATE_REDEMPTION, + SoundEffectID.PRAYER_ACTIVATE_SMITE, + SoundEffectID.PRAYER_ACTIVATE_CHIVALRY, + SoundEffectID.PRAYER_ACTIVATE_PIETY, + SoundEffectID.PRAYER_DEACTIVE_VWOOP + ); + + @Inject + private Client client; + + @Inject + private ClientThread clientThread; + + @Inject + private MusicConfig musicConfig; + + @Inject + private ChatboxPanelManager chatboxPanelManager; + + @Inject + private TooltipManager tooltipManager; + + private Channel musicChannel; + private Channel effectChannel; + private Channel areaChannel; + private Channel[] channels; + + private ChatboxTextInput searchInput; + + private Widget musicSearchButton; + private Widget musicFilterButton; + + private Collection tracks; + + private MusicState currentMusicFilter = MusicState.ALL; + + private Tooltip sliderTooltip; + private boolean shuttingDown = false; + + @Override + protected void startUp() + { + clientThread.invoke(() -> + { + this.shuttingDown = false; + + Preferences preferences = client.getPreferences(); + musicChannel = new Channel("Music", + VarPlayer.MUSIC_VOLUME, Varbits.MUTED_MUSIC_VOLUME, + musicConfig::getMusicVolume, musicConfig::setMusicVolume, + client::setMusicVolume, 255, + WidgetInfo.SETTINGS_SIDE_MUSIC_SLIDER); + effectChannel = new Channel("Sound Effects", + VarPlayer.SOUND_EFFECT_VOLUME, Varbits.MUTED_SOUND_EFFECT_VOLUME, + musicConfig::getSoundEffectVolume, musicConfig::setSoundEffectVolume, + preferences::setSoundEffectVolume, 127, + WidgetInfo.SETTINGS_SIDE_SOUND_EFFECT_SLIDER); + areaChannel = new Channel("Area Sounds", + VarPlayer.AREA_EFFECT_VOLUME, Varbits.MUTED_AREA_EFFECT_VOLUME, + musicConfig::getAreaSoundEffectVolume, musicConfig::setAreaSoundEffectVolume, + preferences::setAreaSoundEffectVolume, 127, + WidgetInfo.SETTINGS_SIDE_AREA_SOUND_SLIDER); + channels = new Channel[]{musicChannel, effectChannel, areaChannel}; + + addMusicButtons(); + updateMusicOptions(); + resetSettingsWindow(); + }); + } + + @Override + protected void shutDown() + { + Widget header = client.getWidget(WidgetInfo.MUSIC_WINDOW); + if (header != null) + { + header.deleteAllChildren(); + } + + tracks = null; + clientThread.invoke(() -> + { + shuttingDown = true; + teardownMusicOptions(); + }); + } + + @Provides + MusicConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(MusicConfig.class); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) + { + if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN) + { + // Reset music filter on logout + currentMusicFilter = MusicState.ALL; + tracks = null; + } + } + + @Subscribe + public void onWidgetLoaded(WidgetLoaded widgetLoaded) + { + if (widgetLoaded.getGroupId() == WidgetID.MUSIC_GROUP_ID) + { + tracks = null; + // Reset filter state as the widget has been reloaded. + // It is too early here to call updateFilter() + currentMusicFilter = MusicState.ALL; + addMusicButtons(); + } + + if ((widgetLoaded.getGroupId() == WidgetID.SETTINGS_GROUP_ID || widgetLoaded.getGroupId() == WidgetID.SETTINGS_SIDE_GROUP_ID) + && musicConfig.granularSliders()) + { + updateMusicOptions(); + } + } + + private void addMusicButtons() + { + Widget header = client.getWidget(WidgetInfo.MUSIC_WINDOW); + + if (header == null) + { + return; + } + + header.deleteAllChildren(); + + //Creation of the search and toggle status buttons + musicSearchButton = header.createChild(-1, WidgetType.GRAPHIC); + musicSearchButton.setSpriteId(SpriteID.GE_SEARCH); + musicSearchButton.setOriginalWidth(18); + musicSearchButton.setOriginalHeight(17); + musicSearchButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); + musicSearchButton.setOriginalX(5); + musicSearchButton.setOriginalY(32); + musicSearchButton.setHasListener(true); + musicSearchButton.setAction(1, "Open"); + musicSearchButton.setOnOpListener((JavaScriptCallback) e -> openSearch()); + musicSearchButton.setName("Search"); + musicSearchButton.revalidate(); + + musicFilterButton = header.createChild(-1, WidgetType.GRAPHIC); + musicFilterButton.setSpriteId(SpriteID.MINIMAP_ORB_PRAYER); + musicFilterButton.setOriginalWidth(15); + musicFilterButton.setOriginalHeight(15); + musicFilterButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); + musicFilterButton.setOriginalX(25); + musicFilterButton.setOriginalY(34); + musicFilterButton.setHasListener(true); + musicFilterButton.setAction(1, "Toggle"); + musicFilterButton.setOnOpListener((JavaScriptCallback) e -> toggleStatus()); + musicFilterButton.setName("All"); + musicFilterButton.revalidate(); + } + + @Subscribe + public void onVarClientIntChanged(VarClientIntChanged varClientIntChanged) + { + if (isChatboxOpen() && !isOnMusicTab()) + { + chatboxPanelManager.close(); + } + } + + @Subscribe + public void onVolumeChanged(VolumeChanged volumeChanged) + { + if (musicConfig.granularSliders()) + { + updateMusicOptions(); + } + } + + @Subscribe + public void onConfigChanged(ConfigChanged configChanged) + { + if ("music".equals(configChanged.getGroup())) + { + clientThread.invoke(() -> + { + if (MusicConfig.GRANULAR_SLIDERS.equals(configChanged.getKey())) + { + if (musicConfig.granularSliders()) + { + updateMusicOptions(); + resetSettingsWindow(); + } + else + { + teardownMusicOptions(); + } + } + else + { + updateMusicOptions(); + } + }); + } + } + + private boolean isOnMusicTab() + { + return client.getVar(VarClientInt.INVENTORY_TAB) == 13; + } + + private boolean isChatboxOpen() + { + return searchInput != null && chatboxPanelManager.getCurrentInput() == searchInput; + } + + private String getChatboxInput() + { + return isChatboxOpen() ? searchInput.getValue() : ""; + } + + private void toggleStatus() + { + MusicState[] states = MusicState.values(); + currentMusicFilter = states[(currentMusicFilter.ordinal() + 1) % states.length]; + musicFilterButton.setSpriteId(currentMusicFilter.getSpriteID()); + musicFilterButton.setName(currentMusicFilter.getName()); + updateFilter(getChatboxInput()); + client.playSoundEffect(SoundEffectID.UI_BOOP); + } + + private void openSearch() + { + updateFilter(""); + client.playSoundEffect(SoundEffectID.UI_BOOP); + musicSearchButton.setAction(1, "Close"); + musicSearchButton.setOnOpListener((JavaScriptCallback) e -> closeSearch()); + searchInput = chatboxPanelManager.openTextInput("Search music list") + .onChanged(s -> clientThread.invokeLater(() -> updateFilter(s.trim()))) + .onDone(s -> false) + .onClose(() -> + { + clientThread.invokeLater(() -> updateFilter("")); + musicSearchButton.setOnOpListener((JavaScriptCallback) e -> openSearch()); + musicSearchButton.setAction(1, "Open"); + }) + .build(); + } + + private void closeSearch() + { + updateFilter(""); + chatboxPanelManager.close(); + client.playSoundEffect(SoundEffectID.UI_BOOP); + } + + private void updateFilter(String input) + { + final Widget container = client.getWidget(WidgetInfo.MUSIC_WINDOW); + final Widget musicList = client.getWidget(WidgetInfo.MUSIC_TRACK_LIST); + + if (container == null || musicList == null) + { + return; + } + + String filter = input.toLowerCase(); + updateList(musicList, filter); + } + + private void updateList(Widget musicList, String filter) + { + if (tracks == null) + { + tracks = Arrays.stream(musicList.getDynamicChildren()) + .sorted(Comparator.comparing(Widget::getRelativeY)) + .collect(Collectors.toList()); + } + + tracks.forEach(w -> w.setHidden(true)); + + Collection relevantTracks = tracks.stream() + .filter(w -> w.getText().toLowerCase().contains(filter)) + .filter(w -> currentMusicFilter == MusicState.ALL || w.getTextColor() == currentMusicFilter.getColor()) + .collect(Collectors.toList()); + + // Original music track list has a little offset + int y = 3; + + for (Widget track : relevantTracks) + { + track.setHidden(false); + track.setOriginalY(y); + track.revalidate(); + + y += track.getHeight(); + } + + y += 3; + + int newHeight = 0; + + if (musicList.getScrollHeight() > 0) + { + newHeight = (musicList.getScrollY() * y) / musicList.getScrollHeight(); + } + + musicList.setScrollHeight(y); + musicList.revalidateScroll(); + + client.runScript( + ScriptID.UPDATE_SCROLLBAR, + WidgetInfo.MUSIC_TRACK_SCROLLBAR.getId(), + WidgetInfo.MUSIC_TRACK_LIST.getId(), + newHeight + ); + } + + @AllArgsConstructor + @Getter + private enum MusicState + { + NOT_FOUND(0xff0000, "Locked", SpriteID.MINIMAP_ORB_HITPOINTS), + FOUND(0xdc10d, "Unlocked", SpriteID.MINIMAP_ORB_HITPOINTS_POISON), + ALL(0, "All", SpriteID.MINIMAP_ORB_PRAYER); + + private final int color; + private final String name; + private final int spriteID; + } + + @RequiredArgsConstructor + private class Slider + { + @Getter + protected final Channel channel; + + protected Widget track; + protected Widget handle; + + public void update() + { + handle.setOnDragListener((JavaScriptCallback) this::drag); + handle.setOnDragCompleteListener((JavaScriptCallback) this::drag); + handle.setHasListener(true); + + track.setOnMouseRepeatListener((JavaScriptCallback) ev -> + { + int value = channel.getValue(); + int percent = (int) Math.round((value * 100.0 / channel.getMax())); + + sliderTooltip = new Tooltip(channel.getName() + ": " + percent + "%"); + }); + track.setOnClickListener((JavaScriptCallback) this::click); + track.setHasListener(true); + } + + public void shutDown() + { + if (handle != null) + { + handle.setDragParent(null); + handle.setOnDragListener((Object[]) null); + handle.setOnDragCompleteListener((Object[]) null); + } + if (track != null) + { + track.setOnMouseRepeatListener((Object[]) null); + track.setOnClickListener((Object[]) null); + } + } + + protected void drag(ScriptEvent ev) + { + moveHandle(ev.getMouseX()); + } + + protected void click(ScriptEvent ev) + { + moveHandle(ev.getMouseX() - (SLIDER_HANDLE_SIZE / 2)); + } + + protected void moveHandle(int x) + { + int level = (x * channel.max) / getWidth(); + level = Ints.constrainToRange(level, 0, channel.max); + channel.setLevel(level); + } + + protected int getWidth() + { + return track.getWidth() - SLIDER_HANDLE_SIZE; + } + } + + private class SettingsSideSlider extends Slider + { + private final WidgetInfo root; + private Widget icon; + + SettingsSideSlider(Channel channel, WidgetInfo root) + { + super(channel); + this.root = root; + } + + @Override + public void update() + { + Widget root = client.getWidget(this.root); + if (root == null) + { + return; + } + + Object[] onLoad = root.getOnLoadListener(); + if (onLoad == null || onLoad.length != 5) + { + return; + } + + this.icon = client.getWidget((Integer) onLoad[1]); + this.track = client.getWidget((Integer) onLoad[2]); + this.handle = client.getWidget((Integer) onLoad[3]); + if (this.track == null || this.handle == null) + { + return; + } + + for (Widget w : track.getChildren()) + { + if (w != null) + { + w.setAction(0, null); + } + } + + handle.setOnVarTransmitListener((Object[]) null); + handle.setDragParent(track); + handle.setSpriteId(SpriteID.SETTINGS_SLIDER_HANDLE_GREEN); + super.update(); + + int val = channel.getValue(); + handle.setOriginalX((val * getWidth()) / channel.getMax()); + handle.revalidate(); + + // emulate [proc,settings_update_icon] + boolean unmuted = val != 0; + icon.getChild(1).setHidden(unmuted); + icon.setAction(0, unmuted ? "Mute" : "Unmute"); + // Set name + no tooltip; we have our own for ops + icon.setName(channel.getName()); + icon.setOnMouseRepeatListener((Object[]) null); + icon.setOnOpListener((JavaScriptCallback) ev -> channel.toggleMute()); + } + + @Override + public void shutDown() + { + super.shutDown(); + handle.setSpriteId(SpriteID.SETTINGS_SLIDER_HANDLE_BLUE); + + this.icon.setOnOpListener((Object[]) null); + + Widget root = client.getWidget(this.root); + if (root != null) + { + client.createScriptEvent(root.getOnLoadListener()) + .setSource(root) + .run(); + } + + this.handle = this.track = this.icon = null; + } + } + + private class SettingsSlider extends Slider + { + private final int offsetX; + private final int offsetY; + private final int width; + private final Widget realTrack; + + SettingsSlider(Channel channel, Widget handle, Widget track, int width, int offsetY, int offsetX, Widget realTrack) + { + super(channel); + this.handle = handle; + this.track = track; + this.width = width; + this.offsetX = offsetX; + this.offsetY = offsetY; + this.realTrack = realTrack; + } + + @Override + public void update() + { + super.update(); + + int val = channel.getValue(); + handle.setOriginalX(offsetX + (val * getWidth()) / channel.getMax()); + handle.setOriginalY(offsetY); + handle.revalidate(); + } + + @Override + protected int getWidth() + { + return width - SLIDER_HANDLE_SIZE; + } + + @Override + protected void click(ScriptEvent ev) + { + super.click(ev); + realTrack.setOriginalX(offsetX); + realTrack.setOriginalY(offsetY); + realTrack.setOriginalWidth(this.width); + realTrack.setOriginalHeight(SLIDER_HANDLE_SIZE); + realTrack.revalidate(); + } + + @Override + @SuppressWarnings("PMD.UselessOverridingMethod") + public void shutDown() + { + // calling settings_init will do teardown for us + super.shutDown(); + } + } + + @Subscribe + private void onPostStructComposition(PostStructComposition ev) + { + if (shuttingDown) + { + return; + } + + StructComposition sc = ev.getStructComposition(); + switch (sc.getId()) + { + case StructID.SETTINGS_MUSIC_VOLUME: + case StructID.SETTINGS_EFFECT_VOLUME: + case StructID.SETTINGS_AREA_VOLUME: + if (!musicConfig.granularSliders()) + { + return; + } + + sc.setValue(ParamID.SETTING_SLIDER_STEPS, 1); + sc.setValue(ParamID.SETTING_CUSTOM_TRANSMIT, 0); + sc.setValue(ParamID.SETTING_FOREGROUND_CLICKZONE, 0); + sc.setValue(ParamID.SETTING_SLIDER_CUSTOM_ONOP, 1); + sc.setValue(ParamID.SETTING_SLIDER_CUSTOM_SETPOS, 1); + sc.setValue(ParamID.SETTING_SLIDER_IS_DRAGGABLE, 1); + sc.setValue(ParamID.SETTING_SLIDER_DEADZONE, 0); + sc.setValue(ParamID.SETTING_SLIDER_DEADZONE, 0); + break; + } + } + + @Subscribe + private void onScriptPreFired(ScriptPreFired ev) + { + if (shuttingDown) + { + return; + } + + if (ev.getScriptId() == ScriptID.SETTINGS_SLIDER_CHOOSE_ONOP) + { + if (!musicConfig.granularSliders()) + { + return; + } + + int arg = client.getIntStackSize() - 7; + int[] is = client.getIntStack(); + Channel channel; + switch (is[arg]) + { + case SettingID.MUSIC_VOLUME: + channel = musicChannel; + break; + case SettingID.EFFECT_VOLUME: + channel = effectChannel; + break; + case SettingID.AREA_VOLUME: + channel = areaChannel; + break; + default: + return; + } + + Widget track = client.getScriptActiveWidget(); + Widget handle = client.getWidget(is[arg + 1]) + .getChild(is[arg + 2]); + Widget realTrack = client.getWidget(is[arg + 6]); + SettingsSlider s = new SettingsSlider(channel, handle, track, is[arg + 3], is[arg + 4], is[arg + 5], realTrack); + s.update(); + s.getChannel().setWindowSlider(s); + } + } + + private class Channel + { + @Getter + private final String name; + private final VarPlayer var; + private final Varbits mutedVar; + private final IntSupplier getter; + private final Consumer setter; + private final IntConsumer volumeChanger; + + @Getter + private final int max; + + private final Slider sideSlider; + + @Setter + private Slider windowSlider; + + Channel(String name, + VarPlayer var, Varbits mutedVar, + IntSupplier getter, Consumer setter, + IntConsumer volumeChanger, int max, + WidgetInfo sideRoot) + { + this.name = name; + this.var = var; + this.mutedVar = mutedVar; + this.getter = getter; + this.setter = setter; + this.volumeChanger = volumeChanger; + this.max = max; + this.sideSlider = new SettingsSideSlider(this, sideRoot); + } + + private int getValueRaw() + { + int value = getter.getAsInt(); + if (value == 0) + { + // Use the vanilla value + + // the varps are known by the engine and it requires they are stored so + // 0 = max and 4 = muted + int raw = 4 - client.getVar(var); + if (raw == 0) + { + raw = -(4 - client.getVar(mutedVar)); + } + value = ((raw * max) / 4); + + // readd our 1 offset for unknown's place + value += value < 0 ? -1 : 1; + } + + return value; + } + + private int getValue() + { + int value = getValueRaw(); + + // muted with saved restore point + if (value < 0) + { + return 0; + } + + // 0 is used for unknown, so config values are 1 away from zero + return value - 1; + } + + public void toggleMute() + { + int val = -getValueRaw(); + if (val == -1) + { + // muted without a reset value + val = max / 2; + } + setter.accept(val); + } + + public void setLevel(int level) + { + setter.accept(level + 1); + update(); + } + + public void update() + { + volumeChanger.accept(getValue()); + sideSlider.update(); + if (windowSlider != null) + { + windowSlider.update(); + } + } + + public void shutDown() + { + sideSlider.shutDown(); + if (windowSlider != null) + { + windowSlider.shutDown(); + } + + int raw = 4 - client.getVar(var); + int value = ((raw * max) / 4); + volumeChanger.accept(value); + } + } + + private void updateMusicOptions() + { + for (Channel channel : channels) + { + channel.update(); + } + } + + private void teardownMusicOptions() + { + // the side panel uses this too, so it has to run before they get shut down + client.getStructCompositionCache().reset(); + + for (Channel channel : channels) + { + channel.shutDown(); + } + + resetSettingsWindow(); + } + + private void resetSettingsWindow() + { + client.getStructCompositionCache().reset(); + + Widget init = client.getWidget(WidgetInfo.SETTINGS_INIT); + if (init != null) + { + // [clientscript, settings_init] + client.createScriptEvent(init.getOnLoadListener()) + .setSource(init) + .run(); + } + } + + @Subscribe + private void onBeforeRender(BeforeRender ev) + { + if (sliderTooltip != null) + { + tooltipManager.add(sliderTooltip); + sliderTooltip = null; + } + } + + @Subscribe + public void onAreaSoundEffectPlayed(AreaSoundEffectPlayed areaSoundEffectPlayed) + { + Actor source = areaSoundEffectPlayed.getSource(); + int soundId = areaSoundEffectPlayed.getSoundId(); + if (source == client.getLocalPlayer() + && musicConfig.muteOwnAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + else if (source != client.getLocalPlayer() + && (source instanceof Player || (source == null && SOURCELESS_PLAYER_SOUNDS.contains(soundId))) + && musicConfig.muteOtherAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + else if (source instanceof NPC + && musicConfig.muteNpcAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + else if (source == null + && !SOURCELESS_PLAYER_SOUNDS.contains(soundId) + && musicConfig.muteEnvironmentAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + } + + @Subscribe + public void onSoundEffectPlayed(SoundEffectPlayed soundEffectPlayed) + { + if (musicConfig.mutePrayerSounds() + && PRAYER_SOUNDS.contains(soundEffectPlayed.getSoundId())) + { + soundEffectPlayed.consume(); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java index 0b23ac8eb2..92afc38378 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java @@ -65,7 +65,7 @@ public class NotesPlugin extends Plugin panel = injector.getInstance(NotesPanel.class); panel.init(config); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "notes_icon.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "notes_icon.png"); navButton = NavigationButton.builder() .tooltip("Notes") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java index 3fdaeb114a..441d811a97 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java @@ -48,7 +48,6 @@ import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; -import net.runelite.client.util.ColorUtil; import net.runelite.client.util.Text; public class NpcSceneOverlay extends Overlay @@ -200,7 +199,7 @@ public class NpcSceneOverlay extends Overlay graphics.setColor(color); graphics.setStroke(new BasicStroke(2)); graphics.draw(polygon); - graphics.setColor(ColorUtil.colorWithAlpha(color, color.getAlpha() / 12)); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20)); graphics.fill(polygon); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java index 79608ac725..f892560501 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java @@ -34,7 +34,7 @@ import net.runelite.client.ws.PartyMember; class PartyWorldMapPoint extends WorldMapPoint { - private static final BufferedImage ARROW = ImageUtil.getResourceStreamFromClass(PartyWorldMapPoint.class, "/util/clue_arrow.png"); + private static final BufferedImage ARROW = ImageUtil.loadImageResource(PartyWorldMapPoint.class, "/util/clue_arrow.png"); private BufferedImage partyImage; private final PartyMember member; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java index 01925a7aab..418ce28ef6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java @@ -143,7 +143,7 @@ public enum PohIcons return image; } - image = ImageUtil.getResourceStreamFromClass(getClass(), getImageResource() + ".png"); + image = ImageUtil.loadImageResource(getClass(), getImageResource() + ".png"); return image; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java index 22386a90ba..cf26835e83 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poison/PoisonPlugin.java @@ -71,9 +71,9 @@ public class PoisonPlugin extends Plugin static { - HEART_DISEASE = ImageUtil.resizeCanvas(ImageUtil.getResourceStreamFromClass(AlternateSprites.class, AlternateSprites.DISEASE_HEART), 26, 26); - HEART_POISON = ImageUtil.resizeCanvas(ImageUtil.getResourceStreamFromClass(AlternateSprites.class, AlternateSprites.POISON_HEART), 26, 26); - HEART_VENOM = ImageUtil.resizeCanvas(ImageUtil.getResourceStreamFromClass(AlternateSprites.class, AlternateSprites.VENOM_HEART), 26, 26); + HEART_DISEASE = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.DISEASE_HEART), 26, 26); + HEART_POISON = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.POISON_HEART), 26, 26); + HEART_VENOM = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.VENOM_HEART), 26, 26); } @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java index 522c1aa754..5d84ac22f3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java @@ -52,8 +52,8 @@ class PrayerBarOverlay extends Overlay private static final Color FLICK_HELP_COLOR = Color.white; private static final Dimension PRAYER_BAR_SIZE = new Dimension(30, 5); private static final int HD_PRAYER_BAR_PADDING = 1; - private static final BufferedImage HD_FRONT_BAR = ImageUtil.getResourceStreamFromClass(PrayerPlugin.class, "front.png"); - private static final BufferedImage HD_BACK_BAR = ImageUtil.getResourceStreamFromClass(PrayerPlugin.class, "back.png"); + private static final BufferedImage HD_FRONT_BAR = ImageUtil.loadImageResource(PrayerPlugin.class, "front.png"); + private static final BufferedImage HD_BACK_BAR = ImageUtil.loadImageResource(PrayerPlugin.class, "back.png"); private final Client client; private final PrayerConfig config; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java index 6dc7558df2..88dca9d214 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java @@ -125,7 +125,7 @@ public class ScreenMarkerPlugin extends Plugin pluginPanel = new ScreenMarkerPluginPanel(this); pluginPanel.rebuild(); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), ICON_FILE); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), ICON_FILE); navigationButton = NavigationButton.builder() .tooltip(PLUGIN_NAME) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java index 51567dd2dc..b5a1ddd7e8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java @@ -54,8 +54,8 @@ public class ScreenMarkerCreationPanel extends JPanel static { - CONFIRM_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "confirm_icon.png")); - CANCEL_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "cancel_icon.png")); + CONFIRM_ICON = new ImageIcon(ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "confirm_icon.png")); + CANCEL_ICON = new ImageIcon(ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "cancel_icon.png")); final BufferedImage confirmIcon = ImageUtil.bufferedImageFromImage(CONFIRM_ICON.getImage()); CONFIRM_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(confirmIcon, 0.54f)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java index 782697f396..a9ad6e61e0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java @@ -107,7 +107,7 @@ class ScreenMarkerPanel extends JPanel static { - final BufferedImage borderImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "border_color_icon.png"); + final BufferedImage borderImg = ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "border_color_icon.png"); final BufferedImage borderImgHover = ImageUtil.luminanceOffset(borderImg, -150); BORDER_COLOR_ICON = new ImageIcon(borderImg); BORDER_COLOR_HOVER_ICON = new ImageIcon(borderImgHover); @@ -115,7 +115,7 @@ class ScreenMarkerPanel extends JPanel NO_BORDER_COLOR_ICON = new ImageIcon(borderImgHover); NO_BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(borderImgHover, -100)); - final BufferedImage fillImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "fill_color_icon.png"); + final BufferedImage fillImg = ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "fill_color_icon.png"); final BufferedImage fillImgHover = ImageUtil.luminanceOffset(fillImg, -150); FILL_COLOR_ICON = new ImageIcon(fillImg); FILL_COLOR_HOVER_ICON = new ImageIcon(fillImgHover); @@ -123,7 +123,7 @@ class ScreenMarkerPanel extends JPanel NO_FILL_COLOR_ICON = new ImageIcon(fillImgHover); NO_FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(fillImgHover, -100)); - final BufferedImage opacityImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "opacity_icon.png"); + final BufferedImage opacityImg = ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "opacity_icon.png"); final BufferedImage opacityImgHover = ImageUtil.luminanceOffset(opacityImg, -150); FULL_OPACITY_ICON = new ImageIcon(opacityImg); FULL_OPACITY_HOVER_ICON = new ImageIcon(opacityImgHover); @@ -131,15 +131,15 @@ class ScreenMarkerPanel extends JPanel NO_OPACITY_ICON = new ImageIcon(opacityImgHover); NO_OPACITY_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(opacityImgHover, -100)); - final BufferedImage visibleImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "visible_icon.png"); + final BufferedImage visibleImg = ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "visible_icon.png"); VISIBLE_ICON = new ImageIcon(visibleImg); VISIBLE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(visibleImg, -100)); - final BufferedImage invisibleImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "invisible_icon.png"); + final BufferedImage invisibleImg = ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "invisible_icon.png"); INVISIBLE_ICON = new ImageIcon(invisibleImg); INVISIBLE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(invisibleImg, -100)); - final BufferedImage deleteImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "delete_icon.png"); + final BufferedImage deleteImg = ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "delete_icon.png"); DELETE_ICON = new ImageIcon(deleteImg); DELETE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(deleteImg, -100)); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java index d63a2af4d4..efa012df87 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java @@ -77,7 +77,7 @@ public class ScreenMarkerPluginPanel extends PluginPanel static { - final BufferedImage addIcon = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "add_icon.png"); + final BufferedImage addIcon = ImageUtil.loadImageResource(ScreenMarkerPlugin.class, "add_icon.png"); ADD_ICON = new ImageIcon(addIcon); ADD_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(addIcon, 0.53f)); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 7ecc64af50..b199248c39 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -186,7 +186,7 @@ public class ScreenshotPlugin extends Plugin SCREENSHOT_DIR.mkdirs(); keyManager.registerKeyListener(hotkeyListener); - final BufferedImage iconImage = ImageUtil.getResourceStreamFromClass(getClass(), "screenshot.png"); + final BufferedImage iconImage = ImageUtil.loadImageResource(getClass(), "screenshot.png"); titleBarButton = NavigationButton.builder() .tab(false) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java index 1deb71d093..8999d2ad00 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java @@ -64,7 +64,7 @@ public class SkillCalculatorPlugin extends Plugin @Override protected void startUp() throws Exception { - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "calc.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "calc.png"); final SkillCalculatorPanel uiPanel = new SkillCalculatorPanel(skillIconManager, client, spriteManager, itemManager); uiNavigationButton = NavigationButton.builder() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounter.java index eaeb0a0cda..736ae0677c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounter.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.specialcounter; +import java.awt.Color; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; @@ -34,13 +35,15 @@ import net.runelite.client.ui.overlay.infobox.Counter; class SpecialCounter extends Counter { private final SpecialWeapon weapon; + private final SpecialCounterConfig config; @Getter(AccessLevel.PACKAGE) private final Map partySpecs = new HashMap<>(); - SpecialCounter(BufferedImage image, SpecialCounterPlugin plugin, int hitValue, SpecialWeapon weapon) + SpecialCounter(BufferedImage image, SpecialCounterPlugin plugin, SpecialCounterConfig config, int hitValue, SpecialWeapon weapon) { super(image, plugin, hitValue); this.weapon = weapon; + this.config = config; } void addHits(double hit) @@ -90,4 +93,16 @@ class SpecialCounter extends Counter return weapon.getName() + " special has hit " + hitValue + " total."; } } + + @Override + public Color getTextColor() + { + int threshold = weapon.getThreshold().apply(config); + if (threshold > 0) + { + int count = getCount(); + return count >= threshold ? Color.GREEN : Color.RED; + } + return super.getTextColor(); + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterConfig.java new file mode 100644 index 0000000000..4320b59e6c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterConfig.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2020, Dylan + * Copyright (c) 2020, Jacob + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.specialcounter; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("specialcounter") +public interface SpecialCounterConfig extends Config +{ + @ConfigItem( + position = 0, + keyName = "thresholdNotification", + name = "Threshold Notifications", + description = "Sends a notification when your special attack counter exceeds the threshold" + ) + default boolean thresholdNotification() + { + return false; + } + + @ConfigItem( + position = 1, + keyName = "dragonWarhammerThreshold", + name = "Dragon Warhammer", + description = "Threshold for Dragon Warhammer (0 to disable)" + ) + default int dragonWarhammerThreshold() + { + return 0; + } + + @ConfigItem( + position = 2, + keyName = "arclightThreshold", + name = "Arclight", + description = "Threshold for Arclight (0 to disable)" + ) + default int arclightThreshold() + { + return 0; + } + + @ConfigItem( + position = 3, + keyName = "darklightThreshold", + name = "Darklight", + description = "Threshold for Darklight (0 to disable)" + ) + default int darklightThreshold() + { + return 0; + } + + @ConfigItem( + position = 4, + keyName = "bandosGodswordThreshold", + name = "Bandos Godsword", + description = "Threshold for Bandos Godsword (0 to disable)" + ) + default int bandosGodswordThreshold() + { + return 0; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java index dbe313272c..799dd098ef 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java @@ -24,6 +24,8 @@ */ package net.runelite.client.plugins.specialcounter; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Provides; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -38,13 +40,16 @@ import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.NPC; +import net.runelite.api.NpcID; import net.runelite.api.VarPlayer; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.HitsplatApplied; import net.runelite.api.events.InteractingChanged; import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.VarbitChanged; +import net.runelite.client.Notifier; import net.runelite.client.callback.ClientThread; +import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; @@ -62,6 +67,11 @@ import net.runelite.client.ws.WSClient; @Slf4j public class SpecialCounterPlugin extends Plugin { + private static final Set IGNORED_NPCS = ImmutableSet.of( + NpcID.DARK_ENERGY_CORE, NpcID.ZOMBIFIED_SPAWN, NpcID.ZOMBIFIED_SPAWN_8063, + NpcID.COMBAT_DUMMY, NpcID.UNDEAD_COMBAT_DUMMY + ); + private int currentWorld; private int specialPercentage; private Actor lastSpecTarget; @@ -89,6 +99,18 @@ public class SpecialCounterPlugin extends Plugin @Inject private ItemManager itemManager; + @Inject + private Notifier notifier; + + @Inject + private SpecialCounterConfig config; + + @Provides + SpecialCounterConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(SpecialCounterConfig.class); + } + @Override protected void startUp() { @@ -191,6 +213,11 @@ public class SpecialCounterPlugin extends Plugin NPC npc = (NPC) target; int interactingId = npc.getId(); + if (IGNORED_NPCS.contains(interactingId)) + { + return; + } + // If this is a new NPC reset the counters if (!interactedNpcIds.contains(interactingId)) { @@ -301,7 +328,7 @@ public class SpecialCounterPlugin extends Plugin if (counter == null) { - counter = new SpecialCounter(itemManager.getImage(specialWeapon.getItemID()), this, + counter = new SpecialCounter(itemManager.getImage(specialWeapon.getItemID()), this, config, hit, specialWeapon); infoBoxManager.addInfoBox(counter); specialCounter[specialWeapon.ordinal()] = counter; @@ -311,6 +338,9 @@ public class SpecialCounterPlugin extends Plugin counter.addHits(hit); } + // Display a notification if special attack thresholds are met + sendNotification(specialWeapon, counter); + // If in a party, add hit to partySpecs for the infobox tooltip Map partySpecs = counter.getPartySpecs(); if (!party.getMembers().isEmpty()) @@ -326,6 +356,15 @@ public class SpecialCounterPlugin extends Plugin } } + private void sendNotification(SpecialWeapon weapon, SpecialCounter counter) + { + int threshold = weapon.getThreshold().apply(config); + if (threshold > 0 && counter.getCount() >= threshold && config.thresholdNotification()) + { + notifier.notify(weapon.getName() + " special attack threshold reached!"); + } + } + private void removeCounters() { interactedNpcIds.clear(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java index 69d8d68193..e3cd82cfc6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialWeapon.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.specialcounter; +import java.util.function.Function; import lombok.AllArgsConstructor; import lombok.Getter; import net.runelite.api.ItemID; @@ -32,13 +33,14 @@ import net.runelite.api.ItemID; @Getter enum SpecialWeapon { - DRAGON_WARHAMMER("Dragon Warhammer", ItemID.DRAGON_WARHAMMER, false), - ARCLIGHT("Arclight", ItemID.ARCLIGHT, false), - DARKLIGHT("Darklight", ItemID.DARKLIGHT, false), - BANDOS_GODSWORD("Bandos Godsword", ItemID.BANDOS_GODSWORD, true), - BANDOS_GODSWORD_OR("Bandos Godsword", ItemID.BANDOS_GODSWORD_OR, true); + DRAGON_WARHAMMER("Dragon Warhammer", ItemID.DRAGON_WARHAMMER, false, SpecialCounterConfig::dragonWarhammerThreshold), + ARCLIGHT("Arclight", ItemID.ARCLIGHT, false, SpecialCounterConfig::arclightThreshold), + DARKLIGHT("Darklight", ItemID.DARKLIGHT, false, SpecialCounterConfig::darklightThreshold), + BANDOS_GODSWORD("Bandos Godsword", ItemID.BANDOS_GODSWORD, true, SpecialCounterConfig::bandosGodswordThreshold), + BANDOS_GODSWORD_OR("Bandos Godsword", ItemID.BANDOS_GODSWORD_OR, true, SpecialCounterConfig::bandosGodswordThreshold); private final String name; private final int itemID; private final boolean damage; + private final Function threshold; } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java index 55a9603d6a..3710944577 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/statusbars/StatusBarsOverlay.java @@ -311,9 +311,9 @@ class StatusBarsOverlay extends Overlay } heartIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_HITPOINTS_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartDisease = ImageUtil.resizeCanvas(ImageUtil.getResourceStreamFromClass(AlternateSprites.class, AlternateSprites.DISEASE_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartPoison = ImageUtil.resizeCanvas(ImageUtil.getResourceStreamFromClass(AlternateSprites.class, AlternateSprites.POISON_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); - heartVenom = ImageUtil.resizeCanvas(ImageUtil.getResourceStreamFromClass(AlternateSprites.class, AlternateSprites.VENOM_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); + heartDisease = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.DISEASE_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); + heartPoison = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.POISON_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); + heartVenom = ImageUtil.resizeCanvas(ImageUtil.loadImageResource(AlternateSprites.class, AlternateSprites.VENOM_HEART), ICON_DIMENSIONS, ICON_DIMENSIONS); energyIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_WALK_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); specialIcon = ImageUtil.resizeCanvas(Objects.requireNonNull(spriteManager.getSprite(SpriteID.MINIMAP_ORB_SPECIAL_ICON, 0)), ICON_DIMENSIONS, ICON_DIMENSIONS); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java index 4c1a5569fc..87148caef7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixOverlay.java @@ -30,6 +30,7 @@ import java.awt.Graphics2D; import java.time.Duration; import java.time.Instant; import javax.inject.Inject; +import net.runelite.api.ObjectID; import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -39,6 +40,7 @@ import net.runelite.client.ui.overlay.components.ProgressPieComponent; class TearsOfGuthixOverlay extends Overlay { private static final Color CYAN_ALPHA = new Color(Color.CYAN.getRed(), Color.CYAN.getGreen(), Color.CYAN.getBlue(), 100); + private static final Color GREEN_ALPHA = new Color(Color.GREEN.getRed(), Color.GREEN.getGreen(), Color.GREEN.getBlue(), 100); private static final Duration MAX_TIME = Duration.ofSeconds(9); private final TearsOfGuthixPlugin plugin; @@ -64,8 +66,20 @@ class TearsOfGuthixOverlay extends Overlay final ProgressPieComponent progressPie = new ProgressPieComponent(); progressPie.setDiameter(15); - progressPie.setFill(CYAN_ALPHA); - progressPie.setBorderColor(Color.CYAN); + + if (object.getId() == ObjectID.BLUE_TEARS || + object.getId() == ObjectID.BLUE_TEARS_6665) + { + progressPie.setFill(CYAN_ALPHA); + progressPie.setBorderColor(Color.CYAN); + } + else if (object.getId() == ObjectID.GREEN_TEARS || + object.getId() == ObjectID.GREEN_TEARS_6666) + { + progressPie.setFill(GREEN_ALPHA); + progressPie.setBorderColor(Color.GREEN); + } + progressPie.setPosition(position); final Duration duration = Duration.between(timer, Instant.now()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java index 6567c15e24..899182b500 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tearsofguthix/TearsOfGuthixPlugin.java @@ -92,7 +92,9 @@ public class TearsOfGuthixPlugin extends Plugin DecorativeObject object = event.getDecorativeObject(); if (object.getId() == ObjectID.BLUE_TEARS || - object.getId() == ObjectID.BLUE_TEARS_6665) + object.getId() == ObjectID.BLUE_TEARS_6665 || + object.getId() == ObjectID.GREEN_TEARS || + object.getId() == ObjectID.GREEN_TEARS_6666) { if (client.getLocalPlayer().getWorldLocation().getRegionID() == TOG_REGION) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java index a751b7f3f9..e4521feb9e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/GameTimer.java @@ -60,7 +60,7 @@ enum GameTimer OVERLOAD_RAID(ItemID.OVERLOAD_4_20996, GameTimerImageType.ITEM, "Overload", 5, ChronoUnit.MINUTES, true), PRAYER_ENHANCE(ItemID.PRAYER_ENHANCE_4, GameTimerImageType.ITEM, "Prayer enhance", 290, ChronoUnit.SECONDS, true), GOD_WARS_ALTAR(SpriteID.SKILL_PRAYER, GameTimerImageType.SPRITE, "God wars altar", 10, ChronoUnit.MINUTES), - CHARGE(SpriteID.SPELL_CHARGE, GameTimerImageType.SPRITE, "Charge", 6, ChronoUnit.MINUTES), + CHARGE(SpriteID.SPELL_CHARGE, GameTimerImageType.SPRITE, "Charge", 7, ChronoUnit.MINUTES), STAFF_OF_THE_DEAD(ItemID.STAFF_OF_THE_DEAD, GameTimerImageType.ITEM, "Staff of the Dead", 1, ChronoUnit.MINUTES), ABYSSAL_SIRE_STUN(ItemID.ABYSSAL_ORPHAN, GameTimerImageType.ITEM, "Abyssal Sire Stun", 30, ChronoUnit.SECONDS, true), HOME_TELEPORT(SpriteID.SPELL_LUMBRIDGE_HOME_TELEPORT, GameTimerImageType.SPRITE, "Home Teleport", 30, ChronoUnit.MINUTES), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java index a029d0b5d9..56776f272f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewItemPanel.java @@ -57,7 +57,7 @@ class OverviewItemPanel extends JPanel static { - ARROW_RIGHT_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "/util/arrow_right.png")); + ARROW_RIGHT_ICON = new ImageIcon(ImageUtil.loadImageResource(TimeTrackingPlugin.class, "/util/arrow_right.png")); } OverviewItemPanel(ItemManager itemManager, TimeTrackingPanel pluginPanel, Tab tab, String title) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java index e77843bcdc..0f6f3c30f1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java @@ -124,7 +124,7 @@ public class TimeTrackingPlugin extends Plugin birdHouseTracker.loadFromConfig(); farmingTracker.loadCompletionTimes(); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "watch.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "watch.png"); panel = injector.getInstance(TimeTrackingPanel.class); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java index e3ce75f631..8e8c8a3c92 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java @@ -71,14 +71,14 @@ public class ClockTabPanel extends TabContentPanel static { - BufferedImage deleteIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "delete_icon.png"); - BufferedImage lapIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "lap_icon.png"); - BufferedImage pauseIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "pause_icon.png"); - BufferedImage resetIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "reset_icon.png"); - BufferedImage startIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "start_icon.png"); - BufferedImage addIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "add_icon.png"); - BufferedImage loopIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "loop_icon.png"); - BufferedImage loopSelectedIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "loop_selected_icon.png"); + BufferedImage deleteIcon = ImageUtil.loadImageResource(TimeTrackingPlugin.class, "delete_icon.png"); + BufferedImage lapIcon = ImageUtil.loadImageResource(TimeTrackingPlugin.class, "lap_icon.png"); + BufferedImage pauseIcon = ImageUtil.loadImageResource(TimeTrackingPlugin.class, "pause_icon.png"); + BufferedImage resetIcon = ImageUtil.loadImageResource(TimeTrackingPlugin.class, "reset_icon.png"); + BufferedImage startIcon = ImageUtil.loadImageResource(TimeTrackingPlugin.class, "start_icon.png"); + BufferedImage addIcon = ImageUtil.loadImageResource(TimeTrackingPlugin.class, "add_icon.png"); + BufferedImage loopIcon = ImageUtil.loadImageResource(TimeTrackingPlugin.class, "loop_icon.png"); + BufferedImage loopSelectedIcon = ImageUtil.loadImageResource(TimeTrackingPlugin.class, "loop_selected_icon.png"); DELETE_ICON = new ImageIcon(deleteIcon); DELETE_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(deleteIcon, -80)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java index bbeab0a639..7ca46e130c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/farming/FarmingWorld.java @@ -219,7 +219,7 @@ class FarmingWorld add(new FarmingRegion("Lletya", 9265, new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.FRUIT_TREE) - )); + ), 11103); add(new FarmingRegion("Lumbridge", 12851, new FarmingPatch("", Varbits.FARMING_4771, PatchImplementation.HOPS) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java index 306e9dd346..90797e265d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/Axe.java @@ -52,7 +52,7 @@ import static net.runelite.api.ItemID.IRON_AXE; import static net.runelite.api.ItemID.MITHRIL_AXE; import static net.runelite.api.ItemID.RUNE_AXE; import static net.runelite.api.ItemID.STEEL_AXE; -import static net.runelite.api.ItemID.TRAILBLAZER_AXE; +import static net.runelite.api.ItemID.INFERNAL_AXE_OR; import static net.runelite.api.ItemID._3RD_AGE_AXE; import net.runelite.api.Player; @@ -72,7 +72,7 @@ enum Axe INFERNAL(WOODCUTTING_INFERNAL, INFERNAL_AXE), THIRDAGE(WOODCUTTING_3A_AXE, _3RD_AGE_AXE), CRYSTAL(WOODCUTTING_CRYSTAL, CRYSTAL_AXE), - TRAILBLAZER(WOODCUTTING_TRAILBLAZER, TRAILBLAZER_AXE); + TRAILBLAZER(WOODCUTTING_TRAILBLAZER, INFERNAL_AXE_OR); private final Integer animId; private final Integer itemId; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index 8f9b9060b5..b10e2a0667 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -40,7 +40,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.AccessLevel; @@ -83,6 +82,7 @@ import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.ExecutorServiceExceptionLogger; import net.runelite.client.util.HotkeyListener; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; import net.runelite.client.util.WorldUtil; import net.runelite.http.api.worlds.World; @@ -190,12 +190,7 @@ public class WorldHopperPlugin extends Plugin panel = new WorldSwitcherPanel(this); - final BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("icon.png")); - } - + BufferedImage icon = ImageUtil.loadImageResource(WorldHopperPlugin.class, "icon.png"); navButton = NavigationButton.builder() .tooltip("World Switcher") .icon(icon) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableHeader.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableHeader.java index 1004bc7016..ecaaae1fbf 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableHeader.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableHeader.java @@ -54,7 +54,7 @@ class WorldTableHeader extends JPanel static { - final BufferedImage arrowDown = ImageUtil.getResourceStreamFromClass(WorldHopperPlugin.class, "arrow_down.png"); + final BufferedImage arrowDown = ImageUtil.loadImageResource(WorldHopperPlugin.class, "arrow_down.png"); final BufferedImage arrowUp = ImageUtil.rotateImage(arrowDown, Math.PI); final BufferedImage arrowUpFaded = ImageUtil.luminanceOffset(arrowUp, -80); ARROW_UP = new ImageIcon(arrowUpFaded); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java index 6361c123c8..11f9c8b261 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldTableRow.java @@ -66,10 +66,10 @@ class WorldTableRow extends JPanel static { - FLAG_AUS = new ImageIcon(ImageUtil.getResourceStreamFromClass(WorldHopperPlugin.class, "flag_aus.png")); - FLAG_UK = new ImageIcon(ImageUtil.getResourceStreamFromClass(WorldHopperPlugin.class, "flag_uk.png")); - FLAG_US = new ImageIcon(ImageUtil.getResourceStreamFromClass(WorldHopperPlugin.class, "flag_us.png")); - FLAG_GER = new ImageIcon(ImageUtil.getResourceStreamFromClass(WorldHopperPlugin.class, "flag_ger.png")); + FLAG_AUS = new ImageIcon(ImageUtil.loadImageResource(WorldHopperPlugin.class, "flag_aus.png")); + FLAG_UK = new ImageIcon(ImageUtil.loadImageResource(WorldHopperPlugin.class, "flag_uk.png")); + FLAG_US = new ImageIcon(ImageUtil.loadImageResource(WorldHopperPlugin.class, "flag_us.png")); + FLAG_GER = new ImageIcon(ImageUtil.loadImageResource(WorldHopperPlugin.class, "flag_ger.png")); } private final JMenuItem favoriteMenuOption = new JMenuItem(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java index 21358d1e0f..b01f709250 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java @@ -40,6 +40,9 @@ enum MiningSiteLocation new Rock(3, Ore.COPPER), new Rock(1, Ore.TIN), new Rock(7, Ore.IRON), new Rock(5, Ore.SILVER), new Rock(3, Ore.COAL), new Rock(3, Ore.MITHRIL), new Rock(2, Ore.ADAMANTITE)), AL_KHARID_MINE_SOUTH(new WorldPoint(3298, 3282, 0), new Rock(2, Ore.IRON), new Rock(2, Ore.GOLD)), + ANCIENT_CAVERN_NORTH(new WorldPoint(1847, 5414, 0), new Rock(4, Ore.MITHRIL)), + ANCIENT_CAVERN_SOUTH(new WorldPoint(1826, 5392, 0), new Rock(2, Ore.MITHRIL)), + ANCIENT_CAVERN_MIDDLE(new WorldPoint(1840, 5397, 0), new Rock(8, Ore.MITHRIL)), ARANDAR(new WorldPoint(2322, 3269, 0), new Rock(8, Ore.LIMESTONE)), ARANDAR_PRIFDDINAS_MAP(new WorldPoint(3346, 6021, 0), new Rock(8, Ore.LIMESTONE)), ARCEUUS_NORTH(new WorldPoint(1763, 3860, 0), new Rock(1, Ore.DENSE_ESSENCE)), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RunecraftingAltarPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RunecraftingAltarPoint.java index 11cdad457f..d09ced3ce9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RunecraftingAltarPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/RunecraftingAltarPoint.java @@ -33,7 +33,7 @@ class RunecraftingAltarPoint extends WorldMapPoint RunecraftingAltarPoint(RunecraftingAltarLocation point) { super(point.getLocation(), WorldMapPlugin.BLANK_ICON); - setImage(ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, point.getIconPath())); + setImage(ImageUtil.loadImageResource(WorldMapPlugin.class, point.getIconPath())); setTooltip(point.getTooltip()); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java index c8c2a778cb..a1171cfbc6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java @@ -34,6 +34,6 @@ class TeleportPoint extends WorldMapPoint { super(data.getLocation(), WorldMapPlugin.BLANK_ICON); setTooltip(data.getTooltip()); - setImage(ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, data.getIconPath())); + setImage(ImageUtil.loadImageResource(WorldMapPlugin.class, data.getIconPath())); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index dc0d25a722..518edd0668 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -101,31 +101,31 @@ public class WorldMapPlugin extends Plugin BLANK_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); FAIRY_TRAVEL_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage fairyTravelIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "fairy_ring_travel.png"); + final BufferedImage fairyTravelIcon = ImageUtil.loadImageResource(WorldMapPlugin.class, "fairy_ring_travel.png"); FAIRY_TRAVEL_ICON.getGraphics().drawImage(fairyTravelIcon, 1, 1, null); NOPE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage nopeImage = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "nope_icon.png"); + final BufferedImage nopeImage = ImageUtil.loadImageResource(WorldMapPlugin.class, "nope_icon.png"); NOPE_ICON.getGraphics().drawImage(nopeImage, 1, 1, null); NOT_STARTED_ICON = new BufferedImage(questIconBufferSize, questIconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage notStartedIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "quest_not_started_icon.png"); + final BufferedImage notStartedIcon = ImageUtil.loadImageResource(WorldMapPlugin.class, "quest_not_started_icon.png"); NOT_STARTED_ICON.getGraphics().drawImage(notStartedIcon, 4, 4, null); STARTED_ICON = new BufferedImage(questIconBufferSize, questIconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage startedIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "quest_started_icon.png"); + final BufferedImage startedIcon = ImageUtil.loadImageResource(WorldMapPlugin.class, "quest_started_icon.png"); STARTED_ICON.getGraphics().drawImage(startedIcon, 4, 4, null); FINISHED_ICON = new BufferedImage(questIconBufferSize, questIconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage finishedIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "quest_completed_icon.png"); + final BufferedImage finishedIcon = ImageUtil.loadImageResource(WorldMapPlugin.class, "quest_completed_icon.png"); FINISHED_ICON.getGraphics().drawImage(finishedIcon, 4, 4, null); MINING_SITE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage miningSiteIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "mining_site_icon.png"); + final BufferedImage miningSiteIcon = ImageUtil.loadImageResource(WorldMapPlugin.class, "mining_site_icon.png"); MINING_SITE_ICON.getGraphics().drawImage(miningSiteIcon, 1, 1, null); ROOFTOP_COURSE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage rooftopCourseIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "rooftop_course_icon.png"); + final BufferedImage rooftopCourseIcon = ImageUtil.loadImageResource(WorldMapPlugin.class, "rooftop_course_icon.png"); ROOFTOP_COURSE_ICON.getGraphics().drawImage(rooftopCourseIcon, 1, 1, null); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index 9ae532a8db..4fd1f02516 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -157,7 +157,7 @@ public class XpTrackerPlugin extends Plugin { xpPanel = new XpPanel(this, xpTrackerConfig, client, skillIconManager); - final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "/skill_icons/overall.png"); + final BufferedImage icon = ImageUtil.loadImageResource(getClass(), "/skill_icons/overall.png"); navButton = NavigationButton.builder() .tooltip("XP Tracker") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zalcano/ZalcanoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/zalcano/ZalcanoPlugin.java index fdaa151b29..b529c54aef 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zalcano/ZalcanoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zalcano/ZalcanoPlugin.java @@ -265,6 +265,7 @@ public class ZalcanoPlugin extends Plugin private boolean isHealthbarActive() { - return client.getVar(VarPlayer.ZALCANO_FORM) != -1; + int npcId = client.getVar(VarPlayer.HP_HUD_NPC_ID); + return npcId == ZALCANO_WEAKENED || npcId == ZALCANO; } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index c839316c36..a33c6c4757 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -71,7 +71,6 @@ import net.runelite.api.Point; import net.runelite.api.events.GameStateChanged; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.RuneLiteProperties; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ExpandResizeType; @@ -109,7 +108,7 @@ public class ClientUI private static final String CONFIG_CLIENT_BOUNDS = "clientBounds"; private static final String CONFIG_CLIENT_MAXIMIZED = "clientMaximized"; private static final String CONFIG_CLIENT_SIDEBAR_CLOSED = "clientSidebarClosed"; - public static final BufferedImage ICON = ImageUtil.getResourceStreamFromClass(ClientUI.class, "/runelite.png"); + public static final BufferedImage ICON = ImageUtil.loadImageResource(ClientUI.class, "/openosrs.png"); @Getter private TrayIcon trayIcon; @@ -122,14 +121,16 @@ public class ClientUI private final Provider clientThreadProvider; private final EventBus eventBus; private final boolean safeMode; + private final String title; private final CardLayout cardLayout = new CardLayout(); private final Rectangle sidebarButtonPosition = new Rectangle(); private boolean withTitleBar; private BufferedImage sidebarOpenIcon; private BufferedImage sidebarClosedIcon; + @Getter - private static ContainableFrame frame; + public static ContainableFrame frame; private JPanel navContainer; private PluginPanel pluginPanel; private ClientPluginToolbar pluginToolbar; @@ -152,7 +153,9 @@ public class ClientUI ConfigManager configManager, Provider clientThreadProvider, EventBus eventBus, - @Named("safeMode") boolean safeMode) + @Named("safeMode") boolean safeMode, + @Named("runelite.title") String title + ) { this.config = config; this.keyManager = keyManager; @@ -162,6 +165,7 @@ public class ClientUI this.clientThreadProvider = clientThreadProvider; this.eventBus = eventBus; this.safeMode = safeMode; + this.title = title; } @Subscribe @@ -294,7 +298,7 @@ public class ClientUI return false; } - frame.setTitle(RuneLiteProperties.getTitle() + " - " + name); + frame.setTitle(title + " - " + name); return true; }); } @@ -321,7 +325,7 @@ public class ClientUI // Try to enable fullscreen on OSX OSXUtil.tryEnableFullscreen(frame); - frame.setTitle(RuneLiteProperties.getTitle()); + frame.setTitle(title); frame.setIconImage(ICON); frame.getLayeredPane().setCursor(Cursor.getDefaultCursor()); // Prevent substance from using a resize cursor for pointing frame.setLocationRelativeTo(frame.getOwner()); @@ -472,7 +476,7 @@ public class ClientUI // Create hide sidebar button - sidebarOpenIcon = ImageUtil.getResourceStreamFromClass(ClientUI.class, withTitleBar ? "open.png" : "open_rs.png"); + sidebarOpenIcon = ImageUtil.loadImageResource(ClientUI.class, withTitleBar ? "open.png" : "open_rs.png"); sidebarClosedIcon = ImageUtil.flipImage(sidebarOpenIcon, true, false); sidebarNavigationButton = NavigationButton @@ -507,7 +511,7 @@ public class ClientUI frame.revalidateMinimumSize(); // Create tray icon (needs to be created after frame is packed) - trayIcon = SwingUtil.createTrayIcon(ICON, RuneLiteProperties.getTitle(), frame); + trayIcon = SwingUtil.createTrayIcon(ICON, title, frame); // Move frame around (needs to be done after frame is packed) if (config.rememberScreenBounds() && !safeMode) @@ -1034,12 +1038,12 @@ public class ClientUI if (player != null && player.getName() != null) { - frame.setTitle(RuneLiteProperties.getTitle() + " - " + player.getName()); + frame.setTitle(title + " - " + player.getName()); } } else { - frame.setTitle(RuneLiteProperties.getTitle()); + frame.setTitle(title); } if (frame.isAlwaysOnTopSupported()) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java b/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java index dcf1b9fe48..23591f8dcf 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/FatalErrorDialog.java @@ -81,7 +81,7 @@ public class FatalErrorDialog extends JDialog try { - BufferedImage logo = ImageUtil.getResourceStreamFromClass(FatalErrorDialog.class, "runelite_transparent.png"); + BufferedImage logo = ImageUtil.loadImageResource(FatalErrorDialog.class, "runelite_transparent.png"); setIconImage(logo); JLabel runelite = new JLabel(); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/SplashScreen.java b/runelite-client/src/main/java/net/runelite/client/ui/SplashScreen.java index ad5e2325ed..2163e7b491 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/SplashScreen.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/SplashScreen.java @@ -96,8 +96,8 @@ public class SplashScreen extends JFrame implements ActionListener y += action.getHeight() + PAD; pane.add(progress); - progress.setForeground(ColorScheme.BRAND_ORANGE); - progress.setBackground(ColorScheme.BRAND_ORANGE.darker().darker()); + progress.setForeground(ColorScheme.BRAND_BLUE); + progress.setBackground(ColorScheme.BRAND_BLUE.darker().darker()); progress.setBorder(new EmptyBorder(0, 0, 0, 0)); progress.setBounds(0, y, WIDTH, 14); progress.setFont(font); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java b/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java index 1c13cad475..45da76e59b 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/components/FlatTextField.java @@ -67,7 +67,7 @@ public class FlatTextField extends JPanel this.textField.setBorder(null); this.textField.setOpaque(false); this.textField.setSelectedTextColor(Color.WHITE); - this.textField.setSelectionColor(ColorScheme.BRAND_ORANGE_TRANSPARENT); + this.textField.setSelectionColor(ColorScheme.BRAND_BLUE_TRANSPARENT); add(textField, BorderLayout.CENTER); @@ -175,4 +175,4 @@ public class FlatTextField extends JPanel return textField.getDocument(); } -} \ No newline at end of file +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTab.java b/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTab.java index 9ba4fe0463..acda1af185 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTab.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTab.java @@ -51,7 +51,7 @@ import net.runelite.client.ui.ColorScheme; public class MaterialTab extends JLabel { private static final Border SELECTED_BORDER = new CompoundBorder( - BorderFactory.createMatteBorder(0, 0, 1, 0, ColorScheme.BRAND_ORANGE), + BorderFactory.createMatteBorder(0, 0, 1, 0, ColorScheme.BRAND_BLUE), BorderFactory.createEmptyBorder(5, 10, 4, 10)); private static final Border UNSELECTED_BORDER = BorderFactory @@ -165,4 +165,4 @@ public class MaterialTab extends JLabel setForeground(Color.GRAY); selected = false; } -} \ No newline at end of file +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index e1666d8b14..5c01f578c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -266,29 +266,35 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener else { final Rectangle bounds = overlay.getBounds(); - final Point location = bounds.getLocation(); final Dimension dimension = bounds.getSize(); - final Point preferredLocation = overlay.getPreferredLocation(); + Point location; // If the final position is not modified, layout it if (overlayPosition != OverlayPosition.DETACHED && (preferredLocation == null || overlay.getPreferredPosition() != null)) { final Rectangle snapCorner = snapCorners.forPosition(overlayPosition); - final Point translation = OverlayUtil.transformPosition(overlayPosition, dimension); - location.setLocation(snapCorner.getX() + translation.x, snapCorner.getY() + translation.y); - final Point padding = OverlayUtil.padPosition(overlayPosition, dimension, PADDING); - snapCorner.translate(padding.x, padding.y); + final Point translation = OverlayUtil.transformPosition(overlayPosition, dimension); // offset from corner + // Target x/y to draw the overlay + int destX = (int) snapCorner.getX() + translation.x; + int destY = (int) snapCorner.getY() + translation.y; + // Clamp the target position to ensure it is on screen or within parent bounds + location = clampOverlayLocation(destX, destY, dimension.width, dimension.height, overlay); + // Diff final position to target position in order to add it to the snap corner padding. The + // overlay effectively takes up the difference of (clamped location - target location) in + // addition to its normal dimensions. + int dX = location.x - destX; + int dY = location.y - destY; + final Point padding = OverlayUtil.padPosition(overlayPosition, dimension, PADDING); // overlay size + fixed padding + // translate corner for padding and any difference due to the position clamping + snapCorner.translate(padding.x + dX, padding.y + dY); } else { - if (preferredLocation != null) - { - location.setLocation(preferredLocation); - } + location = preferredLocation != null ? preferredLocation : bounds.getLocation(); // Clamp the overlay position to ensure it is on screen or within parent bounds - clampOverlayLocation(location, dimension.width, dimension.height, overlay); + location = clampOverlayLocation(location.x, location.y, dimension.width, dimension.height, overlay); } if (overlay.getPreferredSize() != null) @@ -605,7 +611,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener // Clamp drag to parent component final Rectangle overlayBounds = currentManagedOverlay.getBounds(); - clampOverlayLocation(overlayPosition, overlayBounds.width, overlayBounds.height, currentManagedOverlay); + overlayPosition = clampOverlayLocation(overlayPosition.x, overlayPosition.y, overlayBounds.width, overlayBounds.height, currentManagedOverlay); currentManagedOverlay.setPreferredPosition(null); currentManagedOverlay.setPreferredLocation(overlayPosition); } @@ -920,12 +926,14 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener /** * Adjust the given overlay position to be within its parent's bounds. * - * @param overlayPosition the overlay position, which is modified in place + * @param overlayX + * @param overlayY * @param overlayWidth * @param overlayHeight - * @param overlay the overlay + * @param overlay the overlay + * @return the clamped position */ - private void clampOverlayLocation(Point overlayPosition, int overlayWidth, int overlayHeight, Overlay overlay) + private Point clampOverlayLocation(int overlayX, int overlayY, int overlayWidth, int overlayHeight, Overlay overlay) { Rectangle parentBounds = overlay.getParentBounds(); if (parentBounds == null || parentBounds.isEmpty()) @@ -936,9 +944,11 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener } // Constrain overlay position to be within the parent bounds - overlayPosition.x = Ints.constrainToRange(overlayPosition.x, parentBounds.x, - Math.max(parentBounds.x, parentBounds.width - overlayWidth)); - overlayPosition.y = Ints.constrainToRange(overlayPosition.y, parentBounds.y, - Math.max(parentBounds.y, parentBounds.height - overlayHeight)); + return new Point( + Ints.constrainToRange(overlayX, parentBounds.x, + Math.max(parentBounds.x, parentBounds.width - overlayWidth)), + Ints.constrainToRange(overlayY, parentBounds.y, + Math.max(parentBounds.y, parentBounds.height - overlayHeight)) + ); } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java index e5fc071ae3..7a59965f68 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java @@ -217,8 +217,6 @@ public class OverlayUtil break; case TOP_LEFT: case TOP_CENTER: - result.y += dimension.height + (dimension.height == 0 ? 0 : padding); - break; case CANVAS_TOP_RIGHT: case TOP_RIGHT: result.y += dimension.height + (dimension.height == 0 ? 0 : padding); @@ -242,18 +240,18 @@ public class OverlayUtil case TOP_LEFT: break; case TOP_CENTER: - result.x = result.x - dimension.width / 2; + result.x = -dimension.width / 2; break; case BOTTOM_LEFT: - result.y = result.y - dimension.height; + result.y = -dimension.height; break; case BOTTOM_RIGHT: case ABOVE_CHATBOX_RIGHT: - result.y = result.y - dimension.height; + result.y = -dimension.height; // FALLTHROUGH case CANVAS_TOP_RIGHT: case TOP_RIGHT: - result.x = result.x - dimension.width; + result.x = -dimension.width; break; } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java index 002af12c34..81a1142e08 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java @@ -61,8 +61,8 @@ public class TooltipOverlay extends Overlay setPosition(OverlayPosition.TOOLTIP); setPriority(OverlayPriority.HIGHEST); setLayer(OverlayLayer.ABOVE_WIDGETS); - // additionally allow tooltips above the world map - drawAfterInterface(WidgetID.WORLD_MAP_GROUP_ID); + // additionally allow tooltips above the full screen world map and welcome screen + drawAfterInterface(WidgetID.FULLSCREEN_CONTAINER_TLI); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/util/ImageCapture.java b/runelite-client/src/main/java/net/runelite/client/util/ImageCapture.java index ab9f660781..dfee412c03 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/ImageCapture.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ImageCapture.java @@ -45,6 +45,7 @@ import java.util.EnumSet; import javax.annotation.Nullable; import javax.imageio.ImageIO; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -53,7 +54,6 @@ import net.runelite.api.GameState; import net.runelite.api.WorldType; import net.runelite.client.Notifier; import static net.runelite.client.RuneLite.SCREENSHOT_DIR; -import net.runelite.client.RuneLiteProperties; import net.runelite.http.api.RuneLiteAPI; import okhttp3.Call; import okhttp3.Callback; @@ -72,14 +72,24 @@ public class ImageCapture private static final HttpUrl IMGUR_IMAGE_UPLOAD_URL = HttpUrl.parse("https://api.imgur.com/3/image"); private static final MediaType JSON = MediaType.parse("application/json"); - @Inject - private Client client; + private final Client client; + private final Notifier notifier; + private final OkHttpClient okHttpClient; + private final String imgurClientId; @Inject - private Notifier notifier; - - @Inject - private OkHttpClient okHttpClient; + private ImageCapture( + final Client client, + final Notifier notifier, + final OkHttpClient okHttpClient, + @Named("runelite.imgur.client.id") final String imgurClientId + ) + { + this.client = client; + this.notifier = notifier; + this.okHttpClient = okHttpClient; + this.imgurClientId = imgurClientId; + } /** * Saves a screenshot of the client window to the screenshot folder as a PNG, @@ -198,7 +208,7 @@ public class ImageCapture Request request = new Request.Builder() .url(IMGUR_IMAGE_UPLOAD_URL) - .addHeader("Authorization", "Client-ID " + RuneLiteProperties.getImgurClientId()) + .addHeader("Authorization", "Client-ID " + imgurClientId) .post(RequestBody.create(JSON, json)) .build(); diff --git a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java index 66e9930ab5..3efeabcfa4 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java @@ -331,16 +331,25 @@ public class ImageUtil return outlinedImage; } + /** + * @see #loadImageResource(Class, String) + */ + @Deprecated + public static BufferedImage getResourceStreamFromClass(Class c, String path) + { + return loadImageResource(c, path); + } + /** * Reads an image resource from a given path relative to a given class. * This method is primarily shorthand for the synchronization and error handling required for - * loading image resources from classes. + * loading image resources from the classpath. * - * @param c The class to be referenced for resource path. + * @param c The class to be referenced for the package path. * @param path The path, relative to the given class. * @return A {@link BufferedImage} of the loaded image resource from the given path. */ - public static BufferedImage getResourceStreamFromClass(final Class c, final String path) + public static BufferedImage loadImageResource(final Class c, final String path) { try { @@ -359,7 +368,7 @@ public class ImageUtil } else { - filePath = c.getPackage().getName().replace(".", "/") + "/" + path; + filePath = c.getPackage().getName().replace('.', '/') + "/" + path; } log.warn("Failed to load image from class: {}, path: {}", c.getName(), filePath); diff --git a/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java b/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java index 5637180ad0..e8965029c1 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java +++ b/runelite-client/src/main/java/net/runelite/client/util/LinkBrowser.java @@ -207,55 +207,4 @@ public class LinkBrowser } }); } - - - /** - * Tries to open the specified {@code File} with the systems default text editor. If operation fails - * an error message is displayed with the option to copy the absolute file path to clipboard. - * - * @param file the File instance of the log file - * @return did the file open successfully? - */ - public static boolean openLocalFile(final File file) - { - if (file == null || !file.exists()) - { - return false; - } - - if (attemptOpenLocalFile(file)) - { - log.debug("Opened log file through Desktop#edit to {}", file); - return true; - } - - showMessageBox("Unable to open log file. Press 'OK' and the file path will be copied to your clipboard", file.getAbsolutePath()); - return false; - } - - private static boolean attemptOpenLocalFile(final File file) - { - if (!Desktop.isDesktopSupported()) - { - return false; - } - - final Desktop desktop = Desktop.getDesktop(); - - if (!desktop.isSupported(Desktop.Action.OPEN)) - { - return false; - } - - try - { - desktop.open(file); - return true; - } - catch (IOException ex) - { - log.warn("Failed to open Desktop#edit {}", file, ex); - return false; - } - } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java index 90723d9ade..5f226a40c9 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java @@ -83,11 +83,11 @@ public class SwingUtil UIManager.put("MenuItem.foreground", Color.WHITE); UIManager.put("Panel.background", ColorScheme.DARK_GRAY_COLOR); UIManager.put("ScrollBarUI", CustomScrollBarUI.class.getName()); - UIManager.put("TextField.selectionBackground", ColorScheme.BRAND_ORANGE_TRANSPARENT); + UIManager.put("TextField.selectionBackground", ColorScheme.BRAND_BLUE_TRANSPARENT); UIManager.put("TextField.selectionForeground", Color.WHITE); - UIManager.put("FormattedTextField.selectionBackground", ColorScheme.BRAND_ORANGE_TRANSPARENT); + UIManager.put("FormattedTextField.selectionBackground", ColorScheme.BRAND_BLUE_TRANSPARENT); UIManager.put("FormattedTextField.selectionForeground", Color.WHITE); - UIManager.put("TextArea.selectionBackground", ColorScheme.BRAND_ORANGE_TRANSPARENT); + UIManager.put("TextArea.selectionBackground", ColorScheme.BRAND_BLUE_TRANSPARENT); UIManager.put("TextArea.selectionForeground", Color.WHITE); // Do not render shadows under popups/tooltips. diff --git a/runelite-client/src/main/resources/herbs.json b/runelite-client/src/main/resources/herbs.json deleted file mode 100644 index e0736bab02..0000000000 --- a/runelite-client/src/main/resources/herbs.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "199": { - "cleaned": 249, - "level": 3 - }, - "201": { - "cleaned": 251, - "level": 5 - }, - "203": { - "cleaned": 253, - "level": 11 - }, - "205": { - "cleaned": 255, - "level": 20 - }, - "207": { - "cleaned": 257, - "level": 25 - }, - "3049": { - "cleaned": 2998, - "level": 30 - }, - "209": { - "cleaned": 259, - "level": 40 - }, - "211": { - "cleaned": 261, - "level": 48 - }, - "213": { - "cleaned": 263, - "level": 54 - }, - "3051": { - "cleaned": 3000, - "level": 59 - }, - "215": { - "cleaned": 265, - "level": 65 - }, - "2485": { - "level": 67 - }, - "217": { - "cleaned": 267, - "level": 70 - }, - "219": { - "cleaned": 269, - "level": 75 - } -} diff --git a/runelite-client/src/main/resources/item_variations.json b/runelite-client/src/main/resources/item_variations.json index 80dd7dd319..62877d1869 100644 --- a/runelite-client/src/main/resources/item_variations.json +++ b/runelite-client/src/main/resources/item_variations.json @@ -1623,7 +1623,7 @@ 11046, 20587 ], - "flier": [ + "flyer": [ 956, 23670 ], @@ -4838,6 +4838,10 @@ 23595, 25264 ], + "dragon axe": [ + 6739, + 25378 + ], "darklight": [ 6746, 8281 @@ -5878,6 +5882,14 @@ 8315, 8508 ], + "rug": [ + 8317, + 25362 + ], + "opulent rug": [ + 8318, + 25363 + ], "wooden bookcase": [ 8319, 24902 @@ -7470,7 +7482,8 @@ "dragon pickaxe": [ 11920, 12797, - 23677 + 23677, + 25376 ], "malediction ward": [ 11924, @@ -7936,11 +7949,15 @@ ], "infernal axe": [ 13241, - 13242 + 13242, + 25066, + 25371 ], "infernal pickaxe": [ 13243, - 13244 + 13244, + 25063, + 25369 ], "abyssal dagger": [ 13265, @@ -8530,9 +8547,15 @@ 21009, 21206 ], + "dragon harpoon": [ + 21028, + 25373 + ], "infernal harpoon": [ 21031, - 21033 + 21033, + 25059, + 25367 ], "medium storage unit": [ 21038, @@ -9510,7 +9533,7 @@ 25016, 25028 ], - "trailblazer coat": [ + "trailblazer top": [ 25004, 25019, 25031 @@ -9525,17 +9548,13 @@ 25025, 25037 ], - "trailblazer harpoon": [ - 25059, - 25114 + "trailblazer globe": [ + 25093, + 25361 ], - "trailblazer pickaxe": [ - 25063, - 25112 - ], - "trailblazer axe": [ - 25066, - 25110 + "trailblazer rug": [ + 25096, + 25364 ], "extradimensional bag": [ 25106, @@ -9599,5 +9618,22 @@ 25241, 25242, 25243 + ], + "gnome child icon": [ + 25319, + 25338 + ], + "gnome child": [ + 25320, + 25321 + ], + "soul cape": [ + 25344, + 25346 + ], + "trailblazer relic hunter armour set": [ + 25380, + 25383, + 25386 ] } \ No newline at end of file diff --git a/runelite-client/src/main/resources/item_variations.min.json b/runelite-client/src/main/resources/item_variations.min.json deleted file mode 100644 index 49482c4a2f..0000000000 --- a/runelite-client/src/main/resources/item_variations.min.json +++ /dev/null @@ -1 +0,0 @@ -{"toolkit":[1,4051],"excalibur":[35,8280],"longbow":[48,839],"shortbow":[50,841],"oak shortbow":[54,843],"oak longbow":[56,845],"willow longbow":[58,847],"willow shortbow":[60,849],"maple longbow":[62,851],"maple shortbow":[64,853,20403],"yew longbow":[66,855],"yew shortbow":[68,857,20401],"magic longbow":[70,859],"magic shortbow":[72,861,12788,20558],"lever":[83,10991,10992],"boots of lightness":[88,89],"strength potion":[113,115,117,119],"attack potion":[121,123,125,2428],"restore potion":[127,129,131,2430],"defence potion":[133,135,137,2432],"prayer potion":[139,141,143,2434,20393,20394,20395,20396],"super attack":[145,147,149,2436],"fishing potion":[151,153,155,2438],"super strength":[157,159,161,2440],"super defence":[163,165,167,2442],"ranging potion":[169,171,173,2444,23551,23553,23555,23557],"antipoison":[175,177,179,2446],"superantipoison":[181,183,185,2448],"weapon poison":[187,1465,5936,5937,5939,5940],"zamorak brew":[189,191,193,2450],"potion":[195,2394,22409],"vial of water":[227,9086],"vial":[229,2389,2390,23839,23879],"pestle and mortar":[233,23865],"unicorn horn":[237,1487],"wine of zamorak":[245,23489],"key":[275,293,298,423,1543,1544,1545,1546,1547,1548,2411,2832,2834,2836,2838,2840,3606,3608,5010,6104,7297,7299,7302,9722,11039,11040,11041,11042,11043,19761,19812],"sheep bones":[280,281,282,283],"notes":[291,20770,20771,20772,21056,21057,21058],"glarials urn":[296,297],"small fishing net":[303,6209],"raw shrimps":[317,2514],"burnt fish":[323,343,357,367,369,20854,23873],"shark":[385,6969,20390],"casket":[405,2714,2715,2717,2718,2720,2721,2724,2726,2728,2730,2732,2734,2736,2738,2740,2742,2744,2746,2748,2775,2777,2779,2781,2784,2787,2789,2791,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,3511,3517,3519,3521,3523,3527,3529,3531,3533,3535,3537,3539,3541,3543,3545,3547,3549,3551,3553,3555,3557,3559,3561,3563,3581,3583,3585,3587,3589,3591,3593,3595,3597,3600,3603,7237,7240,7242,7244,7246,7257,7259,7261,7263,7265,7267,7287,7289,7291,7293,7295,7306,7308,7310,7312,7314,7316,7318,7956,10181,10183,10185,10187,10189,10191,10193,10195,10197,10199,10201,10203,10205,10207,10209,10211,10213,10215,10217,10219,10221,10223,10225,10227,10229,10231,10233,10235,10237,10239,10241,10243,10245,10247,10249,10251,10253,10255,10257,10259,10261,10263,10265,10267,10269,10271,10273,10275,10277,10279,12022,12024,12026,12028,12030,12032,12034,12036,12038,12040,12042,12044,12046,12048,12050,12052,12054,12084,12112,12129,12131,12160,12163,12165,12171,12180,12543,12545,12547,12549,12551,12553,12555,12557,12559,12561,12563,12565,12580,12583,12586,12589,12591,19775,19777,19779,19781,19815,19827,19832,19834,19841,19843,19845,19849,19851,19861,19863,19865,19867,19869,19871,19873,19875,19877,19879,19881],"pigeon cage":[424,425],"priest gown":[426,428],"karamjan rum":[431,3164,3165],"chest key":[432,709,2404,4273],"scorpion cage":[456,457,458,459,460,461,462,463],"broken pickaxe":[468,470,472,474,476,478,11923,12594],"axe handle":[492,7952],"broken axe":[494,496,498,500,502,504,506,6741],"bones":[526,2530,3187],"monks robe":[542,20202,23306],"monks robe top":[544,20199,23303],"shade robe":[548,10634],"ghostspeak amulet":[552,4250],"fire rune":[554,6428,7554,9699,11686,11718],"water rune":[555,6424,7556,9691,11687,11716],"air rune":[556,6422,7558,9693,11688,11715],"earth rune":[557,6426,9695,11689,11717],"mind rune":[558,6436,9697,11690],"body rune":[559,6438,11691],"death rune":[560,6432,11692,11713],"nature rune":[561,11693],"chaos rune":[562,6430,7560,11694,11712],"law rune":[563,6434,11695],"cosmic rune":[564,11696],"blood rune":[565,11697,11714],"soul rune":[566,11698],"blue wizard robe":[577,7390,7392],"blue wizard hat":[579,7394,7396],"bailing bucket":[583,585],"tinderbox":[590,7156],"torch":[595,8987,9665],"bronze fire arrow":[598,942],"bone key":[605,4272],"locating crystal":[611,612,613,614,615],"coins":[617,995,6964,8890],"paramaya ticket":[619,620],"blue hat":[660,740],"panning tray":[677,678,679],"broken glass":[690,1469],"level certificate":[691,692,693],"stone tablet":[699,22991],"mixed chemicals":[705,706],"vase":[710,3734],"cup of tea":[712,1978,4242,4243,4245,4246,4838,7730,7731,7733,7734,7736,7737],"clue scroll":[713,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2716,2719,2722,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745,2747,2773,2774,2776,2778,2780,2782,2783,2785,2786,2788,2790,2792,2793,2794,2796,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829,2831,2833,2835,2837,2839,2841,2843,2845,2847,2848,2849,2851,2853,2855,2856,2857,2858,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3512,3513,3514,3515,3516,3518,3520,3522,3524,3525,3526,3528,3530,3532,3534,3536,3538,3540,3542,3544,3546,3548,3550,3552,3554,3556,3558,3560,3562,3564,3566,3568,3570,3572,3573,3574,3575,3577,3579,3580,3582,3584,3586,3588,3590,3592,3594,3596,3598,3599,3601,3602,3604,3605,3607,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,7236,7238,7239,7241,7243,7245,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7258,7260,7262,7264,7266,7268,7270,7272,7274,7276,7278,7280,7282,7284,7286,7288,7290,7292,7294,7296,7298,7300,7301,7303,7304,7305,7307,7309,7311,7313,7315,7317,10180,10182,10184,10186,10188,10190,10192,10194,10196,10198,10200,10202,10204,10206,10208,10210,10212,10214,10216,10218,10220,10222,10224,10226,10228,10230,10232,10234,10236,10238,10240,10242,10244,10246,10248,10250,10252,10254,10256,10258,10260,10262,10264,10266,10268,10270,10272,10274,10276,10278,12021,12023,12025,12027,12029,12031,12033,12035,12037,12039,12041,12043,12045,12047,12049,12051,12053,12055,12057,12059,12061,12063,12065,12067,12069,12071,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12113,12114,12115,12116,12117,12118,12119,12120,12121,12122,12123,12124,12125,12126,12127,12130,12132,12133,12134,12135,12136,12137,12138,12140,12141,12142,12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154,12155,12156,12157,12158,12159,12162,12164,12166,12167,12168,12169,12170,12172,12173,12174,12175,12176,12177,12178,12179,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190,12191,12192,12542,12544,12546,12548,12550,12552,12554,12556,12558,12560,12562,12564,12566,12568,12570,12572,12574,12576,12578,12581,12584,12587,12590,19734,19736,19738,19740,19742,19744,19746,19748,19750,19752,19754,19756,19758,19760,19762,19764,19766,19768,19770,19772,19774,19776,19778,19780,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19813,19814,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19828,19829,19830,19831,19833,19835,19840,19842,19844,19846,19848,19850,19852,19853,19854,19856,19857,19858,19860,19862,19864,19866,19868,19870,19872,19874,19876,19878,19880,19882,19884,19886,19888,19890,19892,19894,19896,19898,19900,19902,19904,19906,19908,19910,21524,21525,21526,21527,22000,22001,23045,23046,23131,23133,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23172,23174,23175,23176,23177,23178,23179,23180,23181,23182,23770,23814,23815,23816,23817,24253],"radimus notes":[714,715],"scrawled note":[717,19511],"golden bowl":[723,724,725,726],"hollow reed":[727,728],"yommi tree seeds":[735,736],"heart crystal":[744,745],"message":[755,9633,9649,22475],"book":[757,1509,6767],"falador shield":[762,13117,13118,13119,13120],"broken shield":[763,765],"coal bag":[764,12019],"gem bag":[766,12020],"phoenix crossbow":[767,11165,11167],"certificate":[769,3114],"ardougne cloak":[770,13121,13122,13123,13124],"crest part":[779,780,781],"twigs":[789,790,791,792],"bronze dart":[806,812,5628,5635],"iron dart":[807,813,5629,5636],"steel dart":[808,814,5630,5637],"mithril dart":[809,815,5632,5639],"adamant dart":[810,816,5633,5640],"rune dart":[811,817,5634,5641],"bronze javelin":[825,831,5642,5648],"iron javelin":[826,832,5643,5649],"steel javelin":[827,833,5644,5650],"mithril javelin":[828,834,5645,5651],"adamant javelin":[829,835,5646,5652],"rune javelin":[830,836,5647,5653],"iron knife":[863,871,5655,5662],"bronze knife":[864,870,5654,5661],"steel knife":[865,872,5656,5663],"mithril knife":[866,873,5657,5664],"adamant knife":[867,875,5659,5666],"rune knife":[868,876,5660,5667],"black knife":[869,874,5658,5665],"bronze bolts":[877,878,6061,6062,9375],"opal bolts":[879,9236],"pearl bolts":[880,9238],"bronze arrow":[882,883,5616,5622,11700],"iron arrow":[884,885,5617,5623,11701],"steel arrow":[886,887,5618,5624,11702],"mithril arrow":[888,889,5619,5625,7552,11703],"adamant arrow":[890,891,5620,5626,20388],"rune arrow":[892,893,5621,5627,20600],"knife":[946,5605],"rope":[954,4498,7155,11046,20587],"flier":[956,23670],"skull":[964,965],"tile":[966,5568],"rock":[968,1480,1855,4043,4487,7533,9716,21250],"papyrus":[970,972],"white apron":[1005,7957],"blue skirt":[1011,7386,7388],"black skirt":[1015,12445,12447],"bunny ears":[1037,10734],"blue partyhat":[1042,2422],"cape of legends":[1052,8284,10635],"leather boots":[1061,6893],"iron platelegs":[1067,12227,12237],"steel platelegs":[1069,20172,20187],"mithril platelegs":[1071,12279,12289],"adamant platelegs":[1073,2601,2609,20416],"bronze platelegs":[1075,12207,12217],"black platelegs":[1077,2585,2593],"rune platelegs":[1079,2617,2625,20422],"iron plateskirt":[1081,12229,12239],"steel plateskirt":[1083,20175,20190],"mithril plateskirt":[1085,12285,12295],"bronze plateskirt":[1087,12209,12219],"black plateskirt":[1089,3472,3473],"adamant plateskirt":[1091,3474,3475],"rune plateskirt":[1093,3476,3477],"leather chaps":[1095,23384],"studded chaps":[1097,7366,7368],"green dhide chaps":[1099,7378,7380],"iron platebody":[1115,12225,12235],"bronze platebody":[1117,12205,12215],"steel platebody":[1119,20169,20184],"mithril platebody":[1121,12277,12287],"adamant platebody":[1123,2599,2607,10697,10698,20415,23392,23395,23398,23401,23404],"black platebody":[1125,2583,2591,10690,10691,23366,23369,23372,23375,23378],"rune platebody":[1127,2615,2623,10798,10800,20421,23209,23212,23215,23218,23221],"leather body":[1129,23381],"studded body":[1133,7362,7364,10680,10681],"green dhide body":[1135,7370,7372],"adamant med helm":[1145,6895],"dragon med helm":[1149,6967],"iron helm":[1153,12231,12241],"bronze helm":[1155,12211,12221],"steel helm":[1157,20178,20193],"mithril helm":[1159,12283,12293],"adamant helm":[1161,2605,2613,10296,10298,10300,10302,10304,10709,10710,10711,10712,10713,20561],"rune helm":[1163,2619,2627,10286,10288,10290,10292,10294,10704,10705,10706,10707,10708],"black helm":[1165,2587,2595,10306,10308,10310,10312,10314,10699,10700,10701,10702,10703],"wooden shield":[1171,7676,20166],"dragon sq shield":[1187,12418],"bronze kiteshield":[1189,12213,12223],"iron kiteshield":[1191,12233,12243],"steel kiteshield":[1193,8746,8748,8750,8752,8754,8756,8758,8760,8762,8764,8766,8768,8770,8772,8774,8776,20181,20196],"black kiteshield":[1195,2589,2597],"mithril kiteshield":[1197,12281,12291],"adamant kiteshield":[1199,2603,2611,6894,22127,22129,22131,22133,22135,22137,22139,22141,22143,22145,22147,22149,22151,22153,22155,22157],"rune kiteshield":[1201,2621,2629,8714,8716,8718,8720,8722,8724,8726,8728,8730,8732,8734,8736,8738,8740,8742,8744],"iron dagger":[1203,1219,5668,5686],"bronze dagger":[1205,1221,5670,5688],"steel dagger":[1207,1223,5672,5690],"mithril dagger":[1209,1225,5674,5692],"adamant dagger":[1211,1227,5676,5694],"rune dagger":[1213,1229,5678,5696],"dragon dagger":[1215,1231,5680,5698,20407],"black dagger":[1217,1233,5682,5700],"bronze spear":[1237,1251,3170,5704,5718],"iron spear":[1239,1253,3171,5706,5720],"steel spear":[1241,1255,3172,5708,5722],"mithril spear":[1243,1257,3173,5710,5724],"adamant spear":[1245,1259,3174,5712,5726],"rune spear":[1247,1261,3175,5714,5728],"dragon spear":[1249,1263,3176,5716,5730],"iron pickaxe":[1267,11721],"mithril pickaxe":[1273,11720],"rune pickaxe":[1275,11719],"rune longsword":[1303,6897],"runeh sword":[1319,20555],"rune scimitar":[1333,20402,23330,23332,23334],"rune battleaxe":[1373,20552],"ibans staff":[1409,1410,12658],"scythe":[1419,10735],"amulet of accuracy":[1478,20584],"orb of light":[1481,1482,1483,1484,23812],"paladins badge":[1488,1489,1490],"logs":[1511,2511],"map part":[1535,1536,1537],"antidragon shield":[1540,8282,11710],"pet kitten":[1555,1556,1557,1558,1559,1560],"pet cat":[1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572],"emerald":[1605,6896],"dragonstone":[1615,6903],"gold amulet":[1673,1692],"sapphire amulet":[1675,1694],"emerald amulet":[1677,1696],"ruby amulet":[1679,1698],"diamond amulet":[1681,1700],"dragonstone amulet":[1683,1702],"karamja gloves":[1686,11136,11138,11140,13103],"amulet of glory":[1704,1706,1708,1710,1712,8283,10354,10356,10358,10360,10362,10719,11964,11966,11976,11978,20586],"holy symbol":[1718,4682],"unholy symbol":[1724,4683],"amulet of magic":[1727,10366,10738],"amulet of defence":[1729,23309],"amulet of power":[1731,20585,23354],"shears":[1735,5603],"chisel":[1755,5601],"molten glass":[1775,24260],"woad leaf":[1793,5738],"bronze wire":[1794,5602],"silver necklace":[1796,1797],"silver cup":[1798,1799],"silver bottle":[1800,1801],"silver book":[1802,1803],"silver needle":[1804,1805],"silver pot":[1806,1807,4658,4660,4662,4664,4666],"criminals thread":[1808,1809,1810],"criminals dagger":[1813,1814],"waterskin":[1823,1825,1827,1829,1831],"barrel":[1841,3216],"ugthanki kebab":[1883,1885],"cake":[1891,1893],"chocolate cake":[1897,1899],"asgarnian ale":[1905,5739,5779,5781,5783,5785,5859,5861,5863,5865,7744,8241,8520],"greenmans ale":[1909,5743,5787,5789,5791,5793,5867,5869,5871,5873,7746,8242,8522],"dragon bitter":[1911,5745,5803,5805,5807,5809,5883,5885,5887,5889,7748,8243,8524],"dwarven stout":[1913,5747,5771,5773,5775,5777,5851,5853,5855,5857],"beer":[1917,7740],"beer glass":[1919,6123,7742],"bucket":[1925,8986,9660],"bucket of water":[1929,6712,9659],"pot of flour":[1933,2516],"swamp paste":[1941,22095],"grain":[1947,5607],"easter egg":[1961,7928,7929,7930,7931,7932,7933,11027,11028,11029,11030],"cabbage":[1965,1967,22519,22520],"empty cup":[1980,7728],"jug of bad wine":[1991,1992],"unfermented wine":[1995,1996],"incomplete stew":[1997,1999],"unfinished cocktail":[2042,2044,2046,2050,2052,2056,2058,2060,2062,2066,2068,2070,2072,2076,2078,2082,2086,2088,2090],"pineapple punch":[2048,9512],"wizard blizzard":[2054,9487,9489,9508],"blurberry special":[2064,9520],"choc saturday":[2074,9518],"short green guy":[2080,9510],"fruit blast":[2084,9514],"drunk dragon":[2092,9516],"odd cocktail":[2094,2096,2098,2100],"raw beef":[2132,4287],"raw chicken":[2138,4289],"cooked chicken":[2140,4291],"cooked meat":[2142,4293],"batta tin":[2164,9522,9524],"unfinished bowl":[2179,2181,2183,2189,2193,9560,9562,9564],"chocolate bomb":[2185,9553],"tangled toads legs":[2187,9551],"worm hole":[2191,9547],"veg ball":[2195,9549],"worm crunchies":[2205,9542],"unfinished crunchy":[2207,2211,2215,9578,9580,9582,9584],"chocchip crunchies":[2209,9544],"spicy crunchies":[2213,9540],"toad crunchies":[2217,9538],"unfinished batta":[2251,2257,2261,2263,2265,2267,2269,2271,2273,2275,2279,9479,9481,9484,9486],"worm batta":[2253,9531],"toad batta":[2255,9529],"cheesetom batta":[2259,9535],"fruit batta":[2277,9527],"vegetable batta":[2281,9533],"plain pizza":[2289,2291],"meat pizza":[2293,2295],"anchovy pizza":[2297,2299],"pineapple pizza":[2301,2303],"redberry pie":[2325,2333],"meat pie":[2327,2331],"palm leaf":[2339,2340],"relic part":[2373,2374,2375],"crystal":[2380,2381,2382,2383,23802],"silverlight key":[2399,2400,2401],"silverlight":[2402,6745,8279],"diary":[2408,3395,3846],"door key":[2409,9654],"magnet":[2410,3718,5604],"guthix cape":[2413,10720],"bronze key":[2418,5585,8867,19566],"wig":[2419,2421],"vorkaths head":[2425,21907,21912],"antifire potion":[2452,2454,2456,2458],"red flowers":[2462,8938],"blue flowers":[2464,8936],"blue dhide chaps":[2493,7382,7384,20418],"red dhide chaps":[2495,12329,12333,20567],"black dhide chaps":[2497,12383,12387,20424],"blue dhide body":[2499,7374,7376,20417],"red dhide body":[2501,12327,12331,20566],"black dhide body":[2503,12381,12385,20423],"dragon chainbody":[2513,3140,12414,20428],"lamp":[2528,6796],"dead orb":[2529,17152],"iron fire arrow":[2532,2533],"steel fire arrow":[2534,2535],"mithril fire arrow":[2536,2537],"adamant fire arrow":[2538,2539],"rune fire arrow":[2540,2541],"ring of dueling":[2552,2554,2556,2558,2560,2562,2564,2566],"ring of wealth":[2572,11980,11982,11984,11986,11988,12785,20786,20787,20788,20789,20790],"ranger boots":[2577,10696],"wizard boots":[2579,10689],"robin hood hat":[2581,10796],"highwayman mask":[2631,10692],"blue beret":[2633,10693],"black beret":[2635,10694],"white beret":[2637,10695],"tan cavalier":[2639,10802],"dark cavalier":[2641,10804],"black cavalier":[2643,10806],"red headband":[2645,10768],"black headband":[2647,10770],"brown headband":[2649,10772],"pirates hat":[2651,10774],"zamorak platebody":[2653,10776],"guthix platebody":[2669,10780],"puzzle box":[2795,2798,2800,3565,3567,3569,3571,3576,3578,12161,12579,12582,12585,12588,19887,19891,19895,19897,19903,19911,20280,20281,20282,23171,23173,23417],"challenge scroll":[2842,2844,2846,2850,2852,2854,7269,7271,7273,7275,7277,7279,7281,7283,7285,12056,12058,12060,12062,12064,12066,12068,12070,12072,12128,12139,12567,12569,12571,12573,12575,12577,19735,19737,19739,19741,19743,19745,19747,19749,19751,19753,19755,19757,19759,19763,19765,19767,19769,19771,19773,19847,19855,19859,19883,19885,19889,19893,19899,19901,19905,19907,19909,23132,23134],"ogre bellows":[2871,2872,2873,2874],"cooked chompy":[2878,7228],"a stone bowl":[2888,2889],"iron key":[2945,8869],"golden feather":[2950,10175],"moonlight mead":[2955,5749,5811,5813,5815,5817,5891,5893,5895,5897,7750],"druid pouch":[2957,2958,7547],"silver sickle":[2961,2963],"journal":[2967,3845,4203,6755],"chompy bird hat":[2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995],"energy potion":[3008,3010,3012,3014],"super energy":[3016,3018,3020,3022,20548,20549,20550,20551],"super restore":[3024,3026,3028,3030,23567,23569,23571,23573],"agility potion":[3032,3034,3036,3038],"magic potion":[3040,3042,3044,3046],"lava battlestaff":[3053,21198],"mystic lava staff":[3054,21200],"mime mask":[3057,10629],"black dart":[3093,3094,5631,5638],"climbing boots":[3105,20578,23413],"stone ball":[3109,3110,3111,3112,3113],"pasty jogre bones":[3128,3129,3131,3132],"marinated j bones":[3130,3133],"prison key":[3135,6966],"cell key":[3136,3137],"cooked karambwan":[3144,3147,23533],"karambwan paste":[3152,3153,3154],"karambwanji paste":[3155,3156],"karambwan vessel":[3157,3159],"monkey bones":[3179,3180,3181,3182,3183,3185,3186],"barrel bomb":[3218,3219],"naphtha mix":[3222,3223],"symbol":[3231,3233,3235,3237],"goutweed":[3261,4182],"myre snelm":[3327,3337],"bloodntar snelm":[3329,3339],"ochre snelm":[3331,3341],"bruise blue snelm":[3333,3343],"blamish myre shell":[3345,3355],"blamish red shell":[3347,3357],"blamish ochre shell":[3349,3359],"blamish blue shell":[3351,3361],"splitbark helm":[3385,10606,20568],"unfinished potion":[3406,4840,22408],"serum":[3408,3410,3412,3414,3416,3417,3418,3419],"olive oil":[3422,3424,3426,3428],"sacred oil":[3430,3432,3434,3436],"gilded platebody":[3481,10782],"shoe":[3680,3681,3682,3683,3684,3685],"enchanted lyre":[3690,3691,6125,6126,6127,13079,23458],"branch":[3692,7773],"hunters talisman":[3696,3697],"promissory note":[3709,21870],"keg of beer":[3711,3801],"red disk":[3715,3716,3743],"full bucket":[3722,4693],"sealed vase":[3738,3739,3740],"archer helm":[3749,20572],"warrior helm":[3753,20571],"farseer helm":[3755,20573],"saradomin page":[3827,3828,3829,3830],"zamorak page":[3831,3832,3833,3834],"guthix page":[3835,3836,3837,3838],"damaged book":[3839,3841,3843,12607,12609,12611],"games necklace":[3853,3855,3857,3859,3861,3863,3865,3867],"board game piece":[3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107],"stool":[3893,5732],"wilderness sword":[3981,13108,13109,13110,13111],"western banner":[3983,13141,13142,13143,13144],"eye of gnome":[4008,4009],"mspeak amulet":[4021,4022],"ninja monkey greegree":[4024,4025],"zombie monkey greegree":[4029,4030],"monkey":[4033,7503,8942,19556],"saradomin banner":[4037,11891],"zamorak banner":[4039,11892],"hooded cloak":[4041,4042],"explosive potion":[4045,23818],"decorative sword":[4068,4503,4508,20483,24157],"decorative armour":[4069,4070,4504,4505,4509,4510,10610,11893,11894,11895,11896,11897,11898,11899,11900,11901,20485,20487,20493,20495,20497,20499,20501,20503,20505,24158,24159,24162,24163,24164,24165,24166,24167,24168],"decorative helm":[4071,4506,4511,20489,24160],"decorative shield":[4072,4507,4512,20491,24161],"yoyo":[4079,10733],"salve amulet":[4081,10588,12017,12018],"sled":[4083,4084],"dragon platelegs":[4087,4180,12415,20429],"mystic hat":[4089,4099,4109,10601,10602,10603,20562,23047],"mystic robe top":[4091,4101,4111,20425,23050],"mystic robe bottom":[4093,4103,4113,20426,23053],"mystic gloves":[4095,4105,4115,23056],"mystic boots":[4097,4107,4117,20579,23059],"crawling hand":[4133,7975,8260],"broad arrows":[4150,4160],"abyssal whip":[4151,4178,12773,12774,20405],"granite maul":[4153,12848,20557,24225,24227],"leafbladed spear":[4158,4159],"slayers staff":[4170,21255],"stick":[4179,9702],"extended brush":[4191,4192,4193],"decapitated head":[4197,4198,10842],"ring of charos":[4202,6465],"letter":[4204,4615,6121,6756,6757,7966,21774],"consecration seed":[4205,4206],"crystal bow":[4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,16888,16889,23901,23902,23903,23983,23985,24123],"crystal shield":[4224,4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,16890,16891,23991,23993,24127],"nettle tea":[4239,4240],"porcelain cup":[4244,7732,7735],"ectophial":[4251,4252],"model ship":[4253,4254],"bonemeal":[4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4852,4853,4854,4855,5615,6728,6810,11922,22116,22754,22756,22758],"map scrap":[4274,4275,4276],"bedsheet":[4284,4285],"ham shirt":[4298,11274],"teamcape":[4315,4317,4319,4321,4323,4325,4327,4329,4331,4333,4335,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355,4357,4359,4361,4363,4365,4367,4369,4371,4373,4375,4377,4379,4381,4383,4385,4387,4389,4391,4393,4395,4397,4399,4401,4403,4405,4407,4409,4411,4413,10638],"guthix rest":[4417,4419,4421,4423],"broken vane part":[4429,4431,4433],"antique lamp":[4447,6543,7498,11137,11139,11141,11185,11186,11187,11188,11189,11679,13145,13146,13147,13148,21262,21640,21641,21642,23072,23082],"herb tea mix":[4464,4466,4468,4470,4472,4474,4476,4478,4480,4482],"pole":[4494,4500],"castlewars hood":[4513,4515],"castlewars cloak":[4514,4516],"oil lamp":[4522,4524],"candle lantern":[4529,4531,4532,4534],"oil lantern":[4537,4539],"bullseye lantern":[4544,4546,4548,4550],"purple sweets":[4561,10476],"rubber chicken":[4566,10732,22666],"book page":[4569,4570,4571],"pages":[4572,4573],"schematic":[4575,4578],"schematics":[4576,4577],"cannon ball":[4579,7119],"black spear":[4580,4582,4584,5734,5736],"dragon plateskirt":[4585,12416],"dragon scimitar":[4587,20000,20406],"note":[4597,4598,21715],"oak blackjack":[4599,6408,6410],"willow blackjack":[4600,6412,6414],"ugthanki dung":[4601,4602],"snake basket":[4606,4607],"statuette":[4618,6785],"bandit":[4625,6781,6782],"blessed pot":[4659,4661,4663,4665,4667],"ancient staff":[4675,20431],"catspeak amulet":[4677,6544],"canopic jar":[4678,4679,4680,4681],"gold leaf":[4692,8784],"sapphire lantern":[4700,4701,4702],"magic stone":[4703,8788],"ahrims hood":[4708,4856,4857,4858,4859,4860],"ahrims staff":[4710,4862,4863,4864,4865,4866,23653],"ahrims robetop":[4712,4868,4869,4870,4871,4872,20598],"ahrims robeskirt":[4714,4874,4875,4876,4877,4878,20599],"dharoks helm":[4716,4880,4881,4882,4883,4884,23639],"dharoks greataxe":[4718,4886,4887,4888,4889,4890],"dharoks platebody":[4720,4892,4893,4894,4895,4896],"dharoks platelegs":[4722,4898,4899,4900,4901,4902,23633],"guthans helm":[4724,4904,4905,4906,4907,4908,23638],"guthans warspear":[4726,4910,4911,4912,4913,4914],"guthans platebody":[4728,4916,4917,4918,4919,4920],"guthans chainskirt":[4730,4922,4923,4924,4925,4926],"karils coif":[4732,4928,4929,4930,4931,4932],"karils crossbow":[4734,4934,4935,4936,4937,4938],"karils leathertop":[4736,4940,4941,4942,4943,4944,23632],"karils leatherskirt":[4738,4946,4947,4948,4949,4950],"torags helm":[4745,4952,4953,4954,4955,4956,23637],"torags hammers":[4747,4958,4959,4960,4961,4962],"torags platebody":[4749,4964,4965,4966,4967,4968],"torags platelegs":[4751,4970,4971,4972,4973,4974,23634],"veracs helm":[4753,4976,4977,4978,4979,4980,23636],"veracs flail":[4755,4982,4983,4984,4985,4986],"veracs brassard":[4757,4988,4989,4990,4991,4992],"veracs plateskirt":[4759,4994,4995,4996,4997,4998,23635],"sithik portrait":[4814,4815],"ogre artefact":[4818,21837],"relicyms balm":[4842,4844,4846,4848],"mining helmet":[5013,5014],"minecart ticket":[5020,5021,5022,5023],"woven top":[5024,5026,5028],"shirt":[5030,5032,5034],"trousers":[5036,5038,5040],"shorts":[5042,5044,5046],"skirt":[5048,5050,5052],"dwarf":[5054,7500],"dwarven battleaxe":[5056,5057,5058,5059,5060,5061],"bird nest":[5070,5071,5072,5073,5074,5075,7413,13653,22798,22800],"birds egg":[5076,5077,5078],"varrock armour":[5087,13104,13105,13106,13107],"morytania legs":[5093,13112,13113,13114,13115],"explorers ring":[5095,13125,13126,13127,13128],"potato seed":[5318,7548],"onion seed":[5319,7550],"tomato seed":[5322,7562],"watering can":[5331,5333,5334,5335,5336,5337,5338,5339,5340,6797],"oak seedling":[5358,5364],"willow seedling":[5359,5365],"maple seedling":[5360,5366],"yew seedling":[5361,5367],"magic seedling":[5362,5368],"spirit seedling":[5363,5369],"apples":[5378,5380,5382,5384,5386],"oranges":[5388,5390,5392,5394,5396],"strawberries":[5398,5400,5402,5404,5406],"bananas":[5408,5410,5412,5414,5416],"empty sack":[5418,10486,21873],"potatoes":[5420,5422,5424,5426,5428,5430,5432,5434,5436,5438],"onions":[5440,5442,5444,5446,5448,5450,5452,5454,5456,5458],"cabbages":[5460,5462,5464,5466,5468,5470,5472,5474,5476,5478],"apple seedling":[5480,5488],"banana seedling":[5481,5489],"orange seedling":[5482,5490],"curry seedling":[5483,5491],"pineapple seedling":[5484,5492],"papaya seedling":[5485,5493],"palm seedling":[5486,5494],"calquat seedling":[5487,5495],"medium pouch":[5510,5511],"large pouch":[5512,5513,6819],"giant pouch":[5514,5515],"scrying orb":[5518,5519],"rogue mask":[5554,10612],"gear":[5562,5563,5564,5565,5566,5567],"tiles":[5569,5570,5571],"desert amulet":[5573,13133,13134,13135,13136],"initiate hauberk":[5575,10619],"metal spade":[5586,5587],"mixture":[5589,5590,5591],"tin":[5592,5593,5594,5595,5596,5597,5598,5599,5600],"hourglass":[5610,12841],"poison dagger":[5684,5702],"axemans folly":[5751,5753,5819,5821,5823,5825,5899,5901,5903,5905],"chefs delight":[5755,5757,5827,5829,5831,5833,5907,5909,5911,5913,7754,8244,8526],"slayers respite":[5759,5761,5835,5837,5839,5841,5915,5917,5919,5921],"cider":[5763,5843,5845,5847,5849,5923,5925,5927,5929,7752],"mind bomb":[5795,5797,5799,5801,5875,5877,5879,5881],"antidote":[5942,5943,5945,5947,5949,5951,5952,5954,5956,5958],"tomatoes":[5960,5962,5964,5966,5968],"sweetcorn":[5986,7088],"marigolds":[6010,8214],"rosemary":[6014,8210],"leaves":[6020,6022,6024,6026,6028,6030],"plant cure":[6036,6468],"hay sack":[6057,6058],"spirit tree":[6063,20635],"mourner top":[6065,10621],"teleport crystal":[6099,6100,6101,6102,13102,23904],"ghostly boots":[6106,10607],"ghostly robe":[6107,6108],"square stone":[6119,6120],"rockshell helm":[6128,10613],"spined helm":[6131,10614],"skeletal helm":[6137,10604],"raw pheasant":[6178,6179,11704],"lederhosen top":[6180,10633],"princess blouse":[6186,10630],"frog mask":[6188,10721],"raw fishlike thing":[6200,6204],"fishlike thing":[6202,6206],"broodoo shield":[6215,6217,6219,6221,6223,6225,6227,6229,6231,6233,6235,6237,6239,6241,6243,6245,6247,6249,6251,6253,6255,6257,6259,6261,6263,6265,6267,6269,6271,6273,6275,6277,6279],"snake hide":[6287,7801],"spider on stick":[6293,6297],"spider on shaft":[6295,6299,6303],"snakeskin boots":[6328,20580],"tribal mask":[6335,6337,6339,10615,10616,10617],"tribal top":[6341,6351,6361,6371],"villager robe":[6343,6353,6363,6373],"villager hat":[6345,6355,6365,6375],"villager armband":[6347,6359,6369,6379],"villager sandals":[6349,6357,6367,6377],"desert top":[6384,6388],"maple blackjack":[6416,6418,6420],"kandarin headgear":[6450,13137,13138,13139,13140],"orchid seed":[6458,6459],"white tree shoot":[6461,6462,6463],"compost potion":[6470,6472,6474,6476],"agility jump":[6514,6518,11793],"agility balance":[6515,6519],"agility contortion":[6516,6520],"agility climb":[6517,6521],"toktzxilak":[6523,20554],"tzhaarketom":[6528,23235],"present":[6542,13346,13656],"lazy cat":[6549,6550,6551,6552,6553,6554],"wily cat":[6555,6556,6557,6558,6559,6560],"obsidian cape":[6568,10636,20050],"fire cape":[6570,10566,10637,20445,24223],"onyx amulet":[6579,6581],"amulet of fury":[6585,12436,23640],"white dagger":[6591,6593,6595,6597],"white platebody":[6617,10618],"hand mirror":[6639,23775],"red crystal":[6640,23776],"yellow crystal":[6641,23777],"green crystal":[6642,23778,23783],"cyan crystal":[6643,22366,23779],"blue crystal":[6644,23780],"magenta crystal":[6645,23781],"fractured crystal":[6646,6647,23784],"newly made crystal":[6651,6652],"camo top":[6654,6657,10632],"camo bottoms":[6655,6658],"camo helmet":[6656,6659],"fishing explosive":[6660,6664],"fishbowl":[6668,6669,6670,6671,6672],"guam in a box":[6677,6678],"seaweed in a box":[6679,6680],"saradomin brew":[6685,6687,6689,6691,23575,23577,23579,23581],"slayer gloves":[6708,6720],"karamthulhu":[6716,6717],"zombie head":[6722,10731,19912],"seers ring":[6731,11770,23624],"archers ring":[6733,11771],"warrior ring":[6735,11772],"berserker ring":[6737,11773,23595],"darklight":[6746,8281],"scroll":[6758,7968,9721,10485,10512],"rat pole":[6773,6774,6775,6776,6777,6778,6779],"robe of elidinis":[6786,6787],"torn robe":[6788,6789],"orb":[6821,6902],"star bauble":[6822,6823,6824,6825,6826,6827],"box bauble":[6828,6829,6830,6831,6832,6833],"diamond bauble":[6834,6835,6836,6837,6838,6839],"tree bauble":[6840,6841,6842,6843,6844,6845],"bell bauble":[6846,6847,6848,6849,6850,6851],"puppet box":[6852,6854],"bauble box":[6853,6855],"bobble hat":[6856,9815],"bobble scarf":[6857,9816],"blue marionette":[6865,6868,6875,6876,6877,6878,10730],"green marionette":[6866,6869,6879,6880,6881,6882],"red marionette":[6867,6870,6871,6872,6873,6874],"progress hat":[6885,6886,6887],"mages book":[6889,23652],"animals bones":[6904,6905,6906,6907],"beginner wand":[6908,20553],"apprentice wand":[6910,20556],"master wand":[6914,20560],"infinity top":[6916,10605,20574],"infinity bottoms":[6924,20575],"bones to peaches":[6926,8015],"magical orb":[6950,6951],"sandstone":[6971,6973,6975,6977,6985,6986],"granite":[6979,6981,6983],"stone head":[6989,6990,6991,6992,7002],"fuse":[7109,10884,10985,10986],"stripy pirate shirt":[7110,7122,7128,7134],"pirate bandana":[7112,7124,7130,7136,8949],"pirate leggings":[7116,7126,7132,7138],"canister":[7118,7149],"repair plank":[7121,7148],"dragonh sword":[7158,20559],"mud pie":[7164,7166,7170],"garden pie":[7172,7174,7178,7180],"fish pie":[7182,7184,7188,7190],"admiral pie":[7192,7194,7198],"wild pie":[7202,7204,7208,7210],"summer pie":[7212,7214,7218,7220],"red boater":[7319,10758],"orange boater":[7321,10760],"green boater":[7323,10762],"blue boater":[7325,10764],"black boater":[7327,10766],"black shield":[7332,7338,7344,7350,7356,10665,10668,10671,10674,10677],"adamant shield":[7334,7340,7346,7352,7358,10666,10669,10672,10675,10678],"rune shield":[7336,7342,7348,7354,7360,10667,10670,10673,10676,10679],"enchanted top":[7399,10688],"magic secateurs":[7409,11711],"queens secateurs":[7410,9020],"fungicide spray":[7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431],"mithril gloves":[7458,20581],"adamant gloves":[7459,20582],"rune gloves":[7460,20583],"barrows gloves":[7462,23593],"cornflour":[7463,7466],"brulee":[7473,7474,7475],"red spice":[7480,7481,7482,7483],"orange spice":[7484,7485,7486,7487],"brown spice":[7488,7489,7490,7491],"yellow spice":[7492,7493,7494,7495],"dwarven rock cake":[7509,7510],"crab meat":[7518,7519],"cooked crab meat":[7521,7523,7524,7525,7526],"diving apparatus":[7535,21723],"balloon toad":[7564,7565],"dummy":[7586,11267,11268,11269,11271],"coffin":[7587,7588,7589,7590,7591],"zombie shirt":[7592,10631],"item":[7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618],"bucket of rubble":[7622,7624,7626],"silvthrill rod":[7637,7638],"rod of ivandis":[7639,7640,7641,7642,7643,7644,7645,7646,7647,7648],"guthix balance":[7652,7654,7656,7658,7660,7662,7664,7666],"boxing gloves":[7671,7673],"pot of tea":[7692,7694,7696,7698,7704,7706,7708,7710,7716,7718,7720,7722],"teapot with leaves":[7700,7712,7724],"teapot":[7702,7714,7726],"toy soldier":[7759,7761],"toy doll":[7763,7765],"toy mouse":[7767,7769],"reward token":[7774,7775,7776,9474,10934,10935,10936,10942,10943,10944],"fishing tome":[7779,7780,7781],"agility tome":[7782,7783,7784],"thieving tome":[7785,7786,7787],"slayer tome":[7788,7789,7790],"mining tome":[7791,7792,7793],"firemaking tome":[7794,7795,7796],"woodcutting tome":[7797,7798,7799],"goblin skull":[7812,7814],"bone in vinegar":[7813,7816,7819,7822,7825,7828,7831,7834,7837,7840,7843,7846,7849,7852,7855,7858,7861,7864,7867,7870,7873,7876,7879,7882,7885,7888,7891,7894,7897,7900,7903,7906,7909,7912,7915],"bear ribs":[7815,7817],"ram skull":[7818,7820],"unicorn bone":[7821,7823],"giant rat bone":[7824,7826],"giant bat wing":[7827,7829],"wolf bone":[7830,7832],"bat wing":[7833,7835],"rat bone":[7836,7838],"baby dragon bone":[7839,7841],"ogre ribs":[7842,7844],"jogre bone":[7845,7847],"zogre bone":[7848,7850],"mogre bone":[7851,7853],"monkey paw":[7854,7856],"dagannoth ribs":[7857,7859],"snake spine":[7860,7862],"zombie bone":[7863,7865],"werewolf bone":[7866,7868],"moss giant bone":[7869,7871],"fire giant bone":[7872,7874],"ice giant ribs":[7875,7877],"terrorbird wing":[7878,7880],"ghoul bone":[7881,7883],"troll bone":[7884,7886],"seagull wing":[7887,7889],"undead cow ribs":[7890,7892],"experiment bone":[7893,7895],"rabbit bone":[7896,7898],"basilisk bone":[7899,7901],"desert lizard bone":[7902,7904],"cave goblin skull":[7905,7907],"big frog leg":[7908,7910],"vulture wing":[7911,7913],"jackal bone":[7914,7916],"easter ring":[7927,10729],"fresh monkfish":[7942,7943],"monkfish":[7946,20547],"burnt diary":[7961,7962,7963,7964,7965],"cockatrice head":[7976,8261],"basilisk head":[7977,8262],"kurask head":[7978,8263],"abyssal head":[7979,8264],"kbd heads":[7980,8265],"kq head":[7981,8266,22671],"stuffed kq head":[7988,22673],"small map":[8004,8294],"medium map":[8005,8295],"large map":[8006,8296],"wooden bed":[8031,8576],"oak bed":[8032,8578],"large oak bed":[8033,8580],"teak bed":[8034,8582],"large teak bed":[8035,8584],"shoe box":[8038,8610],"oak drawers":[8039,8612],"oak wardrobe":[8040,8614,9829],"teak drawers":[8041,8616],"teak wardrobe":[8042,8618,9831],"mahogany wardrobe":[8043,8620,9833],"gilded wardrobe":[8044,8622,9834],"shaving stand":[8045,8596],"oak shaving stand":[8046,8598],"oak dresser":[8047,8600],"teak dresser":[8048,8602],"fancy teak dresser":[8049,8604],"mahogany dresser":[8050,8606],"gilded dresser":[8051,8608],"oak clock":[8052,8590],"teak clock":[8053,8592],"gilded clock":[8054,8594],"wooden bench":[8108,8562],"oak bench":[8109,8564],"carved oak bench":[8110,8566],"teak dining bench":[8111,8568],"carved teak bench":[8112,8570],"mahogany bench":[8113,8572],"gilded bench":[8114,8574],"wood dining table":[8115,8548],"oak dining table":[8116,8550],"carved oak table":[8117,8552],"teak table":[8118,8554],"carved teak table":[8119,8556],"mahogany table":[8120,8558],"opulent table":[8121,8560],"mahogany chest":[8151,8167],"magical balance":[8156,8157,8158],"fern":[8182,8186],"thorny hedge":[8203,8437],"nice hedge":[8204,8439],"small box hedge":[8205,8441],"topiary hedge":[8206,8443],"fancy hedge":[8207,8445],"tall fancy hedge":[8208,8447],"tall box hedge":[8209,8449],"wooden shelves":[8223,8224,8225],"oak shelves":[8226,8227],"teak shelves":[8228,8229],"beer barrel":[8239,8516],"cider barrel":[8240,8518],"oak kitchen table":[8247,8530],"teak kitchen table":[8248,8532],"oak staircase":[8249,8250,8251],"teak staircase":[8252,8253,8254],"marble staircase":[8255,8256,8257],"cw armour":[8273,8274,8275],"rune case":[8276,8277,8278],"steel cage":[8299,8371],"spikes":[8302,10561],"wooden chair":[8310,8498],"rocking chair":[8311,8500],"oak chair":[8312,8502],"oak armchair":[8313,8504],"teak armchair":[8314,8506],"mahogany armchair":[8315,8508],"oak bookcase":[8320,8512],"mahogany bookcase":[8321,8514],"oak lectern":[8334,8534],"eagle lectern":[8335,8536],"demon lectern":[8336,8538],"teak eagle lectern":[8337,8540],"teak demon lectern":[8338,8542],"mahogany eagle":[8339,8544],"mahogany demon":[8340,8546],"globe":[8341,8630],"ornamental globe":[8342,8632],"lunar globe":[8343,8634],"celestial globe":[8344,8636],"armillary sphere":[8345,8638],"small orrery":[8346,8640],"large orrery":[8347,8642],"wooden telescope":[8348,8644],"teak telescope":[8349,8646],"mahogany telescope":[8350,8648],"crystal ball":[8351,8624],"elemental sphere":[8352,8626],"crystal of power":[8353,8628],"trapdoor":[8367,8368,8369,8372],"crafting table":[8380,8381,8382,8383],"tool store":[8384,8385,8386,8387,8388],"hall":[8401,8402,8403,8404],"bagged plant":[8431,8433,8435],"rune heraldic helm":[8464,8466,8468,8470,8472,8474,8476,8478,8480,8482,8484,8486,8488,8490,8492,8494],"banner":[8650,8652,8654,8656,8658,8660,8662,8664,8666,8668,8670,8672,8674,8676,8678,8680],"steel heraldic helm":[8682,8684,8686,8688,8690,8692,8694,8696,8698,8700,8702,8704,8706,8708,8710,8712],"void knight top":[8839,10611,20465,24177],"void knight robe":[8840,20469,24179],"void knight mace":[8841,20473,24181],"void knight gloves":[8842,20475,24182],"bronze defender":[8844,20449,24136],"iron defender":[8845,20451,24137],"steel defender":[8846,20453,24138],"black defender":[8847,20455,24139],"mithril defender":[8848,20457,24140],"adamant defender":[8849,20459,24141],"rune defender":[8850,20461,23230,24142],"zanik":[8870,8887,8888,8889,11062],"bone dagger":[8872,8874,8876,8878],"black mask":[8901,8903,8905,8907,8909,8911,8913,8915,8917,8919,8921,11774,11775,11776,11777,11778,11779,11780,11781,11782,11783,11784],"bandana eyepatch":[8924,8925,8926,8927],"rum":[8940,8941],"blue monkey":[8943,8944,8945],"red monkey":[8946,8947,8948],"brewin guide":[8989,8990],"skull sceptre":[9013,21276],"magic essence":[9019,9021,9022,9023,9024],"pharaohs sceptre":[9044,9046,9048,9050,13074,13075,13076,13077,13078],"emerald lantern":[9064,9065,20722],"moonclan hat":[9069,10608],"astral rune":[9075,11699],"kindling":[9094,20799],"lunar helm":[9096,10609],"blurite bolts":[9139,9286,9293,9300,9376],"iron bolts":[9140,9287,9294,9301,9377],"steel bolts":[9141,9288,9295,9302,9378],"mithril bolts":[9142,9289,9296,9303,9379],"adamant bolts":[9143,9290,9297,9304,9380],"runite bolts":[9144,9291,9298,9305,9381],"silver bolts":[9145,9292,9299,9306,9382],"bronze crossbow":[9174,9454],"blurite crossbow":[9176,9456],"iron crossbow":[9177,9457],"steel crossbow":[9179,9459],"adamant crossbow":[9183,9463],"rune crossbow":[9185,23601],"jade bolts":[9237,9335],"topaz bolts":[9239,9336],"sapphire bolts":[9240,9337],"emerald bolts":[9241,9338],"ruby bolts":[9242,9339],"diamond bolts":[9243,9340,23649],"dragonstone bolts":[9244,9341],"onyx bolts":[9245,9342],"mith grapple":[9418,9419],"half made batta":[9478,9480,9482,9483,9485],"half made bowl":[9558,9559,9561,9563],"mixed saturday":[9571,9572,9573],"mixed dragon":[9574,9575,9576],"half made crunchy":[9577,9579,9581,9583],"dossier":[9589,9590],"castle sketch":[9646,9647,9648],"tome of experience":[9656,9657,9658,22415],"useless key":[9662,16684],"proselyte sallet":[9672,20563],"proselyte hauberk":[9674,10620,20564],"proselyte cuisse":[9676,20565],"page":[9684,9685,9686],"fragment":[9687,9688,9689],"pipe":[9723,10871],"combat potion":[9739,9741,9743,9745],"attack cape":[9747,9748,10639],"strength cape":[9750,9751,10640],"defence cape":[9753,9754,10641],"ranging cape":[9756,9757,10642],"prayer cape":[9759,9760,10643],"magic cape":[9762,9763,10644],"runecraft cape":[9765,9766,10645],"hitpoints cape":[9768,9769,10647],"agility cape":[9771,9772,10648,13340,13341],"herblore cape":[9774,9775,10649],"thieving cape":[9777,9778,10650],"crafting cape":[9780,9781,10651],"fletching cape":[9783,9784,10652],"slayer cape":[9786,9787,10653],"construct cape":[9789,9790,10654],"mining cape":[9792,9793,10655],"smithing cape":[9795,9796,10656],"fishing cape":[9798,9799,10657],"cooking cape":[9801,9802,10658],"firemaking cape":[9804,9805,10659],"woodcutting cape":[9807,10660],"farming cape":[9810,9811,10661],"quest point cape":[9813,10662,13068],"oak cape rack":[9817,9843],"teak cape rack":[9818,9844],"mahogany cape rack":[9819,9845],"gilded cape rack":[9820,9846],"marble cape rack":[9821,9847],"oak armour case":[9826,9859],"teak armour case":[9827,9860],"mahogany armour case":[9828,9861],"oak toy box":[9836,9849],"teak toy box":[9837,9850],"mahogany toy box":[9838,9851],"oak treasure chest":[9839,9862],"teak treasure chest":[9840,9863],"ghost buster":[9906,9907,9908,9909,9910,9911,9912],"jack lantern mask":[9920,10723],"skeleton boots":[9921,10724],"skeleton gloves":[9922,10725],"skeleton leggings":[9923,10726],"skeleton shirt":[9924,10727],"skeleton mask":[9925,10728],"bomber jacket":[9944,11135],"hunter cape":[9948,9949,10646],"kebbit":[9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964],"butterfly":[9970,9971,9972,9973],"chinchompa":[9976,10033],"red chinchompa":[9977,10034],"hunter potion":[9998,10000,10002,10004],"falconers glove":[10023,10024],"impinabox":[10027,10028],"kyatt top":[10037,10622],"larupia top":[10043,10623],"graahk top":[10049,10624],"wood camo top":[10053,10625],"jungle camo top":[10057,10626],"desert camo top":[10061,10627],"polar camo top":[10065,10628],"spotted cape":[10069,10073,10663],"spottier cape":[10071,10074,10664],"bobs red shirt":[10316,10714],"bobs blue shirt":[10318,10715],"bobs green shirt":[10320,10716],"bobs black shirt":[10322,10717],"bobs purple shirt":[10324,10718],"3rd age robe top":[10338,20576],"3rd age robe":[10340,20577],"strength amulet":[10364,10736],"zamorak dhide":[10370,10790],"saradomin dhide":[10386,10792],"a powdered wig":[10392,10740],"flared trousers":[10394,10742],"pantaloons":[10396,10744],"sleeping cap":[10398,10746],"black elegant shirt":[10400,10748],"red elegant shirt":[10404,10750],"blue elegant shirt":[10408,10752],"green elegant shirt":[10412,10754],"purple elegant shirt":[10416,10756],"saradomin robe top":[10458,10784],"zamorak robe top":[10460,10786],"guthix robe top":[10462,10788],"avas accumulator":[10499,23609],"reindeer hat":[10507,10722],"fremennik sea boots":[10510,13129,13130,13131,13132],"attacker horn":[10516,10517,10518,10519,10520],"collection bag":[10521,10522,10523,10524,10525],"healer horn":[10526,10527,10528,10529,10530],"healing vial":[10542,10543,10544,10545,10546],"healer hat":[10547,20511,24172],"fighter hat":[10548,20507,24173],"ranger hat":[10550,20509,24174],"fighter torso":[10551,20513,24175],"penance gloves":[10553,10554],"penance skirt":[10555,20515,24176],"attacker icon":[10556,22346,22347,22348,22349,22721,22722,22723,22729,22730,23460,23461,23462,23463,23464,23465],"collector icon":[10557,22312,22313,22314,22315,22337,22338,22339,22724,23471,23472,23473,23474,23475,23476,23477],"defender icon":[10558,22340,22341,22342,22343,22344,22345,22725,22726,22727,22728,23466,23467,23468,23469,23470],"healer icon":[10559,10567,20802,22308,22309,22310,22311,23478,23479,23480,23481,23482,23483,23484,23485,23486],"keris":[10581,10582,10583,10584],"parchment":[10585,11036],"clockwork suit":[10595,10596],"mission report":[10597,10598,10599],"dhide body":[10682,10683,10684,10685],"wizard robe":[10686,10687],"yakhide armour":[10822,10824],"helm of neitiznot":[10828,23591],"hard hat":[10862,10883],"keg":[10885,10898],"prayer book":[10886,10890],"barrelchest anchor":[10887,10888],"mixture step":[10909,10911,10913,10915,10917,10919,10921,10923],"sanfew serum":[10925,10927,10929,10931,23559,23561,23563,23565],"lumberjack top":[10939,10945],"skull staples":[10950,10951],"cog":[10983,10984],"meter":[10987,10988],"capacitor":[10989,10990],"powerbox":[10993,10994],"chicken head":[11015,11021],"chicken feet":[11016,11019],"chicken wings":[11017,11020],"chicken legs":[11018,11022],"rotten barrel":[11044,11045],"artefact":[11049,11051,11053,11055,11057,11059],"gold bracelet":[11068,11069],"sapphire bracelet":[11071,11072],"emerald bracelet":[11076,11078],"castle wars bracelet":[11079,11081,11083],"ruby bracelet":[11085,11087],"diamond bracelet":[11092,11094],"abyssal bracelet":[11095,11097,11099,11101,11103],"skills necklace":[11105,11107,11109,11111,11113,11968,11970],"combat bracelet":[11118,11120,11122,11124,11126,11972,11974],"berserker necklace":[11128,23240],"onyx bracelet":[11130,11132],"dream vial":[11151,11152,11153],"newspaper":[11169,11171],"half certificate":[11173,11174],"digsite pendant":[11190,11191,11192,11193,11194],"dragon arrow":[11212,11227,11228,11229,20389],"dragon fire arrow":[11217,11222],"dragon dart":[11230,11231,11233,11234],"dark bow":[11235,12765,12766,12767,12768,20408],"cavalier mask":[11277,11280],"beret mask":[11278,11282],"dragonfire shield":[11283,11284],"dragon helm":[11335,12417],"ancient page":[11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,12621,12622,12623,12624],"bronze hasta":[11367,11379,11381,11382,11384],"iron hasta":[11369,11386,11388,11389,11391],"steel hasta":[11371,11393,11395,11396,11398],"mithril hasta":[11373,11400,11402,11403,11405],"adamant hasta":[11375,11407,11409,11410,11412],"rune hasta":[11377,11414,11416,11417,11419],"fish vial":[11427,11428],"attack mix":[11429,11431],"antipoison mix":[11433,11435],"relicyms mix":[11437,11439],"strength mix":[11441,11443],"combat mix":[11445,11447],"restore mix":[11449,11451],"energy mix":[11453,11455],"defence mix":[11457,11459],"agility mix":[11461,11463],"prayer mix":[11465,11467],"superattack mix":[11469,11471],"antipoison supermix":[11473,11475],"fishing mix":[11477,11479],"super energy mix":[11481,11483],"super str mix":[11485,11487],"magic essence mix":[11489,11491],"super restore mix":[11493,11495],"super def mix":[11497,11499],"antidote mix":[11501,11503],"antifire mix":[11505,11507],"ranging mix":[11509,11511],"magic mix":[11513,11515],"hunting mix":[11517,11519],"zamorak mix":[11521,11523],"void mage helm":[11663,11674,20477,24183],"void ranger helm":[11664,11675,20479,24184],"void melee helm":[11665,11676,20481,24185],"void seal":[11666,11667,11668,11669,11670,11671,11672,11673],"beach boxing gloves":[11705,11706],"super ranging":[11722,11723,11724,11725],"super magic potion":[11726,11727,11728,11729],"overload":[11730,11731,11732,11733,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996],"absorption":[11734,11735,11736,11737],"armadyl crossbow":[11785,23611],"steam battlestaff":[11787,12795],"mystic steam staff":[11789,12796],"staff of the dead":[11791,23613],"godsword shards":[11794,11796,11800],"armadyl godsword":[11802,20368,20593,22665],"bandos godsword":[11804,20370,20782,21060],"saradomin godsword":[11806,20372],"zamorak godsword":[11808,20374],"godsword shard":[11818,11820,11822],"bandos tassets":[11834,23646],"dragon boots":[11840,22234],"knights notes":[11842,11843],"graceful hood":[11850,11851,13579,13580,13591,13592,13603,13604,13615,13616,13627,13628,13667,13668,21061,21063],"graceful cape":[11852,11853,13581,13582,13593,13594,13605,13606,13617,13618,13629,13630,13669,13670,21064,21066],"graceful top":[11854,11855,13583,13584,13595,13596,13607,13608,13619,13620,13631,13632,13671,13672,21067,21069],"graceful legs":[11856,11857,13585,13586,13597,13598,13609,13610,13621,13622,13633,13634,13673,13674,21070,21072],"graceful gloves":[11858,11859,13587,13588,13599,13600,13611,13612,13623,13624,13635,13636,13675,13676,21073,21075],"graceful boots":[11860,11861,13589,13590,13601,13602,13613,13614,13625,13626,13637,13638,13677,13678,21076,21078],"slayer helmet":[11864,11865,19639,19641,19643,19645,19647,19649,21264,21266,21888,21890,23073,23075],"slayer ring":[11866,11867,11868,11869,11870,11871,11872,11873,21268],"trident":[11905,11907,11908,22288,22290],"box of chocolate strawberries":[11912,11914],"dragon pickaxe":[11920,12797,23677],"malediction ward":[11924,12806],"odium ward":[11926,12807],"odium shard":[11928,11929,11930],"malediction shard":[11931,11932,11933],"looting bag":[11941,22586],"extended antifire":[11951,11953,11955,11957],"extended antifire mix":[11960,11962],"occult necklace":[12002,19720,23654],"soft clay pack":[12009,12010],"black wizard robe":[12449,12451],"black wizard hat":[12453,12455],"ring of the gods":[12601,13202],"tyrannical ring":[12603,12691],"treasonous ring":[12605,12692],"bandos page":[12613,12614,12615,12616],"armadyl page":[12617,12618,12619,12620],"stamina potion":[12625,12627,12629,12631,23583,23585,23587,23589],"stamina mix":[12633,12635],"saradomin halo":[12637,20537,24169],"zamorak halo":[12638,20539,24170],"guthix halo":[12639,20541,24171],"kalphite princess":[12647,12654],"pet smoke devil":[12648,22663],"junk":[12656,12657],"clan wars cape":[12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427],"super combat potion":[12695,12697,12699,12701,23543,23545,23547,23549],"menagerie":[12725,12726],"archaic emblem":[12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,23487],"rune pouch":[12791,23650],"nest box":[12792,12793,12794,13654,23062],"elysian spirit shield":[12817,19559],"spirit shield":[12829,23599],"blessed spirit shield":[12831,23642],"amulet of the damned":[12851,12853],"thanksgiving dinner":[12861,12862],"antisantas coal box":[12897,12898],"toxic trident":[12899,12900,22292,22294],"toxic staff":[12902,12904],"antivenom":[12905,12907,12909,12911,12913,12915,12917,12919],"pet snakeling":[12921,12939,12940],"toxic blowpipe":[12924,12926],"serpentine helm":[12929,12931,13196,13197,13198,13199],"dragon defender":[12954,19722,20463,23597,24143],"bronze set":[12960,12962],"bronze trimmed set":[12964,12966],"bronze goldtrimmed set":[12968,12970],"iron set":[12972,12974],"iron trimmed set":[12976,12978],"iron goldtrimmed set":[12980,12982],"steel set":[12984,12986],"black set":[12988,12990],"black trimmed set":[12992,12994],"black goldtrimmed set":[12996,12998],"mithril set":[13000,13002],"mithril trimmed set":[13004,13006],"mithril goldtrimmed set":[13008,13010],"adamant set":[13012,13014],"adamant trimmed set":[13016,13018],"adamant goldtrimmed set":[13020,13022],"rune armour set":[13024,13026],"rune trimmed set":[13028,13030],"rune goldtrimmed set":[13032,13034],"gilded armour set":[13036,13038],"saradomin armour set":[13040,13042],"zamorak armour set":[13044,13046],"guthix armour set":[13048,13050],"armadyl rune armour set":[13052,13054],"bandos rune armour set":[13056,13058],"ancient rune armour set":[13060,13062],"achievement diary cape":[13069,19476],"elite void top":[13072,20467,24178],"elite void robe":[13073,20471,24180],"crystal halberd":[13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097,13098,13099,13100,13101,16892,16893,23895,23896,23897,23987,23989,24125],"vetion jr":[13179,13180],"old school bond":[13190,13192],"music cape":[13221,13222,13224],"eternal boots":[13235,23644],"infernal axe":[13241,13242],"infernal pickaxe":[13243,13244],"abyssal dagger":[13265,13267,13269,13271],"max cape":[13280,13282,13342],"bank key":[13302,13303,13304,13305,13306],"deadmans chest":[13317,24189],"deadmans legs":[13318,24190],"deadmans cape":[13319,24191],"rock golem":[13321,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21340,21358,21359,21360],"baby chinchompa":[13323,13324,13325,13326],"fire max cape":[13329,20447,21186,24134],"vial of tears":[13347,13348,13349,13350,13351],"shayzien gloves":[13357,13362,13367,13372,13377],"shayzien boots":[13358,13363,13368,13373,13378],"shayzien helm":[13359,13364,13369,13374,13379],"shayzien greaves":[13360,13365,13370,13375,13380],"shayzien platebody":[13361,13366,13371,13376,13381],"xerics talisman":[13392,13393],"servery incomplete stew":[13415,13416],"ensouled goblin head":[13447,13448],"ensouled monkey head":[13450,13451],"ensouled imp head":[13453,13454],"ensouled minotaur head":[13456,13457],"ensouled scorpion head":[13459,13460],"ensouled bear head":[13462,13463],"ensouled unicorn head":[13465,13466],"ensouled dog head":[13468,13469],"ensouled chaos druid head":[13471,13472],"ensouled giant head":[13474,13475],"ensouled ogre head":[13477,13478],"ensouled elf head":[13480,13481],"ensouled troll head":[13483,13484],"ensouled horror head":[13486,13487],"ensouled kalphite head":[13489,13490],"ensouled dagannoth head":[13492,13493],"ensouled bloodveld head":[13495,13496],"ensouled tzhaar head":[13498,13499],"ensouled demon head":[13501,13502],"ensouled aviansie head":[13504,13505],"ensouled abyssal head":[13507,13508],"ensouled dragon head":[13510,13511],"dark manuscript":[13514,13515,13516,13517,13518,13519,13520,13521,13522,13523],"shayzien supply gloves":[13538,13543,13548,13553,13558],"shayzien supply boots":[13539,13544,13549,13554,13559],"shayzien supply helm":[13540,13545,13550,13555,13560],"shayzien supply greaves":[13541,13546,13551,13556,13561],"shayzien supply platebody":[13542,13547,13552,13557,13562],"shayzien supply set":[13565,13566,13567,13568,13569],"dragon warhammer":[13576,20785],"farmers boro trousers":[13640,13641],"farmers boots":[13644,13645],"farmers strawhat":[13646,13647,21253,21254],"clue bottle":[13648,13649,13650,13651,23129],"dragon claws":[13652,20784],"heavy ballista":[19481,23630],"dragon javelin":[19484,19486,19488,19490,23648],"zenyte bracelet":[19492,19532],"zenyte amulet":[19501,19541],"mysterious note":[19505,19507,19509],"satchel":[19527,19528],"tormented bracelet":[19544,23444],"necklace of anguish":[19547,22249],"ring of suffering":[19550,19710,20655,20657],"amulet of torture":[19553,20366],"botanical pie":[19659,19662],"clue nest":[19712,19714,19716,19718,23127],"reward casket":[19836,20543,20544,20545,20546,23245],"torn clue scroll":[19837,19838,19839],"strange device":[19939,23183],"bucket helm":[19991,20059],"gnomish firelighter":[20275,20278],"clue geode":[20358,20360,20362,20364,23442],"steel trimmed set":[20376,20379],"steel goldtrimmed set":[20382,20385],"stash units":[20532,20533,20534,20535,20536,23416],"dark altar":[20619,22778],"occult altar":[20620,20621,20622],"rift guardian":[20665,20667,20669,20671,20673,20675,20677,20679,20681,20683,20685,20687,20689,20691,21990],"rejuvenation potion":[20697,20699,20700,20701,20702],"tome of fire":[20714,20716],"manor key":[20766,21052],"ruby key":[20767,21053],"emerald key":[20768,21054],"sapphire key":[20769,21055],"killers knife":[20781,21059],"corrupted helm":[20838,23840,23841,23842],"dragon thrownaxe":[20849,21207],"elder":[20913,20914,20915,20916,20921,20922,20923,20924],"elder potion":[20917,20918,20919,20920],"twisted":[20925,20926,20927,20928,20933,20934,20935,20936],"twisted potion":[20929,20930,20931,20932],"kodai":[20937,20938,20939,20940,20945,20946,20947,20948],"kodai potion":[20941,20942,20943,20944],"revitalisation":[20949,20950,20951,20952,20957,20958,20959,20960],"revitalisation potion":[20953,20954,20955,20956,22096],"prayer enhance":[20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972],"xerics aid":[20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984],"elder maul":[21003,21205],"kodai wand":[21006,23626],"dragon sword":[21009,21206],"infernal harpoon":[21031,21033],"medium storage unit":[21038,21040],"large storage unit":[21039,21041,21042],"opal amulet":[21099,21108],"jade amulet":[21102,21111],"topaz amulet":[21105,21114],"ring of returning":[21129,21132,21134,21136,21138],"necklace of passage":[21146,21149,21151,21153,21155],"burning amulet":[21166,21169,21171,21173,21175],"mysterious orb":[21261,23069],"infernal max cape":[21284,21285,21289,24133],"infernal cape":[21287,21295,21297,23622,24224],"amethyst javelin":[21318,21320,21322,21324],"amethyst arrow":[21326,21332,21334,21336],"amethyst fire arrow":[21328,21330],"master scroll book":[21387,21389],"wilderness cape":[21428,21429,21430,21431,21432,21434,21435,21436,21437,21438],"teak seedling":[21469,21473],"mahogany seedling":[21471,21475],"fossil island wyvern":[21507,21508],"ancient wyvern shield":[21633,21634],"mushroom pie":[21687,21690],"jonas mask":[21719,21720],"granite ring":[21739,21752],"imbued saradomin max cape":[21776,24232,24238],"imbued zamorak max cape":[21780,24233,24246],"imbued guthix max cape":[21784,24234,24242],"imbued saradomin cape":[21791,23607,24236,24248],"imbued guthix cape":[21793,23603,24240,24249],"imbued zamorak cape":[21795,23605,24244,24250],"bracelet of ethereum":[21816,21817],"snow imp costume head":[21841,21847],"snow imp costume body":[21842,21849],"snow imp costume legs":[21843,21851],"snow imp costume tail":[21844,21853],"snow imp costume gloves":[21845,21855],"snow imp costume feet":[21846,21857],"santa suit":[21866,21867,21868],"wrath rune":[21880,22208],"dragon armour set":[21882,21885],"dragon platebody":[21892,22242],"dragon kiteshield":[21895,22244],"assembler max cape":[21898,21916,24135],"dragon crossbow":[21902,21921],"dragon bolts":[21905,21924,21926,21928,21930],"mythical cape":[21913,22114],"avas assembler":[21914,22109,24222],"opal dragon bolts":[21932,21955],"jade dragon bolts":[21934,21957],"pearl dragon bolts":[21936,21959],"topaz dragon bolts":[21938,21961],"sapphire dragon bolts":[21940,21963],"emerald dragon bolts":[21942,21965],"ruby dragon bolts":[21944,21967],"diamond dragon bolts":[21946,21969],"dragonstone dragon bolts":[21948,21971],"onyx dragon bolts":[21950,21973],"super antifire potion":[21978,21981,21984,21987],"super antifire mix":[21994,21997],"dragonfire ward":[22002,22003],"map piece":[22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032],"old notes":[22051,22053,22055,22057,22059,22061,22063,22065,22067,22069,22071,22073,22075,22077,22410,22774,23023,23025,23027,23029,23031,23033,23035],"dragon key":[22087,22092],"dragon key piece":[22088,22089,22090,22091],"adamant heraldic helm":[22159,22161,22163,22165,22167,22169,22171,22173,22175,22177,22179,22181,22183,22185,22187,22189],"extended super antifire":[22209,22212,22215,22218],"extended super antifire mix":[22221,22224],"avernic defender":[22322,22441,24186],"sanguinesti staff":[22323,22481],"ghrazi rapier":[22324,23628],"scythe of vitur":[22325,22486,22664],"bryophytas staff":[22368,22370],"vial of blood":[22405,22446],"battlemage potion":[22449,22452,22455,22458],"bastion potion":[22461,22464,22467,22470],"sinhaza shroud tier":[22494,22496,22498,22500,22502],"coin pouch":[22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538],"viggoras chainmace":[22542,22545],"craws bow":[22547,22550],"thammarons sceptre":[22552,22555],"vestas longsword":[22613,23615],"statiuss warhammer":[22622,23620],"morrigans javelin":[22636,23619],"zuriels staff":[22647,23617],"dragon hasta":[22731,22734,22737,22740,22743],"ikkle hydra":[22746,22748,22750,22752],"energy disk":[22765,22766,22767,22768],"unknown fluid":[22769,22770,22771,22772,22773],"dragonfruit pie":[22792,22795],"radas blessing":[22803,22941,22943,22945,22947],"dragon knife":[22804,22806,22808,22810,22812,22814],"cormorants glove":[22816,22817],"celastrus seedling":[22848,22852],"redwood seedling":[22850,22854],"dragonfruit seedling":[22862,22864],"bottomless compost bucket":[22994,22997],"bottled dragonbreath":[22999,23002],"treasure scroll":[23067,23068,23070],"mystic set":[23110,23113,23116,23119],"rune scimitar ornament kit":[23321,23324,23327],"giant egg sac":[23517,23520],"crystal seedling":[23655,23657],"crystal axe":[23673,23675,23862],"crystal pickaxe":[23680,23682,23863],"divine super combat potion":[23685,23688,23691,23694],"divine super attack potion":[23697,23700,23703,23706],"divine super strength potion":[23709,23712,23715,23718],"divine super defence potion":[23721,23724,23727,23730],"divine ranging potion":[23733,23736,23739,23742],"divine magic potion":[23745,23748,23751,23754],"crystal harpoon":[23762,23764,23864],"crystal dust":[23804,23867,23964],"crystal seed":[23808,23810],"weapon frame":[23834,23871],"grym leaf":[23835,23875],"linum tirinum":[23836,23876],"phren bark":[23838,23878],"corrupted body":[23843,23844,23845],"corrupted legs":[23846,23847,23848],"corrupted halberd":[23849,23850,23851],"corrupted staff":[23852,23853,23854],"corrupted bow":[23855,23856,23857],"egniol potion":[23882,23883,23884,23885],"crystal helm":[23886,23887,23888,23971,23973],"crystal body":[23889,23890,23891,23975,23977],"crystal legs":[23892,23893,23894,23979,23981],"crystal staff":[23898,23899,23900],"crystal crown":[23911,23913,23915,23917,23919,23921,23923,23925],"blade of saeldor":[23995,23997],"elven top":[24009,24015,24021,24027],"elven skirt":[24012,24018],"memoriam crystal":[24030,24031,24032,24033],"armadyl halo":[24147,24192,24194],"bandos halo":[24149,24195,24197],"seren halo":[24151,24198,24200],"ancient halo":[24153,24201,24203],"brassica halo":[24155,24204,24206],"victors cape":[24207,24209,24211,24213,24215],"unsealed letter":[24256,24257],"v sigil":[24258,24259],"vs shield":[24265,24266],"mysterious emblem":[24277,24279,24281,24283,24285]} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/callback/cursor.png b/runelite-client/src/main/resources/net/runelite/client/callback/cursor.png deleted file mode 100644 index 7415625a2f..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/callback/cursor.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav deleted file mode 100644 index d7cf952977..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav deleted file mode 100644 index 17c05cd53b..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav deleted file mode 100644 index e7a4383f1b..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav deleted file mode 100644 index 9838762423..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav deleted file mode 100644 index da26385656..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/break.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/break.wav deleted file mode 100644 index 1a9a744c57..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/break.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav deleted file mode 100644 index f8945891df..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav deleted file mode 100644 index 532b0083f9..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav deleted file mode 100644 index 49b21d32ac..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav deleted file mode 100644 index 8a632ac14e..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav deleted file mode 100644 index 3e90326a5b..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav deleted file mode 100644 index 23d99f59d5..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav deleted file mode 100644 index 8994a0faef..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav deleted file mode 100644 index 985f222670..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav deleted file mode 100644 index 25e37ee07e..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav deleted file mode 100644 index 1f046c9aed..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav deleted file mode 100644 index 66f2077b10..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav deleted file mode 100644 index 90760c346f..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/open.osrs.properties b/runelite-client/src/main/resources/net/runelite/client/open.osrs.properties deleted file mode 100644 index d101a6de1c..0000000000 --- a/runelite-client/src/main/resources/net/runelite/client/open.osrs.properties +++ /dev/null @@ -1,15 +0,0 @@ -runelite.version=@project.version@ -runescape.version=@rs.version@ -open.osrs.discord.appid=627741263881568257 -runelite.discord.invite=https://discord.gg/openosrs -runelite.github.link=https://github.com/open-osrs/runelite -runelite.wiki.link=https://github.com/open-osrs/runelite/wiki -runelite.patreon.link=https://www.patreon.com/openosrs -open.osrs.title=OpenOSRS -open.osrs.version=@open.osrs.version@ -open.osrs.builddate=@open.osrs.builddate@ -runelite.wiki.troubleshooting.link=https://github.com/open-osrs/runelite/wiki/Troubleshooting-problems-with-the-client -runelite.wiki.building.link=https://github.com/open-osrs/runelite/wiki/Building-with-IntelliJ-IDEA -runelite.dnschange.link=https://1.1.1.1/dns/ -plugin.path=@plugin.path@ -runelite.imgur.client.id=30d71e5f6860809 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/refresh.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/refresh.png deleted file mode 100644 index cd26305f7a..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/config/refresh.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_unordered.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_unordered.glsl index 531eb6c935..8eb4bdaa69 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_unordered.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/comp_unordered.glsl @@ -29,8 +29,6 @@ layout(local_size_x = 6) in; -#include common.glsl - void main() { uint groupId = gl_WorkGroupID.x; uint localId = gl_LocalInvocationID.x; @@ -41,7 +39,6 @@ void main() { int outOffset = minfo.idx; int uvOffset = minfo.uvOffset; int flags = minfo.flags; - int orientation = flags & 0x7ff; ivec4 pos = ivec4(minfo.x, minfo.y, minfo.z, 0); if (localId >= size) { @@ -62,16 +59,12 @@ void main() { thisC = tempvb[offset + ssboOffset * 3 + 2]; } - ivec4 thisrvA = rotate(thisA, orientation); - ivec4 thisrvB = rotate(thisB, orientation); - ivec4 thisrvC = rotate(thisC, orientation); - uint myOffset = localId; // position vertices in scene and write to out buffer - vout[outOffset + myOffset * 3] = pos + thisrvA; - vout[outOffset + myOffset * 3 + 1] = pos + thisrvB; - vout[outOffset + myOffset * 3 + 2] = pos + thisrvC; + vout[outOffset + myOffset * 3] = pos + thisA; + vout[outOffset + myOffset * 3 + 1] = pos + thisB; + vout[outOffset + myOffset * 3 + 2] = pos + thisC; if (uvOffset < 0) { uvout[outOffset + myOffset * 3] = vec4(0, 0, 0, 0); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl index b89513a94e..9b6ae61db8 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/frag.glsl @@ -30,6 +30,7 @@ uniform float brightness; uniform float smoothBanding; uniform vec4 fogColor; uniform int colorBlindMode; +uniform float textureLightMode; in vec4 Color; noperspective centroid in float fHsl; @@ -43,26 +44,30 @@ out vec4 FragColor; #include colorblind.glsl void main() { - int hsl = int(fHsl); - vec3 rgb = hslToRgb(hsl) * smoothBanding + Color.rgb * (1.f - smoothBanding); - vec4 smoothColor = vec4(rgb, Color.a); + vec4 c; if (textureId > 0) { int textureIdx = textureId - 1; - vec2 uv = fUv; - vec2 animatedUv = uv + textureOffsets[textureIdx]; + vec2 animatedUv = fUv + textureOffsets[textureIdx]; vec4 textureColor = texture(textures, vec3(animatedUv, float(textureIdx))); vec4 textureColorBrightness = pow(textureColor, vec4(brightness, brightness, brightness, 1.0f)); - smoothColor = textureColorBrightness * smoothColor; + // textured triangles hsl is a 7 bit lightness 2-126 + float light = fHsl / 127.f; + vec3 mul = (1.f - textureLightMode) * vec3(light) + textureLightMode * Color.rgb; + c = textureColorBrightness * vec4(mul, 1.f); + } else { + // pick interpolated hsl or rgb depending on smooth banding setting + vec3 rgb = hslToRgb(int(fHsl)) * smoothBanding + Color.rgb * (1.f - smoothBanding); + c = vec4(rgb, Color.a); } if (colorBlindMode > 0) { - smoothColor.rgb = colorblind(colorBlindMode, smoothColor.rgb); + c.rgb = colorblind(colorBlindMode, c.rgb); } - vec3 mixedColor = mix(smoothColor.rgb, fogColor.rgb, fogAmount); - FragColor = vec4(mixedColor, smoothColor.a); + vec3 mixedColor = mix(c.rgb, fogColor.rgb, fogAmount); + FragColor = vec4(mixedColor, c.a); } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl index e522d34400..5a54522f83 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/fragui.glsl @@ -34,6 +34,7 @@ uniform int samplingMode; uniform ivec2 sourceDimensions; uniform ivec2 targetDimensions; uniform int colorBlindMode; +uniform vec4 alphaOverlay; #include scale/bicubic.glsl #include scale/xbr_lv2_frag.glsl @@ -44,6 +45,13 @@ in XBRTable xbrTable; out vec4 FragColor; +vec4 alphaBlend(vec4 src, vec4 dst) { + return vec4( + src.rgb + dst.rgb * (1.0f - src.a), + src.a + dst.a * (1.0f - src.a) + ); +} + void main() { vec4 c; @@ -51,14 +59,17 @@ void main() { case SAMPLING_CATROM: case SAMPLING_MITCHELL: c = textureCubic(tex, TexCoord, samplingMode); + c = alphaBlend(c, alphaOverlay); c.rgb = colorblind(colorBlindMode, c.rgb); break; case SAMPLING_XBR: c = textureXBR(tex, TexCoord, xbrTable, ceil(1.0 * targetDimensions.x / sourceDimensions.x)); + c = alphaBlend(c, alphaOverlay); c.rgb = colorblind(colorBlindMode, c.rgb); break; default: // NEAREST or LINEAR, which uses GL_TEXTURE_MIN_FILTER/GL_TEXTURE_MAG_FILTER to affect sampling c = texture(tex, TexCoord); + c = alphaBlend(c, alphaOverlay); c.rgb = colorblind(colorBlindMode, c.rgb); } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/info/folder_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/folder_icon.png deleted file mode 100644 index 41aa88c301..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/info/folder_icon.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externalmanager_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externalmanager_icon.png deleted file mode 100644 index 7cb7e2502c..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externalmanager_icon.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_icon.png deleted file mode 100644 index 343c3dce0c..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_icon.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_raw_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_raw_icon.png deleted file mode 100644 index 7f1afebf35..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/add_raw_icon.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/delete_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/delete_icon.png deleted file mode 100644 index 3f4915d041..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/delete_icon.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/discord_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/discord_icon.png deleted file mode 100644 index 6b7a6988f9..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/discord_icon.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/gh_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/gh_icon.png deleted file mode 100644 index 4d8e66215e..0000000000 Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/openosrs/externals/gh_icon.png and /dev/null differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json index 650945b8d8..6e3c4c088b 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_herblore.json @@ -360,6 +360,12 @@ "name": "Extended Antifire (3)", "xp": 82.5 }, + { + "level": 84, + "icon": 11951, + "name": "Extended Antifire (4)", + "xp": 110 + }, { "level": 86, "icon": 24635, @@ -378,6 +384,12 @@ "name": "Anti-venom(3)", "xp": 90 }, + { + "level": 87, + "icon": 12905, + "name": "Anti-venom(4)", + "xp": 120 + }, { "level": 90, "icon": 12695, @@ -386,14 +398,14 @@ }, { "level": 92, - "icon": 21981, - "name": "Super Antifire (3)", + "icon": 21978, + "name": "Super Antifire (4)", "xp": 130 }, { "level": 94, - "icon": 12915, - "name": "Anti-venom+(3)", + "icon": 12913, + "name": "Anti-venom+(4)", "xp": 125 }, { diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skybox/skybox.txt b/runelite-client/src/main/resources/net/runelite/client/plugins/skybox/skybox.txt index e0400293b0..fb8bd463ce 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skybox/skybox.txt +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skybox/skybox.txt @@ -974,7 +974,7 @@ c 7 4 #100 R 19 19 21 20 -// Cosmic renderable's plane +// Cosmic entity's plane #040404 r 32 75 diff --git a/runelite-client/src/main/resources/npc_stats.json b/runelite-client/src/main/resources/npc_stats.json deleted file mode 100644 index 7e92556622..0000000000 --- a/runelite-client/src/main/resources/npc_stats.json +++ /dev/null @@ -1 +0,0 @@ -{"1":{"name":"Molanisk","hitpoints":52,"combatLevel":51,"slayerLevel":39,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":50,"rangeLevel":1,"stabDef":45,"slashDef":45,"crushDef":35,"rangeDef":55,"magicDef":30},"2":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15},"3":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15},"4":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15},"5":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15},"6":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15},"7":{"name":"Aberrant spectre","hitpoints":90,"combatLevel":96,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":105,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":15},"8":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"10":{"name":"Death spawn","hitpoints":60,"combatLevel":46,"attackSpeed":4,"attackLevel":67,"strengthLevel":7,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"11":{"name":"Nechryael","hitpoints":105,"combatLevel":115,"slayerLevel":80,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"26":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"27":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"28":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"29":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"30":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"31":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"32":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"33":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"34":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"35":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"36":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"37":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"38":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"39":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"40":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"41":{"name":"Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"42":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"43":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"44":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"45":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"46":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"47":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"48":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"49":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"50":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"51":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"52":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"53":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"54":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"55":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"56":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"57":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"58":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"59":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"60":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"61":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"62":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"63":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"64":{"name":"Zombie","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":8,"crushDef":12,"rangeDef":10,"magicDef":10,"bonusAttack":5,"bonusStrength":7},"65":{"name":"Zombie","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":8,"crushDef":12,"rangeDef":10,"magicDef":10,"bonusAttack":5,"bonusStrength":7},"66":{"name":"Zombie","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":8,"crushDef":12,"rangeDef":10,"magicDef":10,"bonusAttack":5,"bonusStrength":7},"67":{"name":"Zombie","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":8,"crushDef":12,"rangeDef":10,"magicDef":10,"bonusAttack":5,"bonusStrength":7},"68":{"name":"Zombie","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":19,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":8,"crushDef":12,"rangeDef":10,"magicDef":10,"bonusAttack":5,"bonusStrength":7},"69":{"name":"Summoned Zombie","hitpoints":22,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":9,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"70":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"71":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"72":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"73":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"74":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"75":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"76":{"name":"Skeleton","hitpoints":24,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"77":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"78":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"79":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"80":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"81":{"name":"Skeleton","hitpoints":17,"combatLevel":25,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"82":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"83":{"name":"Skeleton","hitpoints":59,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":35,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"84":{"name":"Skeleton Mage","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":14,"defenceLevel":14,"rangeLevel":1,"magicLevel":18},"85":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"86":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"87":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"88":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"89":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"90":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"91":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"92":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"93":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"94":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"95":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"96":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"97":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"98":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"99":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"100":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"101":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"102":{"name":"Rock Crab","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"103":{"name":"Rocks","hitpoints":50,"combatLevel":13,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"104":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"105":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"106":{"name":"Wolf","hitpoints":69,"combatLevel":64,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"107":{"name":"White wolf","hitpoints":34,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"108":{"name":"White wolf","hitpoints":44,"combatLevel":38,"attackSpeed":4,"attackLevel":30,"strengthLevel":31,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"109":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"110":{"name":"Wolf","hitpoints":34,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"112":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"113":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"114":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"115":{"name":"Big Wolf","hitpoints":74,"combatLevel":73,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"116":{"name":"Wolf","hitpoints":34,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"117":{"name":"Wolf","hitpoints":34,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"130":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1},"131":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"132":{"name":"Hobgoblin","hitpoints":62,"combatLevel":54,"attackSpeed":6,"attackLevel":45,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"133":{"name":"Troll","hitpoints":120,"combatLevel":91,"attackSpeed":4,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"134":{"name":"Huge spider","hitpoints":90,"combatLevel":81,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":69,"rangeLevel":1,"magicLevel":1},"135":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"136":{"name":"Ogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"137":{"name":"Baby red dragon","hitpoints":65,"combatLevel":65,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"138":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"139":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"140":{"name":"Dagannoth","hitpoints":142,"combatLevel":135,"attackSpeed":4,"attackLevel":114,"strengthLevel":117,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusRangeStrength":50},"141":{"name":"Tok-Xil","hitpoints":60,"combatLevel":135,"attackSpeed":4,"attackLevel":120,"strengthLevel":180,"defenceLevel":90,"rangeLevel":180,"magicLevel":90},"142":{"name":"Demon","hitpoints":79,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"143":{"name":"Rocnar","hitpoints":100,"combatLevel":97,"attackSpeed":6,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"bonusAttack":22,"bonusStrength":20},"231":{"name":"Wolf","hitpoints":34,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"232":{"name":"Jungle Wolf","hitpoints":69,"combatLevel":64,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"239":{"name":"King Black Dragon","hitpoints":240,"combatLevel":276,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":1,"magicLevel":240,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80},"240":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"241":{"name":"Baby blue dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"242":{"name":"Baby blue dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"243":{"name":"Baby blue dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"244":{"name":"Baby red dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"245":{"name":"Baby red dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"246":{"name":"Baby red dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"247":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"248":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"249":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"250":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"251":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"252":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"253":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"254":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"255":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"256":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"257":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"258":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"259":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"260":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"261":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"262":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"263":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"264":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"265":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"266":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"267":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"268":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"269":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"270":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"271":{"name":"Bronze dragon","hitpoints":122,"combatLevel":131,"attackSpeed":4,"attackLevel":112,"strengthLevel":112,"defenceLevel":112,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"272":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"273":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"274":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"275":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"289":{"name":"Ghoul","hitpoints":50,"combatLevel":42,"attackSpeed":6,"attackLevel":30,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"290":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"291":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"292":{"name":"Dwarf","hitpoints":26,"combatLevel":20,"attackSpeed":6,"attackLevel":15,"strengthLevel":16,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"magicDef":5,"bonusAttack":11,"bonusStrength":9},"294":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"295":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"296":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"299":{"name":"Gunthor the brave","hitpoints":35,"combatLevel":29,"attackSpeed":6,"attackLevel":22,"strengthLevel":22,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":10,"rangeDef":11,"bonusAttack":8,"bonusStrength":13},"300":{"name":"Jailer","hitpoints":47,"combatLevel":47,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":63,"crushDef":47},"301":{"name":"Black Heather","hitpoints":37,"combatLevel":34,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"302":{"name":"Donny the lad","hitpoints":37,"combatLevel":34,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"303":{"name":"Speedy Keith","hitpoints":37,"combatLevel":34,"attackSpeed":4,"attackLevel":32,"strengthLevel":26,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9},"304":{"name":"Salarin the twisted","hitpoints":70,"combatLevel":70,"attackSpeed":4,"attackLevel":58,"strengthLevel":58,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"319":{"name":"Corporeal Beast","hitpoints":2000,"combatLevel":785,"attackSpeed":4,"attackLevel":320,"strengthLevel":320,"defenceLevel":310,"rangeLevel":150,"magicLevel":350,"stabDef":25,"slashDef":200,"crushDef":100,"rangeDef":230,"magicDef":150,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"320":{"name":"Dark energy core","hitpoints":25,"combatLevel":75,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"397":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"398":{"name":"Town Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"399":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"400":{"name":"Town Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"bonusAttack":6,"bonusStrength":10},"406":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"407":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"408":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"409":{"name":"Cave crawler","hitpoints":22,"combatLevel":23,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"410":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"411":{"name":"Kurask","hitpoints":97,"combatLevel":106,"slayerLevel":70,"attackSpeed":4,"attackLevel":67,"strengthLevel":105,"defenceLevel":105,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20,"poisonImmune":true,"venomImmune":true},"412":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"413":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"414":{"name":"Banshee","hitpoints":22,"combatLevel":23,"slayerLevel":15,"attackSpeed":4,"attackLevel":22,"strengthLevel":15,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"415":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"416":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"417":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"418":{"name":"Basilisk","hitpoints":75,"combatLevel":61,"slayerLevel":40,"attackSpeed":4,"attackLevel":30,"strengthLevel":45,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20},"419":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"420":{"name":"Cockatrice","hitpoints":37,"combatLevel":37,"slayerLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"magicDef":10},"421":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"422":{"name":"Rockslug","hitpoints":27,"combatLevel":29,"slayerLevel":20,"attackSpeed":4,"attackLevel":22,"strengthLevel":27,"defenceLevel":27,"rangeLevel":1,"magicLevel":1},"423":{"name":"Dust devil","hitpoints":105,"combatLevel":93,"slayerLevel":65,"attackSpeed":4,"attackLevel":105,"strengthLevel":70,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"427":{"name":"Turoth","hitpoints":81,"combatLevel":89,"slayerLevel":55,"attackSpeed":4,"attackLevel":58,"strengthLevel":88,"defenceLevel":88,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"428":{"name":"Turoth","hitpoints":79,"combatLevel":87,"slayerLevel":55,"attackSpeed":4,"attackLevel":56,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"429":{"name":"Turoth","hitpoints":77,"combatLevel":85,"slayerLevel":55,"attackSpeed":4,"attackLevel":54,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"430":{"name":"Turoth","hitpoints":76,"combatLevel":83,"slayerLevel":55,"attackSpeed":4,"attackLevel":53,"strengthLevel":83,"defenceLevel":83,"rangeLevel":1,"magicLevel":1,"slashDef":20,"crushDef":20},"433":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"434":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"435":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"436":{"name":"Pyrefiend","hitpoints":45,"combatLevel":43,"slayerLevel":30,"attackSpeed":4,"attackLevel":52,"strengthLevel":30,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"437":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"438":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"439":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"440":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"441":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"442":{"name":"Jelly","hitpoints":75,"combatLevel":78,"slayerLevel":52,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":120,"rangeLevel":1,"magicLevel":45},"443":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"444":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"445":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"446":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"447":{"name":"Infernal Mage","hitpoints":60,"combatLevel":66,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":1,"magicLevel":75,"magicDef":40},"448":{"name":"Crawling Hand","hitpoints":16,"combatLevel":8,"slayerLevel":5,"attackSpeed":4,"attackLevel":8,"strengthLevel":4,"defenceLevel":4,"rangeLevel":1,"magicLevel":1},"449":{"name":"Crawling Hand","hitpoints":15,"combatLevel":7,"slayerLevel":5,"attackSpeed":4,"attackLevel":7,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"450":{"name":"Crawling Hand","hitpoints":15,"combatLevel":7,"slayerLevel":5,"attackSpeed":4,"attackLevel":7,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"451":{"name":"Crawling Hand","hitpoints":15,"combatLevel":7,"slayerLevel":5,"attackSpeed":4,"attackLevel":7,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"452":{"name":"Crawling Hand","hitpoints":15,"combatLevel":7,"slayerLevel":5,"attackSpeed":4,"attackLevel":7,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"453":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"454":{"name":"Crawling Hand","hitpoints":19,"combatLevel":12,"slayerLevel":5,"attackSpeed":4,"attackLevel":11,"strengthLevel":7,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"458":{"name":"Lizard","hitpoints":40,"combatLevel":42,"slayerLevel":22,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"459":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"460":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"461":{"name":"Desert Lizard","hitpoints":25,"combatLevel":24,"slayerLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":22,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"462":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"463":{"name":"Small Lizard","hitpoints":15,"combatLevel":12,"slayerLevel":22,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"464":{"name":"Harpie Bug Swarm","hitpoints":25,"combatLevel":46,"slayerLevel":33,"attackSpeed":4,"attackLevel":54,"strengthLevel":46,"defenceLevel":32,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":10,"rangeDef":10,"magicDef":5},"465":{"name":"Skeletal Wyvern","hitpoints":200,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80},"466":{"name":"Skeletal Wyvern","hitpoints":200,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80},"467":{"name":"Skeletal Wyvern","hitpoints":200,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80},"468":{"name":"Skeletal Wyvern","hitpoints":200,"combatLevel":140,"slayerLevel":72,"attackSpeed":6,"attackLevel":125,"strengthLevel":116,"defenceLevel":120,"rangeLevel":120,"magicLevel":125,"stabDef":140,"slashDef":90,"crushDef":90,"rangeDef":140,"magicDef":80},"469":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"470":{"name":"Killerwatt","hitpoints":51,"combatLevel":55,"slayerLevel":37,"attackSpeed":2,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":67,"magicLevel":67,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"472":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"473":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"474":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"475":{"name":"Hole in the wall","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"476":{"name":"Wall beast","hitpoints":105,"combatLevel":49,"slayerLevel":35,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"477":{"name":"Giant frog","hitpoints":100,"combatLevel":99,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"478":{"name":"Big frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"480":{"name":"Cave slime","hitpoints":25,"combatLevel":23,"slayerLevel":17,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":35,"rangeLevel":1,"magicLevel":13},"481":{"name":"Cave bug","hitpoints":5,"combatLevel":6,"slayerLevel":7,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"483":{"name":"Cave bug","hitpoints":93,"combatLevel":96,"slayerLevel":7,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":84,"rangeLevel":1,"magicLevel":1,"stabDef":72,"slashDef":59,"crushDef":35,"rangeDef":95,"magicDef":25},"484":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"485":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"486":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"487":{"name":"Bloodveld","hitpoints":120,"combatLevel":76,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"492":{"name":"Cave kraken","hitpoints":125,"combatLevel":127,"slayerLevel":87,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":150,"rangeLevel":1,"magicLevel":120,"rangeDef":100},"493":{"name":"Whirlpool","slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"494":{"name":"Kraken","hitpoints":255,"combatLevel":291,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"496":{"name":"Whirlpool","slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"498":{"name":"Smoke devil","hitpoints":185,"combatLevel":160,"slayerLevel":93,"attackSpeed":4,"attackLevel":140,"strengthLevel":130,"defenceLevel":275,"rangeLevel":195,"magicLevel":1,"rangeDef":44,"magicDef":600,"poisonImmune":true,"venomImmune":true},"499":{"name":"Thermonuclear smoke devil","hitpoints":240,"combatLevel":301,"slayerLevel":93,"attackSpeed":2,"attackLevel":230,"strengthLevel":220,"defenceLevel":360,"rangeLevel":310,"magicLevel":1,"stabDef":11,"slashDef":4,"crushDef":9,"rangeDef":900,"magicDef":800,"poisonImmune":true,"venomImmune":true},"505":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"506":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"507":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"508":{"name":"Soulless","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"509":{"name":"Death wing","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"510":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":22,"magicDef":3},"511":{"name":"Invrigar the Necromancer","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":18,"magicDef":3},"512":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"513":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"516":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"517":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"518":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"519":{"name":"Highwayman","hitpoints":13,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":6,"bonusStrength":7},"520":{"name":"Chaos druid","hitpoints":20,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":10},"521":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"522":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":2,"bonusAttack":8,"bonusStrength":10},"523":{"name":"Pirate","hitpoints":23,"combatLevel":26,"attackSpeed":5,"attackLevel":23,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":2,"bonusAttack":8,"bonusStrength":10},"525":{"name":"Thug","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":7,"strengthLevel":5,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":3,"crushDef":3,"bonusAttack":5,"bonusStrength":5},"526":{"name":"Rogue","hitpoints":17,"combatLevel":15,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":9,"crushDef":11,"bonusAttack":5,"bonusStrength":5},"527":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"528":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"529":{"name":"Monk of Zamorak","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":42,"rangeLevel":1,"magicLevel":40},"530":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"531":{"name":"Dark warrior","hitpoints":17,"combatLevel":8,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":79,"crushDef":59,"bonusAttack":20,"bonusStrength":16},"532":{"name":"Chaos druid warrior","hitpoints":40,"combatLevel":37,"attackSpeed":5,"attackLevel":32,"strengthLevel":34,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":17,"crushDef":14,"rangeDef":14,"bonusAttack":9,"bonusStrength":5},"537":{"name":"Zygomite","hitpoints":65,"combatLevel":74,"slayerLevel":57,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":65,"magicLevel":65,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"561":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"562":{"name":"Sorebones","hitpoints":52,"combatLevel":57,"attackSpeed":4,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"563":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"564":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"565":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"566":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"567":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"568":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"569":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"570":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"571":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"572":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"573":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"574":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"575":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"576":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"577":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"578":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"579":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"580":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"581":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"582":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"583":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"584":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"585":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"586":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"587":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"588":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"589":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"590":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"591":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"592":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"593":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"594":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"595":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"596":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"597":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"598":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"599":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"600":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"613":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"614":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"615":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"616":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"617":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"618":{"name":"Zombie pirate","hitpoints":52,"combatLevel":57,"attackSpeed":3,"attackLevel":49,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"619":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"620":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"621":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"622":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"623":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"624":{"name":"Zombie swab","hitpoints":50,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"625":{"name":"Evil spirit","hitpoints":90,"combatLevel":150,"attackSpeed":4,"attackLevel":170,"strengthLevel":146,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"626":{"name":"Fever spider","hitpoints":40,"combatLevel":49,"slayerLevel":42,"attackSpeed":4,"attackLevel":60,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"639":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"642":{"name":"Arrg","hitpoints":140,"combatLevel":113,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"643":{"name":"Arrg","hitpoints":140,"combatLevel":113,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"645":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"646":{"name":"Ice wolf","hitpoints":70,"combatLevel":96,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"647":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"648":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"649":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"650":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"651":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"652":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"653":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"654":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"655":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"656":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"657":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"658":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"659":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"660":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"661":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"662":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"663":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"664":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"665":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"666":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"667":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"668":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"674":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"677":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"678":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"680":{"name":"Giant skeleton","hitpoints":70,"combatLevel":80,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"681":{"name":"Giant skeleton","hitpoints":70,"combatLevel":80,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"682":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"683":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":3,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"685":{"name":"Stranger","hitpoints":80,"combatLevel":95,"attackSpeed":4,"attackLevel":90,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"magic":1,"stabDef":81,"slashDef":93,"crushDef":98,"rangeDef":82,"magicDef":1,"bonusStrength":40},"690":{"name":"Bandit","hitpoints":65,"combatLevel":74,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"695":{"name":"Bandit","hitpoints":50,"combatLevel":57,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"699":{"name":"Ice troll","hitpoints":80,"combatLevel":124,"attackSpeed":4,"attackLevel":140,"strengthLevel":120,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"700":{"name":"Ice troll","hitpoints":80,"combatLevel":123,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"701":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"702":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"703":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"704":{"name":"Ice troll","hitpoints":100,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"705":{"name":"Ice troll","hitpoints":80,"combatLevel":121,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"710":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"711":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"712":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"713":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"714":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"715":{"name":"Ice wolf","hitpoints":70,"combatLevel":132,"attackSpeed":4,"attackLevel":150,"strengthLevel":150,"defenceLevel":70},"717":{"name":"Mummy","hitpoints":1,"combatLevel":96,"attackSpeed":4,"attackLevel":255,"strengthLevel":2,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100},"720":{"name":"Mummy","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":90,"bonusStrength":90},"721":{"name":"Mummy","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":90,"bonusStrength":90},"722":{"name":"Mummy","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":90,"bonusStrength":90},"723":{"name":"Mummy","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":90,"bonusStrength":90},"724":{"name":"Mummy","hitpoints":10,"combatLevel":98,"attackSpeed":4,"attackLevel":255,"strengthLevel":2,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100},"725":{"name":"Mummy","hitpoints":10,"combatLevel":98,"attackSpeed":4,"attackLevel":255,"strengthLevel":2,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100},"726":{"name":"Mummy","hitpoints":10,"combatLevel":98,"attackSpeed":4,"attackLevel":255,"strengthLevel":2,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100},"727":{"name":"Mummy","hitpoints":10,"combatLevel":98,"attackSpeed":4,"attackLevel":255,"strengthLevel":2,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100},"728":{"name":"Mummy","hitpoints":10,"combatLevel":98,"attackSpeed":4,"attackLevel":255,"strengthLevel":2,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100},"729":{"name":"Scarabs","hitpoints":25,"combatLevel":92,"attackSpeed":1,"attackLevel":255,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"734":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"735":{"name":"Bandit","hitpoints":30,"combatLevel":56,"attackSpeed":4,"attackLevel":59,"strengthLevel":70,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"736":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"737":{"name":"Bandit","hitpoints":30,"combatLevel":41,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":9,"crushDef":8,"magicDef":10,"bonusAttack":9,"bonusStrength":9},"738":{"name":"Bandit champion","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":59,"strengthLevel":80,"defenceLevel":50,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9,"poisonImmune":true},"762":{"name":"Baby Roc","hitpoints":50,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":150},"763":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"764":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"773":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"774":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"785":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"786":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"787":{"name":"Suqah","hitpoints":105,"combatLevel":111,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"788":{"name":"Suqah","hitpoints":105,"combatLevel":111,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"789":{"name":"Suqah","hitpoints":105,"combatLevel":111,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"790":{"name":"Suqah","hitpoints":105,"combatLevel":111,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"791":{"name":"Suqah","hitpoints":105,"combatLevel":111,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"792":{"name":"Suqah","hitpoints":105,"combatLevel":111,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"793":{"name":"Suqah","hitpoints":105,"combatLevel":111,"attackSpeed":6,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":90},"794":{"name":"Scarab mage","hitpoints":50,"combatLevel":93,"attackSpeed":15,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":70,"magic":70,"stabDef":40,"slashDef":90,"crushDef":90,"magicDef":34},"795":{"name":"Locust rider","hitpoints":90,"combatLevel":106,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"796":{"name":"Locust rider","hitpoints":90,"combatLevel":98,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"797":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"798":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"799":{"name":"Scarab mage","hitpoints":50,"combatLevel":66,"attackSpeed":15,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":70,"magic":70,"stabDef":40,"slashDef":90,"crushDef":90,"magicDef":34},"800":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"attackSpeed":6,"attackLevel":100,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":40},"801":{"name":"Locust rider","hitpoints":90,"combatLevel":68,"attackSpeed":6,"attackLevel":105,"strengthLevel":90,"defenceLevel":50,"rangeLevel":90,"magicLevel":1,"range":80,"stabDef":50,"slashDef":90,"crushDef":50,"rangeDef":66,"magicDef":34,"bonusRangeStrength":80},"817":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"820":{"name":"Wormbrain","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"823":{"name":"Melzar the Mad","hitpoints":44,"combatLevel":43,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":34,"rangeLevel":1,"magicLevel":40,"poisonImmune":true,"venomImmune":true},"852":{"name":"Icelord","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"853":{"name":"Icelord","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"854":{"name":"Icelord","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"855":{"name":"Icelord","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"866":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"867":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"868":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"869":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"870":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"871":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"872":{"name":"Skogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"873":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"874":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"875":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"876":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"877":{"name":"Zogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"878":{"name":"Skogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"879":{"name":"Skogre","hitpoints":71,"combatLevel":44,"attackSpeed":6,"attackLevel":20,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"880":{"name":"Zombie","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"882":{"name":"Slash Bash","hitpoints":100,"combatLevel":111,"attackSpeed":6,"attackLevel":100,"strengthLevel":120,"defenceLevel":60,"rangeLevel":100,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"bonusAttack":22},"891":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"911":{"name":"Agrith Naar","hitpoints":95,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100},"924":{"name":"Skeleton","hitpoints":18,"combatLevel":13,"attackSpeed":4},"925":{"name":"Rock","hitpoints":140,"combatLevel":111,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"926":{"name":"Stick","hitpoints":135,"combatLevel":104,"attackSpeed":6,"attackLevel":60,"strengthLevel":110,"defenceLevel":60,"stabDef":30,"slashDef":30,"crushDef":50,"rangeDef":200,"magicDef":200,"bonusAttack":50,"bonusStrength":80},"927":{"name":"Pee Hat","hitpoints":120,"combatLevel":91,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"928":{"name":"Kraka","hitpoints":120,"combatLevel":91,"attackSpeed":6,"attackLevel":50,"strengthLevel":100,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"931":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"932":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"933":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"934":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"935":{"name":"Thrower Troll","hitpoints":95,"combatLevel":67,"attackSpeed":7,"attackLevel":30,"strengthLevel":80,"defenceLevel":30,"rangeLevel":60,"rangeDef":200,"magicDef":200},"936":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"937":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"938":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"939":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"940":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"941":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"942":{"name":"Mountain troll","hitpoints":90,"combatLevel":69,"attackSpeed":6,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"946":{"name":"Ghast","hitpoints":45,"combatLevel":30,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"949":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"950":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"951":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"952":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"953":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"955":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"956":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"957":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"958":{"name":"Kalphite Soldier","hitpoints":90,"combatLevel":85,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"959":{"name":"Kalphite Guardian","hitpoints":170,"combatLevel":141,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"960":{"name":"Kalphite Guardian","hitpoints":170,"combatLevel":141,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"961":{"name":"Kalphite Worker","hitpoints":40,"combatLevel":28,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":1,"rangeDef":10,"magicDef":10},"962":{"name":"Kalphite Guardian","hitpoints":170,"combatLevel":141,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"963":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"965":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"970":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"971":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"972":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"973":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"974":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"975":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"976":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"977":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"978":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"979":{"name":"Dagannoth","hitpoints":160,"combatLevel":100},"980":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"981":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"982":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"983":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"984":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"985":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"986":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"987":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"988":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"990":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"991":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"992":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"993":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"994":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"1024":{"name":"Zygomite","hitpoints":75,"combatLevel":86,"slayerLevel":57,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":75,"magicLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"magicDef":20,"bonusAttack":30},"1025":{"name":"Necromancer","hitpoints":40,"combatLevel":26,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":18},"1026":{"name":"Bandit","hitpoints":27,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":11,"bonusStrength":12},"1027":{"name":"Guard Bandit","hitpoints":27,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":8,"crushDef":5,"rangeDef":4,"magicDef":1,"bonusAttack":11,"bonusStrength":12},"1037":{"name":"Snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":50,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1038":{"name":"Monkey","hitpoints":6,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1039":{"name":"Albino bat","hitpoints":33,"combatLevel":52,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1041":{"name":"Giant mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":12,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"1042":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1043":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1044":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1045":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1046":{"name":"Jungle horror","hitpoints":45,"combatLevel":70,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"1047":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackSpeed":4,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1048":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackSpeed":4,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1049":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackSpeed":4,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1050":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackSpeed":4,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1051":{"name":"Cave horror","hitpoints":55,"combatLevel":80,"slayerLevel":58,"attackSpeed":4,"attackLevel":80,"strengthLevel":77,"defenceLevel":62,"rangeLevel":1,"magicLevel":80},"1060":{"name":"Angry bear","combatLevel":40},"1061":{"name":"Angry unicorn","hitpoints":50,"combatLevel":45},"1062":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1063":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1064":{"name":"Angry giant rat","hitpoints":50,"combatLevel":45},"1065":{"name":"Angry goblin","hitpoints":50,"combatLevel":45},"1066":{"name":"Fear reaper","hitpoints":25,"combatLevel":42,"attackSpeed":4,"attackLevel":39,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1067":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1068":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1069":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1070":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1071":{"name":"Confusion beast","hitpoints":28,"combatLevel":43,"attackSpeed":4,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"1072":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1073":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1074":{"name":"Hopeless creature","hitpoints":25,"combatLevel":40,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"1075":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1076":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackSpeed":5,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1077":{"name":"Tolna","hitpoints":37,"combatLevel":46,"attackLevel":42,"strengthLevel":41,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"rangeDef":50,"magicDef":50},"1097":{"name":"Sea Snake Young","hitpoints":85,"combatLevel":90,"slayerLevel":40,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"1098":{"name":"Sea Snake Hatchling","hitpoints":50,"combatLevel":62,"slayerLevel":40,"attackSpeed":4,"attackLevel":60,"strengthLevel":55,"defenceLevel":50,"magicLevel":1},"1101":{"name":"Giant Sea Snake","hitpoints":100,"combatLevel":149,"attackSpeed":4,"attackLevel":170,"strengthLevel":90,"defenceLevel":160,"rangeLevel":130,"magicLevel":1},"1115":{"name":"Mourner","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":2,"crushDef":4},"1118":{"name":"Man","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1119":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1126":{"name":"Barrelchest (hard)","hitpoints":255,"combatLevel":380,"attackSpeed":5,"attackLevel":306,"strengthLevel":261,"defenceLevel":140,"rangeLevel":1,"magicLevel":162,"bonusAttack":80,"bonusStrength":80},"1127":{"name":"Giant scarab (hard)","hitpoints":255,"combatLevel":316,"attackSpeed":4,"attackLevel":305,"strengthLevel":342,"defenceLevel":169,"rangeLevel":342,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"1128":{"name":"Dessous (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"1129":{"name":"Kamil (hard)","hitpoints":255,"combatLevel":273,"attackSpeed":4,"attackLevel":380,"strengthLevel":160,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"1130":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1131":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1134":{"name":"Damis (hard)","hitpoints":198,"combatLevel":200,"attackSpeed":4,"attackLevel":198,"strengthLevel":198,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"1135":{"name":"Damis (hard)","hitpoints":255,"combatLevel":272,"attackSpeed":3,"attackLevel":320,"strengthLevel":200,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"1139":{"name":"Woman","hitpoints":13,"combatLevel":4,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"crushDef":1},"1140":{"name":"Woman","hitpoints":13,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1141":{"name":"Woman","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"1142":{"name":"Woman","hitpoints":23,"combatLevel":14,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1144":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"1148":{"name":"Mourner","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"1153":{"name":"Ogre","hitpoints":60,"combatLevel":63,"attackSpeed":6,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":19,"slashDef":23,"crushDef":24,"bonusAttack":8,"bonusStrength":6},"1163":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1173":{"name":"Chicken","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1174":{"name":"Chicken","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1175":{"name":"Rooster","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1204":{"name":"Alomone","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1206":{"name":"Clivet","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1207":{"name":"Hazeel Cultist","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":6,"crushDef":8},"1208":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1210":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1211":{"name":"Khazard Guard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":18,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":29,"crushDef":21,"bonusAttack":10,"bonusStrength":14},"1213":{"name":"General Khazard","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"1224":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"1225":{"name":"Khazard Ogre","hitpoints":60,"combatLevel":63,"attackSpeed":6,"attackLevel":54,"strengthLevel":53,"defenceLevel":53,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"1226":{"name":"Khazard Scorpion","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":40,"strengthLevel":39,"defenceLevel":34,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"1227":{"name":"Arzinian Avatar of Strength","attackSpeed":4},"1228":{"name":"Arzinian Avatar of Strength","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":110,"strengthLevel":100,"defenceLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":15},"1229":{"name":"Arzinian Avatar of Strength","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":65,"defenceLevel":50,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":10},"1230":{"name":"Arzinian Avatar of Ranging","attackSpeed":4},"1231":{"name":"Arzinian Avatar of Ranging","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":120,"rangeLevel":110,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":20,"magicDef":80,"bonusRangeStrength":10},"1232":{"name":"Arzinian Avatar of Ranging","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":40,"defenceLevel":75,"rangeLevel":75,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":15,"magicDef":40,"bonusRangeStrength":5},"1233":{"name":"Arzinian Avatar of Magic","attackSpeed":4},"1234":{"name":"Arzinian Avatar of Magic","hitpoints":100,"combatLevel":125,"attackSpeed":4,"attackLevel":10,"strengthLevel":90,"defenceLevel":120,"magicLevel":120,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":15,"magicDef":20},"1235":{"name":"Arzinian Avatar of Magic","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":50,"defenceLevel":75,"magicLevel":75,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":10,"magicDef":15},"1261":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1262":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1263":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1264":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1265":{"name":"Ram","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1267":{"name":"Vulture","hitpoints":10,"combatLevel":31,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1268":{"name":"Vulture","hitpoints":10,"combatLevel":31,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"1273":{"name":"Experiment","hitpoints":40,"combatLevel":51,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"1274":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1275":{"name":"Experiment","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"1276":{"name":"Loar Shadow","hitpoints":38,"combatLevel":40,"attackSpeed":4,"attackLevel":45,"strengthLevel":30,"defenceLevel":26},"1277":{"name":"Loar Shade","hitpoints":38,"combatLevel":40,"attackSpeed":4,"attackLevel":45,"strengthLevel":30,"defenceLevel":26},"1279":{"name":"Phrin Shadow","hitpoints":56,"combatLevel":60,"attackSpeed":4,"attackLevel":64,"strengthLevel":47,"defenceLevel":42},"1280":{"name":"Phrin Shade","hitpoints":56,"combatLevel":60,"attackSpeed":4,"attackLevel":64,"strengthLevel":47,"defenceLevel":42},"1281":{"name":"Riyl Shadow","hitpoints":76,"combatLevel":80,"attackSpeed":4,"attackLevel":88,"strengthLevel":55,"defenceLevel":60},"1282":{"name":"Riyl Shade","hitpoints":76,"combatLevel":80,"attackSpeed":4,"attackLevel":88,"strengthLevel":55,"defenceLevel":60},"1283":{"name":"Asyn Shadow","hitpoints":90,"combatLevel":100,"attackSpeed":4,"attackLevel":102,"strengthLevel":84,"defenceLevel":70},"1284":{"name":"Asyn Shade","hitpoints":90,"combatLevel":100,"attackSpeed":4,"attackLevel":102,"strengthLevel":84,"defenceLevel":70},"1285":{"name":"Fiyr Shadow","hitpoints":110,"combatLevel":120,"attackSpeed":6,"attackLevel":120,"strengthLevel":100,"defenceLevel":85},"1286":{"name":"Fiyr Shade","hitpoints":110,"combatLevel":120,"attackSpeed":6,"attackLevel":120,"strengthLevel":100,"defenceLevel":85},"1293":{"name":"Afflicted","hitpoints":30,"combatLevel":37,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"1294":{"name":"Afflicted","hitpoints":28,"combatLevel":34,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"1297":{"name":"Afflicted","hitpoints":26,"combatLevel":32,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"1298":{"name":"Afflicted","hitpoints":24,"combatLevel":30,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":34,"rangeLevel":1,"magicLevel":1},"1338":{"name":"Seagull","hitpoints":6,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1339":{"name":"Seagull","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1354":{"name":"Dwarf gang member","hitpoints":40,"combatLevel":44,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1355":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":48,"attackSpeed":5,"attackLevel":80,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1356":{"name":"Dwarf gang member","hitpoints":25,"combatLevel":49,"attackSpeed":5,"attackLevel":30,"strengthLevel":60,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"1362":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1364":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"1365":{"name":"Fire elemental","hitpoints":30,"combatLevel":35,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":20,"rangeLevel":20,"magicLevel":20},"1366":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10},"1367":{"name":"Earth elemental","hitpoints":35,"combatLevel":35,"attackSpeed":6,"attackLevel":20,"strengthLevel":35,"defenceLevel":35,"rangeLevel":30,"magicLevel":10,"poisonImmune":true,"venomImmune":true},"1369":{"name":"Air elemental","hitpoints":30,"combatLevel":34,"attackSpeed":4,"attackLevel":40,"strengthLevel":20,"defenceLevel":30,"rangeLevel":20,"magicLevel":40},"1370":{"name":"Water elemental","hitpoints":30,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":30,"magicLevel":30},"1377":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1378":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"1379":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1380":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1381":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1382":{"name":"Camp dweller","hitpoints":30,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":30,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"1383":{"name":"Camp dweller","hitpoints":25,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":25,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1401":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1402":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1403":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1404":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1405":{"name":"Dwarf","hitpoints":16,"combatLevel":10,"attackSpeed":5,"attackLevel":8,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1406":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1407":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1408":{"name":"Dwarf","hitpoints":10,"combatLevel":7,"attackSpeed":4,"attackLevel":6,"strengthLevel":6,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"1409":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1410":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1411":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1412":{"name":"Black Guard","hitpoints":30,"combatLevel":25,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"1429":{"name":"Foreman","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"slashDef":1,"crushDef":1},"1430":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"1432":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"1443":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"1447":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"1448":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"1461":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"1475":{"name":"Chompy bird","hitpoints":10,"combatLevel":6,"attackLevel":5,"strengthLevel":5,"defenceLevel":3},"1537":{"name":"Skeleton hero","hitpoints":124,"combatLevel":149,"attackSpeed":4,"attackLevel":145,"strengthLevel":134,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1538":{"name":"Skeleton brute","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1539":{"name":"Skeleton warlord","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1540":{"name":"Skeleton heavy","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1541":{"name":"Skeleton thug","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"1543":{"name":"Gargoyle","hitpoints":105,"combatLevel":111,"slayerLevel":75,"attackSpeed":4,"attackLevel":75,"strengthLevel":105,"defenceLevel":107,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":20,"magicDef":20},"1545":{"name":"Black knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"1546":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1547":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1548":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1549":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1550":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"1556":{"name":"Fire wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1557":{"name":"Water wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1558":{"name":"Earth wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1559":{"name":"Air wizard","hitpoints":25,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"magicLevel":10,"magicDef":15},"1603":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1604":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1605":{"name":"Kolodion","hitpoints":3,"attackSpeed":7},"1606":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1607":{"name":"Kolodion","hitpoints":65,"attackSpeed":7},"1608":{"name":"Kolodion","hitpoints":78,"attackSpeed":7},"1609":{"name":"Kolodion","hitpoints":107,"combatLevel":112,"attackSpeed":4,"attackLevel":85,"strengthLevel":98,"defenceLevel":105,"rangeLevel":1,"magicLevel":80},"1610":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1611":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1612":{"name":"Battle mage","hitpoints":120,"combatLevel":54,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":50},"1667":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4,"defenceLevel":25},"1668":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4,"defenceLevel":21},"1672":{"name":"Ahrim the Blighted","hitpoints":100,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":100,"magic":73,"stabDef":103,"slashDef":85,"crushDef":117,"magicDef":73,"bonusStrength":68},"1673":{"name":"Dharok the Wretched","hitpoints":100,"combatLevel":115,"attackSpeed":7,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":252,"slashDef":250,"crushDef":244,"rangeDef":249,"bonusStrength":105},"1674":{"name":"Guthan the Infested","hitpoints":100,"combatLevel":115,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":259,"slashDef":257,"crushDef":241,"rangeDef":250,"bonusStrength":75},"1675":{"name":"Karil the Tainted","hitpoints":100,"combatLevel":98,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":79,"slashDef":71,"crushDef":90,"rangeDef":100,"magicDef":106,"bonusRangeStrength":55},"1676":{"name":"Torag the Corrupted","hitpoints":100,"combatLevel":115,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":221,"slashDef":235,"crushDef":222,"rangeDef":221,"bonusStrength":72},"1677":{"name":"Verac the Defiled","hitpoints":100,"combatLevel":115,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":227,"slashDef":230,"crushDef":221,"rangeDef":225,"bonusStrength":72},"1678":{"name":"Bloodworm","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"1679":{"name":"Crypt rat","hitpoints":35,"combatLevel":43,"attackSpeed":4,"attackLevel":70,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"1680":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1681":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1682":{"name":"Giant crypt rat","hitpoints":70,"combatLevel":76,"attackSpeed":4,"attackLevel":80,"strengthLevel":50,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1683":{"name":"Crypt spider","hitpoints":45,"combatLevel":56,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"1684":{"name":"Giant crypt spider","hitpoints":80,"combatLevel":79,"attackSpeed":4,"attackLevel":65,"strengthLevel":67,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"1685":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"1686":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"1687":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"1688":{"name":"Skeleton","hitpoints":51,"combatLevel":77,"attackSpeed":4,"attackLevel":72,"strengthLevel":72,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"1689":{"name":"Splatter","hitpoints":13,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":33,"magicLevel":17},"1690":{"name":"Splatter","hitpoints":23,"combatLevel":33,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":53,"magicLevel":22},"1691":{"name":"Splatter","hitpoints":33,"combatLevel":44,"attackSpeed":4,"attackLevel":27,"strengthLevel":27,"defenceLevel":73,"magicLevel":27},"1692":{"name":"Splatter","hitpoints":43,"combatLevel":54,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":93,"magicLevel":32},"1693":{"name":"Splatter","hitpoints":53,"combatLevel":65,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":113,"magicLevel":37},"1694":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4,"attackLevel":47,"strengthLevel":37,"defenceLevel":23,"magicLevel":27},"1695":{"name":"Shifter","hitpoints":23,"combatLevel":38,"attackSpeed":4,"attackLevel":47,"strengthLevel":37,"defenceLevel":23,"magicLevel":27},"1696":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4,"attackLevel":67,"strengthLevel":52,"defenceLevel":38,"magicLevel":37},"1697":{"name":"Shifter","hitpoints":38,"combatLevel":57,"attackSpeed":4,"attackLevel":67,"strengthLevel":52,"defenceLevel":38,"magicLevel":37},"1698":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4,"attackLevel":87,"strengthLevel":67,"defenceLevel":53,"magicLevel":47},"1699":{"name":"Shifter","hitpoints":53,"combatLevel":76,"attackSpeed":4,"attackLevel":87,"strengthLevel":67,"defenceLevel":53,"magicLevel":47},"1700":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4,"attackLevel":100,"strengthLevel":75,"defenceLevel":68,"magicLevel":50},"1701":{"name":"Shifter","hitpoints":68,"combatLevel":90,"attackSpeed":4,"attackLevel":100,"strengthLevel":75,"defenceLevel":68,"magicLevel":50},"1702":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4,"attackLevel":110,"strengthLevel":83,"defenceLevel":83,"magicLevel":60},"1703":{"name":"Shifter","hitpoints":83,"combatLevel":104,"attackSpeed":4,"attackLevel":110,"strengthLevel":83,"defenceLevel":83,"magicLevel":60},"1704":{"name":"Ravager","hitpoints":23,"combatLevel":36,"attackSpeed":4,"attackLevel":27,"strengthLevel":57,"defenceLevel":13},"1705":{"name":"Ravager","hitpoints":38,"combatLevel":53,"attackSpeed":4,"attackLevel":37,"strengthLevel":82,"defenceLevel":23},"1706":{"name":"Ravager","hitpoints":53,"combatLevel":71,"attackSpeed":4,"attackLevel":47,"strengthLevel":107,"defenceLevel":33},"1707":{"name":"Ravager","hitpoints":68,"combatLevel":89,"attackSpeed":4,"attackLevel":57,"strengthLevel":132,"defenceLevel":43},"1708":{"name":"Ravager","hitpoints":83,"combatLevel":106,"attackSpeed":4,"attackLevel":67,"strengthLevel":157,"defenceLevel":53},"1709":{"name":"Spinner","hitpoints":33,"combatLevel":36,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":43,"magicLevel":37},"1710":{"name":"Spinner","hitpoints":53,"combatLevel":55,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":68,"magicLevel":52},"1711":{"name":"Spinner","hitpoints":73,"combatLevel":74,"attackSpeed":4,"attackLevel":27,"strengthLevel":27,"defenceLevel":93,"magicLevel":67},"1712":{"name":"Spinner","hitpoints":101,"combatLevel":92,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":118,"magicLevel":82},"1713":{"name":"Spinner","hitpoints":93,"combatLevel":88,"attackSpeed":4,"attackLevel":37,"strengthLevel":37,"defenceLevel":143,"magicLevel":37},"1714":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4,"defenceLevel":25,"magicLevel":46},"1715":{"name":"Torcher","hitpoints":18,"combatLevel":33,"attackSpeed":4,"defenceLevel":25,"magicLevel":46},"1716":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4,"defenceLevel":41,"magicLevel":66},"1717":{"name":"Torcher","hitpoints":30,"combatLevel":49,"attackSpeed":4,"defenceLevel":41,"magicLevel":66},"1718":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4,"defenceLevel":57,"magicLevel":85},"1719":{"name":"Torcher","hitpoints":45,"combatLevel":66,"attackSpeed":4,"defenceLevel":57,"magicLevel":85},"1720":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4,"defenceLevel":73,"magicLevel":97},"1721":{"name":"Torcher","hitpoints":57,"combatLevel":79,"attackSpeed":4,"defenceLevel":73,"magicLevel":97},"1722":{"name":"Torcher","hitpoints":71,"combatLevel":91,"attackSpeed":4,"defenceLevel":89,"magicLevel":107},"1723":{"name":"Torcher","hitpoints":71,"combatLevel":92,"attackSpeed":4,"defenceLevel":89,"magicLevel":107},"1724":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4,"defenceLevel":17,"rangeLevel":46},"1725":{"name":"Defiler","hitpoints":27,"combatLevel":33,"attackSpeed":4,"defenceLevel":17,"rangeLevel":46},"1726":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4,"defenceLevel":29,"rangeLevel":66},"1727":{"name":"Defiler","hitpoints":45,"combatLevel":50,"attackSpeed":4,"defenceLevel":29,"rangeLevel":66},"1728":{"name":"Defiler","hitpoints":62,"combatLevel":66,"attackSpeed":4,"defenceLevel":41,"rangeLevel":84},"1729":{"name":"Defiler","hitpoints":62,"combatLevel":67,"attackSpeed":4,"defenceLevel":41,"rangeLevel":85},"1730":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4,"defenceLevel":53,"rangeLevel":98},"1731":{"name":"Defiler","hitpoints":78,"combatLevel":80,"attackSpeed":4,"defenceLevel":53,"rangeLevel":98},"1732":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4,"defenceLevel":65,"rangeLevel":117},"1733":{"name":"Defiler","hitpoints":97,"combatLevel":97,"attackSpeed":4,"defenceLevel":65,"rangeLevel":117},"1734":{"name":"Brawler","hitpoints":53,"combatLevel":51,"attackSpeed":4,"attackLevel":27,"strengthLevel":57,"defenceLevel":43},"1735":{"name":"Brawler","hitpoints":83,"combatLevel":76,"attackSpeed":4,"attackLevel":37,"strengthLevel":82,"defenceLevel":67},"1736":{"name":"Brawler","hitpoints":113,"combatLevel":101,"attackSpeed":4,"attackLevel":47,"strengthLevel":107,"defenceLevel":93},"1737":{"name":"Brawler","hitpoints":143,"combatLevel":129,"attackSpeed":4,"attackLevel":67,"strengthLevel":132,"defenceLevel":118},"1738":{"name":"Brawler","hitpoints":173,"combatLevel":158,"attackSpeed":4,"attackLevel":87,"strengthLevel":157,"defenceLevel":143},"1739":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1740":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1741":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1742":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1743":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1744":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1745":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1746":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1747":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1748":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1749":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1750":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1751":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1752":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1753":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1754":{"name":"Portal","defenceLevel":85,"rangeDef":70,"magicDef":70},"1777":{"name":"Double agent","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":80,"strengthLevel":43,"defenceLevel":24,"rangeLevel":1,"magicLevel":24,"stabDef":3,"slashDef":3,"crushDef":3},"1778":{"name":"Double agent","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"1782":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"1792":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1793":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1794":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1795":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1796":{"name":"Goat","hitpoints":21,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1797":{"name":"Billy Goat","hitpoints":28,"combatLevel":33,"attackSpeed":4,"attackLevel":31,"strengthLevel":29,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"rangeDef":10,"bonusAttack":29,"bonusStrength":10},"1798":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1799":{"name":"White Knight","hitpoints":52,"combatLevel":38,"attackSpeed":7,"attackLevel":30,"strengthLevel":29,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1800":{"name":"White Knight","hitpoints":52,"combatLevel":39,"attackSpeed":7,"attackLevel":32,"strengthLevel":29,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1829":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"1834":{"name":"Gorak","hitpoints":112,"combatLevel":145,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":131,"rangeLevel":1,"magicLevel":1},"1838":{"name":"Duck","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1839":{"name":"Duck","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1845":{"name":"Stag","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"1852":{"name":"Rabbit","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1853":{"name":"Rabbit","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"1861":{"name":"Tree spirit","hitpoints":25,"combatLevel":14,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":8,"rangeLevel":1,"magicLevel":1},"1862":{"name":"Tree spirit","hitpoints":40,"combatLevel":29,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"1863":{"name":"Tree spirit","hitpoints":60,"combatLevel":49,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"1864":{"name":"Tree spirit","hitpoints":86,"combatLevel":79,"attackSpeed":4,"attackLevel":64,"strengthLevel":64,"defenceLevel":64,"rangeLevel":1,"magicLevel":1},"1865":{"name":"Tree spirit","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"1866":{"name":"Tree spirit","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"1870":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"1871":{"name":"Baby black dragon","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"1872":{"name":"Baby black dragon","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"1874":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1875":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1876":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"1877":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"2001":{"name":"Duckling","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2005":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"2006":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"2007":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"2008":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"2018":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"2025":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"2026":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"2027":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"2028":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"2029":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"2030":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"2031":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"2032":{"name":"Greater demon","hitpoints":89,"combatLevel":92,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"2042":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":50,"bonusRangeStrength":20,"bonusMagicDamage":20},"2043":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"rangeDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2044":{"name":"Zulrah","hitpoints":500,"combatLevel":725,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":300,"rangeLevel":300,"magicLevel":300,"range":50,"magic":50,"magicDef":300,"bonusRangeStrength":20,"bonusMagicDamage":20},"2045":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":140,"strengthLevel":138,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusAttack":120},"2046":{"name":"Snakeling","hitpoints":1,"combatLevel":90,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":185,"bonusAttack":120},"2048":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"2049":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"2050":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"2051":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"2052":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"2054":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"2056":{"name":"Dark wizard","hitpoints":25,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":20,"rangeLevel":1,"magicLevel":25,"magicDef":5},"2057":{"name":"Dark wizard","hitpoints":24,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":15,"rangeLevel":1,"magicLevel":25,"magicDef":5},"2058":{"name":"Dark wizard","hitpoints":15,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"magicDef":5},"2059":{"name":"Dark wizard","hitpoints":15,"combatLevel":11,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"magicDef":5},"2062":{"name":"Oomlie bird","hitpoints":40,"combatLevel":46,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2063":{"name":"Penguin","hitpoints":4,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":2,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2064":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2065":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2066":{"name":"Terrorbird","hitpoints":34,"combatLevel":28,"attackSpeed":6,"attackLevel":23,"strengthLevel":23,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2067":{"name":"Mounted terrorbird gnome","hitpoints":36,"combatLevel":31,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15},"2068":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15,"bonusRangeStrength":2},"2075":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2076":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2077":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2078":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2079":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2080":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2081":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2082":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2083":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2084":{"name":"Fire giant","hitpoints":111,"combatLevel":86,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2085":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2086":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2087":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2088":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2089":{"name":"Ice giant","hitpoints":70,"combatLevel":53,"attackSpeed":5,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"2090":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2091":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2092":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2093":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"2094":{"name":"Jogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2095":{"name":"Ogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2096":{"name":"Ogre","hitpoints":60,"combatLevel":53,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"2097":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2098":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2099":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2100":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2101":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2102":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2103":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"2115":{"name":"Thing under the bed","hitpoints":25,"attackSpeed":4},"2120":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"2137":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2138":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2139":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2140":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2141":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2142":{"name":"Cyclops","hitpoints":150,"combatLevel":106,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"2145":{"name":"Undead Druid","hitpoints":140,"combatLevel":105,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"magicLevel":115,"magic":100,"stabDef":40,"slashDef":30,"crushDef":80,"rangeDef":40,"magicDef":140,"bonusAttack":50,"bonusStrength":50,"bonusMagicDamage":50},"2154":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2155":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2156":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2157":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2158":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2159":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2160":{"name":"TzHaar-Mej","hitpoints":100,"combatLevel":103,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":120},"2161":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2162":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2163":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2164":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2165":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2166":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"2167":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2168":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2169":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2170":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2171":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2172":{"name":"TzHaar-Xil","hitpoints":120,"combatLevel":133,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":100,"rangeLevel":120,"magicLevel":40},"2173":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2174":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2175":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2176":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2177":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2178":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2179":{"name":"TzHaar-Ket","hitpoints":140,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"2189":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":30,"magicLevel":15},"2190":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":30,"magicLevel":15},"2191":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":60,"magicLevel":30},"2192":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":60,"magicLevel":30},"2193":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2194":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"2205":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2206":{"name":"Starlight","hitpoints":160,"combatLevel":149,"attackSpeed":5,"attackLevel":120,"strengthLevel":125,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":60,"bonusStrength":10},"2207":{"name":"Growler","hitpoints":146,"combatLevel":139,"attackSpeed":5,"attackLevel":100,"strengthLevel":101,"defenceLevel":120,"rangeLevel":1,"magicLevel":150,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2208":{"name":"Bree","hitpoints":162,"combatLevel":146,"attackSpeed":5,"attackLevel":110,"strengthLevel":80,"defenceLevel":130,"rangeLevel":150,"magicLevel":80,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":5,"magicDef":18,"bonusAttack":10,"bonusStrength":7},"2209":{"name":"Saradomin priest","hitpoints":89,"combatLevel":113,"attackSpeed":5,"attackLevel":120,"strengthLevel":46,"defenceLevel":120,"rangeLevel":1,"magicLevel":125,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":5},"2210":{"name":"Spiritual warrior","hitpoints":110,"combatLevel":125,"slayerLevel":68,"attackSpeed":5,"attackLevel":110,"strengthLevel":106,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":9,"bonusStrength":6},"2211":{"name":"Spiritual ranger","hitpoints":106,"combatLevel":122,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":146,"magicLevel":1,"stabDef":3,"slashDef":5,"crushDef":13,"rangeDef":23,"magicDef":16},"2212":{"name":"Spiritual mage","hitpoints":85,"combatLevel":120,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":86,"rangeLevel":1,"magicLevel":160,"stabDef":8,"slashDef":7,"crushDef":3,"rangeDef":2,"magicDef":16},"2213":{"name":"Knight of Saradomin","hitpoints":135,"combatLevel":103,"attackSpeed":6,"attackLevel":70,"strengthLevel":85,"defenceLevel":70,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":10,"crushDef":7,"rangeDef":13,"bonusAttack":8,"bonusStrength":8},"2214":{"name":"Knight of Saradomin","hitpoints":108,"combatLevel":101,"attackSpeed":6,"attackLevel":75,"strengthLevel":90,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"bonusAttack":13,"bonusStrength":11},"2215":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"2216":{"name":"Sergeant Strongstack","hitpoints":128,"combatLevel":141,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14},"2217":{"name":"Sergeant Steelwill","hitpoints":127,"combatLevel":142,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":150,"rangeLevel":1,"magicLevel":150,"bonusStrength":6},"2218":{"name":"Sergeant Grimspike","hitpoints":146,"combatLevel":142,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":132,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20},"2232":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"2233":{"name":"Ogre","hitpoints":70,"combatLevel":58,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":21},"2234":{"name":"Jogre","hitpoints":70,"combatLevel":58,"attackSpeed":6,"attackLevel":46,"strengthLevel":48,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusStrength":21},"2235":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2236":{"name":"Cyclops","hitpoints":110,"combatLevel":81,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22},"2237":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2238":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2239":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2240":{"name":"Ork","hitpoints":110,"combatLevel":107,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4},"2241":{"name":"Hobgoblin","hitpoints":52,"combatLevel":47,"attackSpeed":4,"attackLevel":39,"strengthLevel":39,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2242":{"name":"Spiritual ranger","hitpoints":131,"combatLevel":115,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":96,"rangeLevel":121,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5},"2243":{"name":"Spiritual warrior","hitpoints":131,"combatLevel":134,"slayerLevel":68,"attackSpeed":5,"attackLevel":116,"strengthLevel":120,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":29,"bonusStrength":13},"2244":{"name":"Spiritual mage","hitpoints":106,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":103,"rangeLevel":1,"magicLevel":142,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":35},"2245":{"name":"Goblin","hitpoints":18,"combatLevel":17,"attackSpeed":4,"attackLevel":14,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"2246":{"name":"Goblin","hitpoints":3,"combatLevel":12,"attackSpeed":4,"attackLevel":15,"strengthLevel":6,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2247":{"name":"Goblin","hitpoints":15,"combatLevel":12,"attackSpeed":4,"attackLevel":12,"strengthLevel":6,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2248":{"name":"Goblin","hitpoints":16,"combatLevel":15,"attackSpeed":4,"attackLevel":16,"strengthLevel":6,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"2249":{"name":"Goblin","hitpoints":13,"combatLevel":13,"attackSpeed":4,"attackLevel":11,"strengthLevel":6,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2259":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"2261":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"2264":{"name":"Dagannoth fledgeling","hitpoints":100,"combatLevel":70,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"2265":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"2266":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"2267":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"2316":{"name":"Guard","hitpoints":26,"combatLevel":26,"attackSpeed":6,"attackLevel":25,"strengthLevel":18,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":16,"crushDef":19,"rangeDef":12},"2317":{"name":"Guard","hitpoints":26,"combatLevel":24,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"2423":{"name":"Chaos dwarf","hitpoints":61,"combatLevel":48,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":34,"crushDef":25,"rangeDef":35,"magicDef":10,"bonusAttack":13,"bonusStrength":9},"2450":{"name":"Animated Bronze Armour","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2451":{"name":"Animated Iron Armour","hitpoints":20,"combatLevel":23,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2452":{"name":"Animated Steel Armour","hitpoints":40,"combatLevel":46,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2453":{"name":"Animated Black Armour","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2454":{"name":"Animated Mithril Armour","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2455":{"name":"Animated Adamant Armour","hitpoints":99,"combatLevel":113,"attackSpeed":4,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2456":{"name":"Animated Rune Armour","hitpoints":120,"combatLevel":138,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":25,"crushDef":19,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5},"2463":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2464":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2465":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2466":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2467":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2468":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"2474":{"name":"Catablepon","hitpoints":40,"combatLevel":49,"attackSpeed":4,"attackLevel":45,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":40,"slashDef":30,"crushDef":20,"rangeDef":40,"magicDef":20},"2475":{"name":"Catablepon","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":45,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2476":{"name":"Catablepon","hitpoints":50,"combatLevel":68,"attackSpeed":4,"attackLevel":65,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"stabDef":50,"slashDef":40,"crushDef":30,"rangeDef":50,"magicDef":30},"2477":{"name":"Giant spider","hitpoints":50,"combatLevel":50,"attackSpeed":4,"attackLevel":41,"strengthLevel":51,"defenceLevel":31,"rangeLevel":1,"magicLevel":1},"2478":{"name":"Spider","hitpoints":22,"combatLevel":24,"attackSpeed":6,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":53,"slashDef":53,"crushDef":53,"rangeDef":53,"magicDef":53,"bonusAttack":35,"bonusStrength":58},"2479":{"name":"Scorpion","hitpoints":55,"combatLevel":59,"attackSpeed":4,"attackLevel":50,"strengthLevel":52,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":55},"2480":{"name":"Scorpion","hitpoints":37,"combatLevel":37,"attackSpeed":4,"attackLevel":31,"strengthLevel":32,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":15,"crushDef":15,"rangeDef":35,"magicDef":30},"2481":{"name":"Minotaur","hitpoints":10,"combatLevel":12,"attackSpeed":4,"attackLevel":12,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2483":{"name":"Minotaur","hitpoints":22,"combatLevel":27,"attackSpeed":4,"attackLevel":23,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"2484":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2485":{"name":"Goblin","hitpoints":16,"combatLevel":13,"attackSpeed":4,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2486":{"name":"Goblin","hitpoints":7,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":3,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"2487":{"name":"Goblin","hitpoints":22,"combatLevel":16,"attackSpeed":4,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2488":{"name":"Goblin","hitpoints":26,"combatLevel":25,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"2489":{"name":"Goblin","hitpoints":22,"combatLevel":16,"attackSpeed":4,"attackLevel":13,"strengthLevel":11,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":22},"2490":{"name":"Wolf","hitpoints":15,"combatLevel":14,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2491":{"name":"Wolf","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2492":{"name":"Rat","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2498":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":28,"attackSpeed":3,"attackLevel":60,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2499":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":80,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2500":{"name":"Flesh Crawler","hitpoints":25,"combatLevel":41,"attackSpeed":3,"attackLevel":100,"strengthLevel":2,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15,"magicDef":15},"2501":{"name":"Zombie","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2502":{"name":"Zombie","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2503":{"name":"Zombie","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"2504":{"name":"Zombie","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2505":{"name":"Zombie","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2506":{"name":"Zombie","hitpoints":40,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2507":{"name":"Zombie","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"2508":{"name":"Zombie","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"2509":{"name":"Zombie","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"2510":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2511":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2512":{"name":"Giant rat","hitpoints":25,"combatLevel":26,"attackSpeed":4,"attackLevel":22,"strengthLevel":23,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"2513":{"name":"Rat","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2514":{"name":"Ankou","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"2515":{"name":"Ankou","hitpoints":65,"combatLevel":82,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"2516":{"name":"Ankou","hitpoints":70,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"2517":{"name":"Ankou","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"2518":{"name":"Ankou","hitpoints":65,"combatLevel":82,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"2519":{"name":"Ankou","hitpoints":70,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"2520":{"name":"Skeleton","hitpoints":70,"combatLevel":68,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35},"2521":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35},"2522":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35},"2523":{"name":"Skeleton","hitpoints":70,"combatLevel":60,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"rangeDef":35},"2524":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14},"2525":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14},"2526":{"name":"Skeleton","hitpoints":77,"combatLevel":85,"attackSpeed":4,"attackLevel":74,"strengthLevel":74,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"stabDef":79,"slashDef":31,"crushDef":20,"rangeDef":70,"magicDef":5,"bonusAttack":15,"bonusStrength":14},"2527":{"name":"Ghost","hitpoints":80,"combatLevel":77,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":55,"slashDef":55,"crushDef":5,"rangeDef":55,"magicDef":55},"2528":{"name":"Ghost","hitpoints":80,"combatLevel":77,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":55,"slashDef":55,"crushDef":5,"rangeDef":55,"magicDef":55},"2529":{"name":"Ghost","hitpoints":80,"combatLevel":77,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":55,"slashDef":55,"crushDef":5,"rangeDef":55,"magicDef":55},"2530":{"name":"Ghost","hitpoints":80,"combatLevel":77,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":55,"slashDef":55,"crushDef":5,"rangeDef":55,"magicDef":55},"2531":{"name":"Ghost","hitpoints":75,"combatLevel":76,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45},"2532":{"name":"Ghost","hitpoints":75,"combatLevel":76,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45},"2533":{"name":"Ghost","hitpoints":75,"combatLevel":76,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45},"2534":{"name":"Ghost","hitpoints":75,"combatLevel":76,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":5,"rangeDef":45},"2536":{"name":"H.A.M. Guard","hitpoints":15,"combatLevel":12,"attackSpeed":7,"attackLevel":8,"strengthLevel":12,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"2537":{"name":"H.A.M. Guard","hitpoints":20,"combatLevel":18,"attackSpeed":6,"attackLevel":14,"strengthLevel":18,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":6,"rangeDef":6},"2538":{"name":"H.A.M. Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"2579":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2584":{"name":"Abyssal leech","hitpoints":10,"combatLevel":41,"attackSpeed":2,"attackLevel":95,"strengthLevel":5,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":100,"rangeDef":10,"magicDef":50,"bonusAttack":100,"bonusStrength":10},"2585":{"name":"Abyssal guardian","hitpoints":55,"combatLevel":59,"attackSpeed":4,"attackLevel":30,"strengthLevel":90,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":150,"bonusAttack":15,"bonusStrength":5},"2586":{"name":"Abyssal walker","hitpoints":95,"combatLevel":81,"attackSpeed":5,"attackLevel":5,"strengthLevel":100,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":75,"slashDef":75,"crushDef":10,"rangeDef":75,"magicDef":75,"bonusAttack":5,"bonusStrength":10},"2592":{"name":"Mogre","hitpoints":48,"combatLevel":60,"slayerLevel":32,"attackSpeed":6,"attackLevel":58,"strengthLevel":55,"defenceLevel":48,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"2593":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2594":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2595":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2596":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2597":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2598":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2599":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2600":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2601":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2602":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2603":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2604":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2605":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2606":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2607":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2608":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2609":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2610":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2611":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2612":{"name":"Werewolf","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"magicDef":60},"2613":{"name":"Boris","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2614":{"name":"Imre","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2615":{"name":"Yuri","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2616":{"name":"Joseph","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2617":{"name":"Nikolai","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2618":{"name":"Eduard","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2619":{"name":"Lev","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2620":{"name":"Georgy","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2621":{"name":"Svetlana","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2622":{"name":"Irina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2623":{"name":"Alexis","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2624":{"name":"Milla","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2625":{"name":"Galina","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2626":{"name":"Sofiya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2627":{"name":"Ksenia","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2628":{"name":"Yadviga","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2629":{"name":"Nikita","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2630":{"name":"Vera","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2631":{"name":"Zoja","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2632":{"name":"Liliya","hitpoints":60,"combatLevel":24,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2634":{"name":"Myre Blamish Snail","hitpoints":8,"combatLevel":9,"attackSpeed":4,"defenceLevel":22,"rangeLevel":5,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2645":{"name":"Blood Blamish Snail","hitpoints":13,"combatLevel":20,"attackSpeed":6,"defenceLevel":45,"rangeLevel":12,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2646":{"name":"Ochre Blamish Snail","hitpoints":10,"combatLevel":10,"attackSpeed":6,"defenceLevel":18,"rangeLevel":7,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2647":{"name":"Bruise Blamish Snail","hitpoints":12,"combatLevel":20,"attackSpeed":6,"defenceLevel":40,"rangeLevel":15,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2648":{"name":"Bark Blamish Snail","hitpoints":22,"combatLevel":15,"attackSpeed":6,"defenceLevel":20,"rangeLevel":10,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":30,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2649":{"name":"Myre Blamish Snail","hitpoints":13,"combatLevel":10,"attackSpeed":4,"defenceLevel":12,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2650":{"name":"Blood Blamish Snail","hitpoints":10,"combatLevel":20,"attackSpeed":6,"defenceLevel":30,"rangeLevel":21,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"bonusAttack":10,"bonusStrength":10},"2651":{"name":"Ochre Blamish Snail","hitpoints":20,"combatLevel":15,"attackSpeed":6,"defenceLevel":25,"rangeLevel":8,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2652":{"name":"Bruise Blamish Snail","hitpoints":15,"combatLevel":20,"attackSpeed":6,"defenceLevel":27,"rangeLevel":20,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":50,"magicDef":5,"bonusAttack":10,"bonusStrength":10},"2790":{"name":"Cow","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2791":{"name":"Cow","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2792":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2793":{"name":"Cow","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2794":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2795":{"name":"Cow","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"2801":{"name":"Cow calf","hitpoints":6,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2804":{"name":"Chicken","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2805":{"name":"Chicken","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2806":{"name":"Chicken","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2827":{"name":"Bat","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"2834":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"2837":{"name":"Unicorn","hitpoints":19,"combatLevel":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"2838":{"name":"Grizzly bear","hitpoints":27,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"2839":{"name":"Black bear","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":16,"defenceLevel":13},"2840":{"name":"Earth warrior","hitpoints":54,"combatLevel":51,"attackSpeed":4,"attackLevel":42,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2841":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2842":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2843":{"name":"Otherworldly being","hitpoints":66,"combatLevel":64,"attackSpeed":4,"attackLevel":56,"strengthLevel":56,"defenceLevel":46,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":20,"rangeDef":15},"2844":{"name":"Magic axe","hitpoints":44,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"2845":{"name":"Snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"2848":{"name":"Monkey","hitpoints":6,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2849":{"name":"Black unicorn","hitpoints":29,"combatLevel":27,"attackSpeed":4,"attackLevel":21,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1},"2851":{"name":"Ice warrior","hitpoints":59,"combatLevel":57,"attackSpeed":4,"attackLevel":47,"strengthLevel":47,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"2853":{"name":"Shadow warrior","hitpoints":67,"combatLevel":48,"attackSpeed":4,"attackLevel":36,"strengthLevel":36,"defenceLevel":33,"stabDef":43,"slashDef":31,"crushDef":19,"rangeDef":38,"magicDef":15,"bonusAttack":20,"bonusStrength":26},"2854":{"name":"Rat","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2855":{"name":"Rat","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2856":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2857":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2858":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2859":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2860":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2861":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2862":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2863":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2864":{"name":"Giant rat","hitpoints":10,"combatLevel":6,"attackSpeed":4,"attackLevel":6,"strengthLevel":5,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2865":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2866":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2867":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"2916":{"name":"Waterfiend","hitpoints":128,"combatLevel":115,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2917":{"name":"Waterfiend","hitpoints":128,"combatLevel":115,"attackSpeed":4,"defenceLevel":128,"rangeLevel":105,"magicLevel":105,"stabDef":100,"slashDef":100,"crushDef":10,"rangeDef":100,"magicDef":100,"poisonImmune":true,"venomImmune":true},"2918":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true},"2919":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"poisonImmune":true,"venomImmune":true},"2920":{"name":"Confused barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"2921":{"name":"Lost barbarian","hitpoints":124,"combatLevel":132,"attackSpeed":4,"attackLevel":115,"strengthLevel":114,"defenceLevel":110,"rangeLevel":1,"magicLevel":1},"2946":{"name":"Nail beast","hitpoints":55,"combatLevel":69,"attackSpeed":8,"attackLevel":150,"strengthLevel":6,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"2947":{"name":"Nail beast","hitpoints":65,"combatLevel":98,"attackSpeed":8,"attackLevel":215,"strengthLevel":16,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"2948":{"name":"Nail beast","hitpoints":75,"combatLevel":141,"attackSpeed":8,"attackLevel":320,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"2954":{"name":"Zamorak wizard","hitpoints":73,"combatLevel":65,"attackSpeed":4,"attackLevel":24,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":80,"magicDef":3},"2955":{"name":"Saradomin wizard","hitpoints":120,"combatLevel":108,"attackSpeed":4,"attackLevel":100,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":80,"magicDef":30,"bonusAttack":40,"bonusStrength":40},"2978":{"name":"Big Snake","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"2992":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2993":{"name":"Undead chicken","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"2994":{"name":"Giant lobster","hitpoints":32,"combatLevel":32,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":5,"rangeDef":5},"2999":{"name":"Tortured soul","hitpoints":51,"combatLevel":59,"attackSpeed":4,"attackLevel":52,"strengthLevel":62,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"3010":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3011":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3014":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3015":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3016":{"name":"Shadow spider","hitpoints":55,"combatLevel":52,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":15,"crushDef":10,"rangeDef":15,"magicDef":15},"3017":{"name":"Giant spider","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3018":{"name":"Giant spider","hitpoints":32,"combatLevel":27,"attackSpeed":4,"attackLevel":20,"strengthLevel":24,"defenceLevel":21,"rangeLevel":1,"magicLevel":1},"3019":{"name":"Spider","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3020":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"3021":{"name":"Deadly red spider","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"3022":{"name":"Ice spider","hitpoints":65,"combatLevel":61,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":12,"rangeDef":13,"magicDef":13},"3023":{"name":"Poison spider","hitpoints":64,"combatLevel":64,"attackSpeed":6,"attackLevel":50,"strengthLevel":52,"defenceLevel":58,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":10,"rangeDef":14,"magicDef":14},"3024":{"name":"Scorpion","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":11,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3025":{"name":"Poison Scorpion","hitpoints":23,"combatLevel":20,"attackSpeed":4,"attackLevel":16,"strengthLevel":17,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3026":{"name":"Pit Scorpion","hitpoints":32,"combatLevel":28,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"slashDef":5,"crushDef":5},"3027":{"name":"King Scorpion","hitpoints":30,"combatLevel":32,"attackSpeed":4,"attackLevel":30,"strengthLevel":29,"defenceLevel":23,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"3028":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3029":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3030":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3031":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3032":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3033":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3034":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3035":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3036":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3037":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3038":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3039":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3040":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3041":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3042":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3043":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3044":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3045":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3046":{"name":"Goblin","hitpoints":16,"combatLevel":13,"attackSpeed":4,"attackLevel":12,"strengthLevel":13,"defenceLevel":7,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":8,"rangeDef":4,"magicDef":4},"3047":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3048":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3049":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3050":{"name":"Hobgoblin","hitpoints":49,"combatLevel":42,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":36,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":10},"3051":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3052":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3053":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3054":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3055":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3056":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3057":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3058":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3059":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3060":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3061":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3062":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3064":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3065":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3066":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3067":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3068":{"name":"Barbarian","hitpoints":24,"combatLevel":15,"attackSpeed":4,"attackLevel":15,"strengthLevel":3,"defenceLevel":10,"rangeLevel":15,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3069":{"name":"Barbarian","hitpoints":24,"combatLevel":17,"attackSpeed":4,"attackLevel":15,"strengthLevel":14,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3070":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3071":{"name":"Barbarian","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"3072":{"name":"Barbarian","hitpoints":20,"combatLevel":9,"attackSpeed":4,"attackLevel":6,"strengthLevel":7,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":10,"crushDef":10,"rangeDef":5,"bonusAttack":9,"bonusStrength":16},"3073":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3074":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3075":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3076":{"name":"Goblin","hitpoints":12,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":12},"3106":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3107":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3108":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3109":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3110":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3111":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3112":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3113":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3114":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":6,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3116":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":30,"magicLevel":15},"3117":{"name":"Tz-Kih","hitpoints":10,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":30,"magicLevel":15},"3118":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":60,"magicLevel":30},"3119":{"name":"Tz-Kek","hitpoints":20,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":60,"defenceLevel":30,"rangeLevel":60,"magicLevel":30},"3120":{"name":"Tz-Kek","hitpoints":10,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":30,"defenceLevel":15,"rangeLevel":30,"magicLevel":15},"3121":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3122":{"name":"Tok-Xil","hitpoints":40,"combatLevel":90,"attackSpeed":4,"attackLevel":80,"strengthLevel":120,"defenceLevel":60,"rangeLevel":120,"magicLevel":60},"3123":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3124":{"name":"Yt-MejKot","hitpoints":80,"combatLevel":180,"attackSpeed":4,"attackLevel":160,"strengthLevel":240,"defenceLevel":120,"rangeLevel":240,"magicLevel":120},"3125":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3126":{"name":"Ket-Zek","hitpoints":160,"combatLevel":360,"attackSpeed":4,"attackLevel":320,"strengthLevel":480,"defenceLevel":240,"rangeLevel":480,"magicLevel":240,"magic":60},"3127":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"3128":{"name":"Yt-HurKot","hitpoints":60,"combatLevel":108,"attackSpeed":4,"attackLevel":140,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":120,"rangeDef":100,"magicDef":100},"3129":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31},"3130":{"name":"Tstanon Karlak","hitpoints":142,"combatLevel":145,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":125,"rangeLevel":50,"magicLevel":50,"bonusStrength":14},"3131":{"name":"Zakl'n Gritch","hitpoints":150,"combatLevel":142,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":127,"rangeLevel":150,"magicLevel":50,"range":20,"bonusRangeStrength":20},"3132":{"name":"Balfrug Kreeyath","hitpoints":161,"combatLevel":151,"attackSpeed":5,"attackLevel":115,"strengthLevel":60,"defenceLevel":153,"rangeLevel":1,"magicLevel":150,"magicDef":10},"3133":{"name":"Hellhound","hitpoints":116,"combatLevel":127,"attackSpeed":4,"attackLevel":107,"strengthLevel":116,"defenceLevel":106,"rangeLevel":1,"magicLevel":1},"3134":{"name":"Imp","hitpoints":10,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"3135":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3136":{"name":"Werewolf","hitpoints":92,"combatLevel":93,"attackSpeed":4,"attackLevel":77,"strengthLevel":76,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"3137":{"name":"Feral Vampyre","hitpoints":60,"combatLevel":77,"attackSpeed":4,"attackLevel":65,"strengthLevel":66,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3138":{"name":"Bloodveld","hitpoints":134,"combatLevel":81,"slayerLevel":50,"attackSpeed":4,"attackLevel":80,"strengthLevel":46,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3139":{"name":"Pyrefiend","hitpoints":48,"combatLevel":48,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":36,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"3140":{"name":"Icefiend","hitpoints":20,"combatLevel":18,"attackSpeed":4,"attackLevel":12,"strengthLevel":16,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3141":{"name":"Gorak","hitpoints":128,"combatLevel":149,"attackSpeed":4,"attackLevel":133,"strengthLevel":126,"defenceLevel":135,"rangeLevel":1,"magicLevel":1},"3159":{"name":"Spiritual warrior","hitpoints":100,"combatLevel":115,"slayerLevel":68,"attackSpeed":5,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"3160":{"name":"Spiritual ranger","hitpoints":120,"combatLevel":118,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":140,"magicLevel":1},"3161":{"name":"Spiritual mage","hitpoints":75,"combatLevel":121,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":61,"rangeLevel":1,"magicLevel":180},"3162":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"3163":{"name":"Wingman Skree","hitpoints":121,"combatLevel":143,"attackSpeed":5,"attackLevel":80,"strengthLevel":50,"defenceLevel":160,"rangeLevel":100,"magicLevel":150,"bonusAttack":45,"bonusStrength":25},"3164":{"name":"Flockleader Geerin","hitpoints":132,"combatLevel":149,"attackSpeed":5,"attackLevel":80,"strengthLevel":80,"defenceLevel":175,"rangeLevel":150,"magicLevel":50,"range":60,"bonusRangeStrength":35},"3165":{"name":"Flight Kilisa","hitpoints":133,"combatLevel":159,"attackSpeed":5,"attackLevel":124,"strengthLevel":118,"defenceLevel":175,"rangeLevel":169,"magicLevel":50,"bonusStrength":14},"3166":{"name":"Spiritual warrior","hitpoints":98,"combatLevel":123,"slayerLevel":68,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":141,"magicLevel":1,"stabDef":23,"slashDef":25,"crushDef":13,"rangeDef":35,"magicDef":35},"3167":{"name":"Spiritual ranger","hitpoints":89,"combatLevel":127,"slayerLevel":63,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":130,"rangeLevel":150,"magicLevel":1,"stabDef":17,"slashDef":16,"crushDef":8,"rangeDef":41,"magicDef":35},"3168":{"name":"Spiritual mage","hitpoints":75,"combatLevel":123,"slayerLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":111,"rangeLevel":1,"magicLevel":150,"stabDef":9,"slashDef":12,"crushDef":5,"rangeDef":28,"magicDef":45},"3169":{"name":"Aviansie","hitpoints":70,"combatLevel":69,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":71,"magicLevel":1},"3170":{"name":"Aviansie","hitpoints":83,"combatLevel":79,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":85,"magicLevel":1},"3171":{"name":"Aviansie","hitpoints":86,"combatLevel":84,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":93,"magicLevel":1},"3172":{"name":"Aviansie","hitpoints":86,"combatLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":76,"magicLevel":1},"3173":{"name":"Aviansie","hitpoints":95,"combatLevel":92,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":90,"magicLevel":1},"3174":{"name":"Aviansie","hitpoints":98,"combatLevel":97,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":99,"magicLevel":1},"3175":{"name":"Aviansie","hitpoints":124,"combatLevel":137,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":136,"magicLevel":1},"3176":{"name":"Aviansie","hitpoints":139,"combatLevel":148,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":151,"magicLevel":1},"3177":{"name":"Aviansie","hitpoints":63,"combatLevel":71,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":86,"magicLevel":1},"3178":{"name":"Aviansie","hitpoints":67,"combatLevel":73,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":89,"magicLevel":1},"3179":{"name":"Aviansie","hitpoints":77,"combatLevel":79,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":55,"rangeLevel":96,"magicLevel":1},"3180":{"name":"Aviansie","hitpoints":69,"combatLevel":89,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":89,"magicLevel":1},"3181":{"name":"Aviansie","hitpoints":75,"combatLevel":94,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":96,"magicLevel":1},"3182":{"name":"Aviansie","hitpoints":79,"combatLevel":97,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":115,"rangeLevel":101,"magicLevel":1},"3183":{"name":"Aviansie","hitpoints":115,"combatLevel":131,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":175,"rangeLevel":143,"magicLevel":1},"3184":{"name":"Dagannoth spawn","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":50,"strengthLevel":35,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3185":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"3233":{"name":"Leech","hitpoints":45,"combatLevel":52,"attackSpeed":4,"attackLevel":80,"strengthLevel":20,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3234":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"3237":{"name":"Feral Vampyre","hitpoints":40,"combatLevel":61,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":55,"rangeLevel":1,"magicLevel":40},"3243":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":6,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3244":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":6,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3245":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":6,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3250":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":6,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3251":{"name":"Farmer","hitpoints":12,"combatLevel":7,"attackSpeed":6,"attackLevel":3,"strengthLevel":4,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":6},"3252":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3253":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"3254":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3257":{"name":"Wizard","hitpoints":14,"combatLevel":9,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":5,"rangeLevel":1,"magicLevel":10,"magicDef":3},"3258":{"name":"Druid","hitpoints":30,"combatLevel":33,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":32,"rangeLevel":1,"magicLevel":25},"3260":{"name":"Warrior woman","hitpoints":20,"combatLevel":24,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"range":6,"magic":6,"stabDef":40,"slashDef":41,"crushDef":37,"rangeDef":38,"bonusAttack":6,"bonusStrength":7},"3261":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3262":{"name":"Barbarian","hitpoints":14,"combatLevel":8,"attackSpeed":6,"attackLevel":6,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":8,"bonusStrength":10},"3263":{"name":"Drunken man","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":3,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3264":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3265":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3268":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3269":{"name":"Guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"3270":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":6,"bonusStrength":10,"bonusRangeStrength":10},"3271":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":6,"bonusStrength":10},"3272":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":6,"bonusStrength":10},"3273":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":6,"bonusStrength":10},"3274":{"name":"Guard","hitpoints":22,"combatLevel":22,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":26,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":6,"bonusStrength":10},"3275":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3276":{"name":"Gardener","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":1,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"3279":{"name":"Cuffs","hitpoints":7,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":3,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5},"3280":{"name":"Narf","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3281":{"name":"Rusty","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3282":{"name":"Jeff","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3283":{"name":"Guard","hitpoints":22,"combatLevel":19,"attackSpeed":6,"attackLevel":15,"strengthLevel":15,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":6,"bonusStrength":10},"3284":{"name":"Hengel","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3285":{"name":"Anja","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3286":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3287":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3288":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3289":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"3292":{"name":"Al-Kharid warrior","hitpoints":19,"combatLevel":9,"attackSpeed":4,"attackLevel":7,"strengthLevel":5,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":15,"crushDef":10,"rangeDef":12,"bonusAttack":10,"bonusStrength":9},"3293":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3294":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3295":{"name":"Hero","hitpoints":82,"combatLevel":69,"attackSpeed":5,"attackLevel":54,"strengthLevel":55,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"3297":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3298":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3299":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3300":{"name":"Knight of Ardougne","hitpoints":52,"combatLevel":46,"attackSpeed":5,"attackLevel":38,"strengthLevel":40,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":40,"crushDef":36,"rangeDef":36,"bonusAttack":8,"bonusStrength":10},"3301":{"name":"Archer","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"range":19,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusRangeStrength":8},"3313":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3314":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3315":{"name":"Giant rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3316":{"name":"Chicken","hitpoints":3,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3328":{"name":"Earth Warrior Champion","hitpoints":108,"combatLevel":102,"attackSpeed":4,"attackLevel":84,"strengthLevel":84,"defenceLevel":84,"rangeLevel":1,"magicLevel":1},"3329":{"name":"Giant Champion","hitpoints":70,"combatLevel":56,"attackSpeed":4,"attackLevel":36,"strengthLevel":44,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3330":{"name":"Ghoul Champion","hitpoints":100,"combatLevel":85,"attackSpeed":4},"3353":{"name":"Goblin Champion","hitpoints":32,"combatLevel":24,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":14,"rangeLevel":1,"magicLevel":26},"3354":{"name":"Hobgoblin Champion","hitpoints":58,"combatLevel":56,"attackSpeed":4,"attackLevel":44,"strengthLevel":48,"defenceLevel":48,"rangeLevel":44,"magicLevel":1},"3355":{"name":"Imp Champion","hitpoints":40,"combatLevel":14,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":5,"magicLevel":1},"3356":{"name":"Jogre Champion","hitpoints":120,"combatLevel":107,"attackSpeed":4,"attackLevel":86,"strengthLevel":86,"defenceLevel":86,"rangeLevel":1,"magicLevel":1},"3357":{"name":"Lesser Demon Champion","hitpoints":148,"combatLevel":162,"attackSpeed":4,"attackLevel":136,"strengthLevel":140,"defenceLevel":142,"rangeLevel":1,"magicLevel":136},"3358":{"name":"Skeleton Champion","hitpoints":58,"combatLevel":40,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":34,"rangeLevel":36,"magicLevel":1},"3359":{"name":"Zombies Champion","hitpoints":60,"combatLevel":51,"attackSpeed":4,"attackLevel":38,"strengthLevel":42,"defenceLevel":42,"rangeLevel":1,"magicLevel":1},"3360":{"name":"Leon d'Cour","hitpoints":123,"combatLevel":141,"attackSpeed":4},"3361":{"name":"Kourend guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"3400":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3420":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3421":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3422":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3423":{"name":"Grizzly bear","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":40,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"3424":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":33,"attackSpeed":4,"attackLevel":30,"strengthLevel":26,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3425":{"name":"Grizzly bear cub","hitpoints":35,"combatLevel":36,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":28,"rangeLevel":1,"magicLevel":1},"3426":{"name":"Dire Wolf","hitpoints":85,"combatLevel":88,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"3428":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3429":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"3433":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3434":{"name":"Tyras guard","hitpoints":110,"combatLevel":110,"attackSpeed":5,"attackLevel":85,"strengthLevel":95,"defenceLevel":100,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":30},"3443":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3444":{"name":"Lucien","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":12,"strengthLevel":11,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":8,"crushDef":7,"rangeDef":4,"bonusAttack":5,"bonusStrength":4},"3445":{"name":"Guardian of Armadyl","hitpoints":50,"combatLevel":45,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3446":{"name":"Guardian of Armadyl","hitpoints":40,"combatLevel":43,"attackSpeed":5,"attackLevel":37,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":43,"slashDef":55,"crushDef":50,"rangeDef":51,"bonusAttack":14,"bonusStrength":16},"3448":{"name":"Fire Warrior of Lesarkus","hitpoints":59,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":62,"stabDef":34,"slashDef":37,"crushDef":35,"rangeDef":35},"3449":{"name":"Shadow Hound","hitpoints":62,"combatLevel":63,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"3456":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"3458":{"name":"Kamil","hitpoints":130,"combatLevel":154,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"3459":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3460":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"3473":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"3474":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"3475":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"3476":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3477":{"name":"A Doubt","hitpoints":50,"combatLevel":78,"attackSpeed":6},"3478":{"name":"The Illusive","hitpoints":140,"combatLevel":108,"attackSpeed":6},"3481":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3482":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"3484":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"3485":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"3486":{"name":"Monk of Zamorak","hitpoints":25,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":40},"3508":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3509":{"name":"Bouncer","hitpoints":120,"combatLevel":160,"attackSpeed":4,"attackLevel":145,"strengthLevel":145,"defenceLevel":145,"rangeLevel":1,"magicLevel":1},"3517":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"3518":{"name":"Thrantax the Mighty","hitpoints":80,"combatLevel":92,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"3527":{"name":"Sir Mordred","hitpoints":38,"combatLevel":39,"attackSpeed":4,"attackLevel":33,"strengthLevel":33,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":45,"bonusAttack":20,"bonusStrength":16},"3544":{"name":"Desert snake","hitpoints":6,"combatLevel":5,"attackSpeed":4,"attackLevel":4,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3549":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3550":{"name":"Menaphite Thug","hitpoints":60,"combatLevel":55,"attackSpeed":4,"attackLevel":60,"strengthLevel":50,"defenceLevel":20,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":4,"bonusStrength":9},"3551":{"name":"Tough Guy","hitpoints":75,"combatLevel":75,"attackSpeed":4,"attackLevel":85,"strengthLevel":50,"defenceLevel":50,"magicLevel":80,"stabDef":9,"slashDef":8,"crushDef":10,"bonusAttack":9,"bonusStrength":9,"poisonImmune":true},"3565":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4},"3600":{"name":"Frogeel","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":91,"strengthLevel":89,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"3601":{"name":"Unicow","hitpoints":24,"combatLevel":25,"attackSpeed":4,"attackLevel":18,"strengthLevel":26,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"3602":{"name":"Spidine","hitpoints":35,"combatLevel":42,"attackSpeed":4,"attackLevel":37,"strengthLevel":40,"defenceLevel":36,"rangeLevel":1,"magicLevel":1},"3603":{"name":"Swordchick","hitpoints":35,"combatLevel":46,"attackSpeed":4,"attackLevel":41,"strengthLevel":42,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"3604":{"name":"Jubster","hitpoints":60,"combatLevel":87,"attackSpeed":4,"attackLevel":82,"strengthLevel":78,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"3605":{"name":"Newtroost","hitpoints":18,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"3607":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3608":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3609":{"name":"Dungeon rat","hitpoints":12,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3612":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"3615":{"name":"Skeletal miner","hitpoints":39,"combatLevel":42,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":38,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"3616":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3625":{"name":"Ghost","hitpoints":27,"combatLevel":29,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3651":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"3652":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3661":{"name":"Chicken","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3662":{"name":"Chicken","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3663":{"name":"Rooster","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3664":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3665":{"name":"Rabbit","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3674":{"name":"Ragnar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3675":{"name":"Einar","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3676":{"name":"Alrik","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3677":{"name":"Thorhild","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3678":{"name":"Halla","hitpoints":1,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3681":{"name":"Rannveig","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3682":{"name":"Thora","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3683":{"name":"Valgerd","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3684":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3685":{"name":"Broddi","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3686":{"name":"Skraeling","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3687":{"name":"Ragnvald","hitpoints":1,"combatLevel":2,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"3690":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3691":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3692":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3693":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3694":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3695":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3696":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3697":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"3698":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3699":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"3707":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3708":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"3709":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3710":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3711":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3712":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3713":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3714":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3715":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3716":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3717":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3718":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3719":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3720":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3721":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3722":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3723":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3724":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3725":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3726":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3727":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3728":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3729":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3730":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3731":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3732":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3734":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3735":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3736":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3737":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3738":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3739":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"3748":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3749":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3750":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3751":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3752":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3753":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3754":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3755":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3756":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3757":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3758":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3759":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3760":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"3761":{"name":"Vyrewatch","hitpoints":90,"combatLevel":110,"attackSpeed":8,"attackLevel":110,"strengthLevel":96,"defenceLevel":85,"rangeLevel":110,"magicLevel":110},"3762":{"name":"Vyrewatch","hitpoints":105,"combatLevel":120,"attackSpeed":8,"attackLevel":120,"strengthLevel":106,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3763":{"name":"Vyrewatch","hitpoints":110,"combatLevel":125,"attackSpeed":8,"attackLevel":120,"strengthLevel":116,"defenceLevel":85,"rangeLevel":120,"magicLevel":120},"3851":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3852":{"name":"Moss giant","hitpoints":85,"combatLevel":48,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"3863":{"name":"Jake","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3865":{"name":"Wilson","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3869":{"name":"Palmer","hitpoints":50,"combatLevel":37,"attackSpeed":4,"attackLevel":27,"strengthLevel":31,"defenceLevel":25,"rangeLevel":1,"magicLevel":1},"3897":{"name":"Koschei the deathless","hitpoints":30,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20},"3898":{"name":"Koschei the deathless","hitpoints":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"magicDef":40},"3899":{"name":"Koschei the deathless","hitpoints":70,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60},"3900":{"name":"Koschei the deathless","hitpoints":255,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":255},"3901":{"name":"Fox","hitpoints":30,"combatLevel":19,"attackSpeed":4,"attackLevel":1,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30,"bonusAttack":30,"bonusStrength":30},"3902":{"name":"Bunny","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3903":{"name":"Bunny","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"3908":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3909":{"name":"Bear Cub","hitpoints":20,"combatLevel":15,"attackSpeed":4,"attackLevel":10,"strengthLevel":15,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3910":{"name":"Unicorn Foal","hitpoints":15,"combatLevel":12,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"3911":{"name":"Black unicorn Foal","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"3912":{"name":"Wolf","hitpoints":69,"combatLevel":64,"attackSpeed":4,"attackLevel":50,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"3922":{"name":"The Draugen","hitpoints":60,"combatLevel":69,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":500,"magicDef":500,"poisonImmune":true,"venomImmune":true},"3938":{"name":"Freidir","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3939":{"name":"Borrokar","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3940":{"name":"Lanzig","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3943":{"name":"Lensa","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3944":{"name":"Jennella","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"3949":{"name":"Market Guard","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3950":{"name":"Warrior","hitpoints":50,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":40,"bonusStrength":40},"3957":{"name":"Ungadulu","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":57,"strengthLevel":65,"defenceLevel":61,"magicLevel":65,"bonusStrength":3,"bonusRangeStrength":7},"3958":{"name":"Ungadulu","hitpoints":150,"combatLevel":169,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":147,"bonusStrength":3,"bonusRangeStrength":7},"3959":{"name":"Jungle savage","hitpoints":90,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":76,"defenceLevel":76,"bonusAttack":8,"bonusStrength":10},"3962":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160},"3963":{"name":"Viyeldi","hitpoints":80,"combatLevel":79,"attackSpeed":4,"attackLevel":62,"strengthLevel":66,"defenceLevel":70,"bonusAttack":7,"bonusStrength":3},"3964":{"name":"San Tojalon","hitpoints":120,"combatLevel":106,"attackSpeed":4,"attackLevel":86,"strengthLevel":84,"defenceLevel":86,"stabDef":18,"slashDef":22,"crushDef":20,"rangeDef":20,"bonusAttack":16,"bonusStrength":17},"3965":{"name":"Irvig Senay","hitpoints":125,"combatLevel":100,"attackSpeed":4,"attackLevel":76,"strengthLevel":74,"defenceLevel":81,"stabDef":27,"slashDef":31,"crushDef":29,"rangeDef":29,"bonusAttack":29,"bonusStrength":31},"3966":{"name":"Ranalph Devere","hitpoints":130,"combatLevel":92,"attackSpeed":4,"attackLevel":66,"strengthLevel":67,"defenceLevel":66,"stabDef":38,"slashDef":40,"crushDef":36,"rangeDef":38,"bonusAttack":45,"bonusStrength":44},"3969":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3970":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3971":{"name":"Zombie rat","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":3,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"3972":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"3973":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"3974":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":11,"rangeDef":4,"magicDef":1,"bonusAttack":15,"bonusStrength":14},"3975":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3976":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3977":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3978":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3979":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"3980":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7},"3981":{"name":"Zombie","hitpoints":30,"combatLevel":24,"attackSpeed":5,"attackLevel":19,"strengthLevel":21,"defenceLevel":16,"rangeLevel":1,"magicLevel":1,"stabDef":9,"slashDef":8,"crushDef":12,"rangeDef":11,"magicDef":10,"bonusAttack":5,"bonusStrength":7},"3982":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"3996":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"3997":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"3998":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"3999":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"4004":{"name":"Shadow","hitpoints":15,"combatLevel":73,"attackSpeed":4,"attackLevel":90,"strengthLevel":120,"defenceLevel":5,"rangeLevel":1,"magicLevel":90,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30,"magicDef":30},"4005":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"4043":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4044":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4045":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4046":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4047":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4048":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4049":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4050":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4051":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4052":{"name":"Pirate","hitpoints":20,"combatLevel":57},"4067":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"4068":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4095":{"name":"Eadburg","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4096":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4097":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4098":{"name":"Archer","hitpoints":50,"combatLevel":42,"attackSpeed":6,"defenceLevel":40,"rangeLevel":40,"magicLevel":1,"stabDef":39,"slashDef":50,"crushDef":49,"rangeDef":45,"magicDef":18,"bonusAttack":34},"4099":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4100":{"name":"Guard","hitpoints":40,"combatLevel":37,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"magicLevel":1,"stabDef":36,"slashDef":48,"crushDef":50,"rangeDef":38,"bonusAttack":18,"bonusStrength":16},"4104":{"name":"Servant","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4107":{"name":"Breoca","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4108":{"name":"Ocga","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4109":{"name":"Penda","hitpoints":10,"combatLevel":5,"attackSpeed":4,"attackLevel":3,"strengthLevel":3,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4110":{"name":"Hygd","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4111":{"name":"Ceolburg","hitpoints":10,"combatLevel":4,"attackSpeed":4,"attackLevel":3,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4114":{"name":"White Knight","hitpoints":55,"combatLevel":42,"attackSpeed":7,"attackLevel":32,"strengthLevel":35,"defenceLevel":27,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"4115":{"name":"Fareed (hard)","hitpoints":255,"combatLevel":299,"attackSpeed":4,"attackLevel":380,"strengthLevel":240,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"4120":{"name":"Troll general","hitpoints":140,"combatLevel":113,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4121":{"name":"Troll general","hitpoints":140,"combatLevel":113,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4122":{"name":"Troll general","hitpoints":140,"combatLevel":113,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"4123":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4124":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4125":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4126":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4127":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4128":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4129":{"name":"Troll spectator","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4130":{"name":"Dad","hitpoints":120,"combatLevel":101,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"4131":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4132":{"name":"Berry","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4133":{"name":"Twig","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4134":{"name":"Berry","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4135":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4136":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4137":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4138":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4139":{"name":"Thrower troll","hitpoints":95,"combatLevel":68,"attackSpeed":7,"attackLevel":30,"strengthLevel":95,"defenceLevel":15,"rangeLevel":60,"rangeDef":200,"magicDef":200},"4143":{"name":"Mountain troll","hitpoints":90,"combatLevel":71,"attackSpeed":6,"attackLevel":40,"strengthLevel":90,"defenceLevel":25,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"4167":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4168":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4169":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4170":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4171":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4172":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4173":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4174":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4175":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4176":{"name":"Outlaw","hitpoints":20,"combatLevel":32,"attackSpeed":6,"attackLevel":35,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4184":{"name":"Crocodile","hitpoints":62,"combatLevel":63,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"4185":{"name":"Jackal","hitpoints":27,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"4186":{"name":"Locust","hitpoints":27,"combatLevel":18,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4188":{"name":"Plague frog","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4192":{"name":"Scarab swarm","hitpoints":25,"combatLevel":98,"attackSpeed":1,"attackLevel":255,"strengthLevel":5,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":5,"rangeDef":90,"magicDef":90},"4195":{"name":"Het","hitpoints":75,"combatLevel":81,"attackSpeed":4,"attackLevel":80,"strengthLevel":83,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"4196":{"name":"Apmeken","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":30,"strengthLevel":40,"defenceLevel":60,"rangeLevel":1,"magicLevel":85,"stabDef":65,"slashDef":65,"crushDef":65,"magicDef":50},"4197":{"name":"Scabaras","hitpoints":50,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":66,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":70},"4198":{"name":"Crondis","hitpoints":60,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":35,"rangeLevel":1,"magicLevel":40,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":40,"magicDef":70},"4210":{"name":"Possessed Priest","hitpoints":90,"combatLevel":91,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":60,"stabDef":90,"crushDef":90,"bonusStrength":90},"4246":{"name":"Monk","hitpoints":5,"combatLevel":3,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"4247":{"name":"Thief","hitpoints":17,"combatLevel":14,"attackSpeed":4,"attackLevel":14,"strengthLevel":10,"defenceLevel":9,"rangeLevel":2,"stabDef":8,"slashDef":13,"crushDef":14,"rangeDef":9,"magicDef":4,"bonusAttack":6,"bonusStrength":7},"4248":{"name":"Head Thief","hitpoints":37,"combatLevel":26,"attackSpeed":5,"attackLevel":24,"strengthLevel":18,"defenceLevel":16,"rangeLevel":2,"stabDef":8,"slashDef":14,"crushDef":15,"rangeDef":9,"magicDef":4,"bonusStrength":10},"4276":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4277":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4278":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4279":{"name":"Jail guard","hitpoints":32,"combatLevel":26,"attackSpeed":5,"attackLevel":19,"strengthLevel":23,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":10,"rangeDef":9,"magicDef":4,"bonusAttack":9,"bonusStrength":5},"4303":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"4304":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"4308":{"name":"Sea troll","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4309":{"name":"Sea troll","hitpoints":80,"combatLevel":65,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4310":{"name":"Sea troll","hitpoints":80,"combatLevel":87,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1},"4311":{"name":"Sea troll","hitpoints":80,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"4315":{"name":"Sea Troll Queen","hitpoints":200,"combatLevel":170,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":150,"stabDef":20,"slashDef":40,"crushDef":40,"magicDef":40,"bonusAttack":100,"bonusStrength":40},"4319":{"name":"Skeleton Mage","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":60,"rangeLevel":1,"magicLevel":100,"magicDef":15},"4321":{"name":"Renegade Knight","hitpoints":48,"combatLevel":37,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":99,"slashDef":82,"crushDef":62,"bonusAttack":20,"bonusStrength":16},"4328":{"name":"Sigmund","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":45,"strengthLevel":45,"defenceLevel":24,"rangeLevel":1,"magicLevel":1,"magic":8,"venomImmune":true},"4331":{"name":"Black Knight","hitpoints":42,"combatLevel":33,"attackSpeed":5,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":73,"slashDef":76,"crushDef":70,"rangeDef":72,"bonusAttack":18,"bonusStrength":16},"4342":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4343":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4344":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4345":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4346":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4347":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4348":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4349":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4354":{"name":"Sir Lancelot","hitpoints":115,"combatLevel":127,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":85,"crushDef":300,"bonusAttack":60,"bonusStrength":60},"4355":{"name":"Sir Kay","hitpoints":110,"combatLevel":124,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":300,"crushDef":65,"bonusAttack":55,"bonusStrength":55},"4356":{"name":"Sir Gawain","hitpoints":110,"combatLevel":122,"attackSpeed":5,"attackLevel":110,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":65,"slashDef":90,"crushDef":300,"bonusAttack":40,"bonusStrength":45},"4357":{"name":"Sir Lucan","hitpoints":105,"combatLevel":120,"attackSpeed":5,"attackLevel":105,"strengthLevel":110,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":275,"slashDef":65,"crushDef":45,"bonusAttack":40,"bonusStrength":40},"4358":{"name":"Sir Palomedes","hitpoints":100,"combatLevel":118,"attackSpeed":5,"attackLevel":105,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":250,"slashDef":250,"crushDef":50,"bonusAttack":35,"bonusStrength":35},"4359":{"name":"Sir Tristram","hitpoints":105,"combatLevel":115,"attackSpeed":5,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"crushDef":225,"bonusAttack":25,"bonusStrength":25},"4360":{"name":"Sir Pelleas","hitpoints":99,"combatLevel":112,"attackSpeed":5,"attackLevel":95,"strengthLevel":99,"defenceLevel":98,"rangeLevel":1,"magicLevel":1,"stabDef":200,"crushDef":5,"bonusAttack":22,"bonusStrength":22},"4361":{"name":"Sir Bedivere","hitpoints":90,"combatLevel":110,"attackSpeed":5,"attackLevel":99,"strengthLevel":95,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":15,"crushDef":190,"bonusAttack":20,"bonusStrength":20},"4362":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4363":{"name":"Ogre chieftain","hitpoints":60,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":71,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":21,"crushDef":16,"bonusAttack":5,"bonusStrength":7},"4367":{"name":"Gorad","hitpoints":80,"combatLevel":68,"attackSpeed":4,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":27,"crushDef":21,"bonusAttack":8,"bonusStrength":8},"4373":{"name":"City guard","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4381":{"name":"Enclave guard","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":24,"crushDef":19,"bonusAttack":9,"bonusStrength":13},"4382":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4383":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4384":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4385":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"4387":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4389":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4391":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4393":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4395":{"name":"Ogre shaman","hitpoints":1,"combatLevel":113,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4405":{"name":"Tower guard","hitpoints":22,"combatLevel":28,"attackSpeed":4,"attackLevel":26,"strengthLevel":26,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":23,"slashDef":35,"crushDef":28,"bonusAttack":8,"bonusStrength":8},"4406":{"name":"Colonel Radick","hitpoints":65,"combatLevel":38,"attackSpeed":4,"attackLevel":25,"strengthLevel":25,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":39,"slashDef":31,"crushDef":34,"bonusAttack":9,"bonusStrength":13},"4421":{"name":"Undead cow","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4427":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4428":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4429":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4430":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4431":{"name":"Feral Vampyre","hitpoints":80,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":30,"defenceLevel":60,"rangeLevel":1,"magicLevel":1},"4432":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4436":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4437":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4438":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4439":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4442":{"name":"Vampyre Juvinate","hitpoints":110,"combatLevel":75,"attackSpeed":4,"attackLevel":70,"strengthLevel":50,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"4443":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4483":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4484":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4485":{"name":"Gadderanks","hitpoints":20,"combatLevel":35,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10,"magicDef":10,"poisonImmune":true,"venomImmune":true},"4486":{"name":"Vampyre Juvinate","hitpoints":60,"combatLevel":50,"attackSpeed":4,"attackLevel":50,"strengthLevel":37,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4487":{"name":"Vampyre Juvinate","hitpoints":65,"combatLevel":54,"attackSpeed":4,"attackLevel":55,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"4491":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4492":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4493":{"name":"Skeleton fremennik","hitpoints":25,"combatLevel":40,"attackSpeed":6,"attackLevel":53,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4494":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4495":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4496":{"name":"Skeleton fremennik","hitpoints":35,"combatLevel":50,"attackSpeed":6,"attackLevel":60,"strengthLevel":43,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4497":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4498":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4499":{"name":"Skeleton fremennik","hitpoints":40,"combatLevel":60,"attackSpeed":6,"attackLevel":72,"strengthLevel":54,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":15,"rangeDef":15,"bonusAttack":8,"bonusStrength":13},"4500":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4501":{"name":"Brine rat","hitpoints":50,"combatLevel":70,"slayerLevel":47,"attackSpeed":4,"attackLevel":70,"strengthLevel":79,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"4504":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"4505":{"name":"Ulfric","hitpoints":60,"combatLevel":100,"attackSpeed":6,"attackLevel":100,"strengthLevel":82,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"4522":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4523":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4524":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4525":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4526":{"name":"Guard","hitpoints":30,"combatLevel":22,"attackSpeed":5,"attackLevel":16,"strengthLevel":20,"defenceLevel":12,"rangeLevel":1,"magicLevel":1,"stabDef":7,"slashDef":7,"rangeDef":7},"4533":{"name":"Blessed spider","hitpoints":32,"combatLevel":39,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"4534":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4535":{"name":"Blessed giant rat","hitpoints":30,"combatLevel":9,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4561":{"name":"Spider","hitpoints":2,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4634":{"name":"Rowdy slave","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":7,"strengthLevel":7,"defenceLevel":7},"4635":{"name":"Mercenary Captain","hitpoints":80,"combatLevel":47,"attackSpeed":4,"attackLevel":32,"strengthLevel":29,"defenceLevel":32,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4643":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4648":{"name":"Shantay Guard","hitpoints":32,"combatLevel":22,"attackSpeed":4,"attackLevel":17,"strengthLevel":16,"defenceLevel":16,"stabDef":12,"slashDef":15,"crushDef":18,"rangeDef":15,"magicDef":6,"bonusAttack":11,"bonusStrength":12},"4649":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4650":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4651":{"name":"Desert Wolf","hitpoints":34,"combatLevel":27,"attackSpeed":4,"attackLevel":20,"strengthLevel":21,"defenceLevel":22},"4652":{"name":"Ugthanki","hitpoints":45,"combatLevel":42,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35},"4655":{"name":"Bedabin Nomad Fighter","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":40,"strengthLevel":50,"defenceLevel":60,"bonusAttack":9,"bonusStrength":14},"4656":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4657":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4658":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4659":{"name":"Mercenary","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4660":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4661":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4662":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4663":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4664":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4665":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4666":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4667":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4668":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4669":{"name":"Guard","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":39,"stabDef":17,"slashDef":15,"crushDef":19,"rangeDef":19,"bonusAttack":9,"bonusStrength":14},"4682":{"name":"Sir Leye","hitpoints":20,"combatLevel":20,"attackSpeed":5},"4688":{"name":"Angry unicorn","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4689":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4690":{"name":"Angry giant rat","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4691":{"name":"Angry goblin","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4692":{"name":"Angry bear","hitpoints":50,"combatLevel":47,"attackSpeed":4,"attackLevel":38,"strengthLevel":41,"defenceLevel":38,"rangeLevel":1,"magicLevel":1},"4693":{"name":"Fear reaper","hitpoints":57,"combatLevel":55,"attackSpeed":4,"attackLevel":45,"strengthLevel":48,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"4694":{"name":"Confusion beast","hitpoints":64,"combatLevel":63,"attackSpeed":4,"attackLevel":52,"strengthLevel":55,"defenceLevel":52,"rangeLevel":1,"magicLevel":1},"4695":{"name":"Hopeless creature","hitpoints":71,"combatLevel":71,"attackSpeed":4,"attackLevel":59,"strengthLevel":62,"defenceLevel":59,"rangeLevel":1,"magicLevel":1},"4708":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4709":{"name":"The Shaikahan","hitpoints":100,"combatLevel":83,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"rangeDef":10000,"magicDef":10000},"4742":{"name":"Black golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":300,"crushDef":1,"rangeDef":300,"magicDef":300},"4743":{"name":"White golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":300,"crushDef":300,"rangeDef":300,"magicDef":300},"4744":{"name":"Grey golem","hitpoints":80,"combatLevel":75,"attackSpeed":4,"attackLevel":80,"strengthLevel":30,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":300,"slashDef":1,"crushDef":300,"rangeDef":300,"magicDef":300},"4757":{"name":"Tarik","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4758":{"name":"Poltenip","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4759":{"name":"Radat","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":4,"bonusStrength":5},"4772":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4773":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4774":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4775":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4776":{"name":"Fortress Guard","hitpoints":22,"combatLevel":20,"attackSpeed":6,"attackLevel":18,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1,"stabDef":14,"slashDef":18,"crushDef":14,"rangeDef":15,"bonusAttack":5,"bonusStrength":6},"4797":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4798":{"name":"Slug Prince","hitpoints":70,"combatLevel":62,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":99,"magicDef":99},"4799":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4800":{"name":"Giant lobster","hitpoints":50,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":15,"rangeDef":70,"magicDef":99},"4805":{"name":"Hobgoblin","hitpoints":29,"combatLevel":28,"attackSpeed":4,"attackLevel":22,"strengthLevel":24,"defenceLevel":24,"rangeLevel":1,"magicLevel":1},"4813":{"name":"Icefiend","hitpoints":15,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"4819":{"name":"Crab","hitpoints":19,"combatLevel":23,"attackSpeed":4,"attackLevel":19,"strengthLevel":20,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4820":{"name":"Mudskipper","hitpoints":20,"combatLevel":30,"attackSpeed":4,"attackLevel":29,"strengthLevel":29,"defenceLevel":26,"rangeLevel":1,"magicLevel":1},"4821":{"name":"Mudskipper","hitpoints":20,"combatLevel":31,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"4822":{"name":"Crab","hitpoints":18,"combatLevel":21,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":22,"rangeLevel":1,"magicLevel":1},"4849":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4863":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9},"4864":{"name":"Jubbly bird","hitpoints":21,"combatLevel":9},"4872":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4873":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4874":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4875":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4876":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4877":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4878":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4879":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"4880":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"4881":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"4882":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"4883":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"4884":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4885":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4886":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4887":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4888":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4889":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"4919":{"name":"Grip","hitpoints":25,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":17,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":27,"crushDef":22,"bonusAttack":5,"bonusStrength":7},"4922":{"name":"Ice Queen","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":94,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":40,"crushDef":20,"rangeDef":30,"magicDef":10},"4926":{"name":"Pirate Guard","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":16,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":39,"crushDef":30,"bonusAttack":20,"bonusStrength":16},"4927":{"name":"Entrana firebird","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"4930":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4933":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4934":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4959":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4960":{"name":"Black Knight","hitpoints":42,"combatLevel":32,"attackSpeed":5},"4962":{"name":"Solus Dellagar","hitpoints":40,"attackSpeed":3},"4969":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4970":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"4972":{"name":"Khazard commander","hitpoints":22,"combatLevel":48,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"4973":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4974":{"name":"Gnome troop","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"4987":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1},"5007":{"name":"Imp","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5043":{"name":"Suit of armour","hitpoints":29,"combatLevel":19,"attackSpeed":5,"attackLevel":16,"strengthLevel":14,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":46,"slashDef":50,"crushDef":45,"rangeDef":45,"bonusAttack":8,"bonusStrength":10},"5054":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"5079":{"name":"Delrith","hitpoints":10,"combatLevel":27,"attackSpeed":6,"attackLevel":11,"strengthLevel":10,"defenceLevel":5,"rangeLevel":1,"magicLevel":1,"slashDef":2},"5086":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5087":{"name":"Dark wizard","hitpoints":12,"combatLevel":7,"attackSpeed":4,"attackLevel":5,"strengthLevel":2,"defenceLevel":5,"rangeLevel":1,"magicLevel":6,"magicDef":3},"5088":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":22,"magicDef":3},"5089":{"name":"Dark wizard","hitpoints":24,"combatLevel":20,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":14,"rangeLevel":1,"magicLevel":22,"magicDef":3},"5126":{"name":"Experiment No.2","hitpoints":95,"combatLevel":109,"attackSpeed":4,"attackLevel":104,"strengthLevel":92,"defenceLevel":90,"rangeLevel":100,"magicLevel":1,"stabDef":45,"slashDef":70,"crushDef":60,"rangeDef":55,"magicDef":60},"5127":{"name":"Mouse","hitpoints":70,"combatLevel":95,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":55,"crushDef":65,"rangeDef":60,"magicDef":50},"5128":{"name":"Mouse","hitpoints":70,"combatLevel":95,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":55,"crushDef":65,"rangeDef":60,"magicDef":50},"5129":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"5139":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5142":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5143":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5144":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5145":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5146":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5157":{"name":"H.A.M. Archer","hitpoints":35,"combatLevel":30,"attackSpeed":10,"defenceLevel":30,"rangeLevel":30,"stabDef":5,"slashDef":5,"rangeDef":5},"5158":{"name":"H.A.M. Mage","hitpoints":35,"combatLevel":30,"attackSpeed":6,"defenceLevel":30,"rangeLevel":1,"magicLevel":30,"magic":8,"stabDef":5,"slashDef":5,"rangeDef":5},"5185":{"name":"Guard","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5186":{"name":"Guard","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5187":{"name":"Guard","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5188":{"name":"Guard","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5189":{"name":"Guard","hitpoints":16,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":9,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":4,"rangeDef":3,"magicDef":2,"bonusAttack":5,"bonusStrength":7},"5192":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5193":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5194":{"name":"Baby green dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"5195":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5196":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5197":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5198":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5199":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5200":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5201":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5202":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5203":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5204":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5205":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5206":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5207":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5208":{"name":"Goblin","hitpoints":5,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5211":{"name":"Weaponsmaster","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":21,"slashDef":23,"crushDef":21,"rangeDef":20,"bonusAttack":8,"bonusStrength":10},"5213":{"name":"Jonny the beard","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5217":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5218":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5219":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5220":{"name":"Thief","hitpoints":17,"combatLevel":16,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5223":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5237":{"name":"Skeleton","hitpoints":110,"combatLevel":142,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":50},"5238":{"name":"Spider","hitpoints":2,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5239":{"name":"Spider","hitpoints":2,"combatLevel":1,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"slashDef":1,"magicDef":1,"bonusAttack":1,"bonusStrength":1},"5240":{"name":"Bird","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":10},"5241":{"name":"Bird","hitpoints":5,"combatLevel":5,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":5},"5242":{"name":"Scorpion","hitpoints":15,"combatLevel":38,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5243":{"name":"Jungle spider","hitpoints":35,"combatLevel":37,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5244":{"name":"Snake","hitpoints":36,"combatLevel":24,"attackSpeed":4,"attackLevel":15,"strengthLevel":25,"defenceLevel":10,"rangeLevel":1,"magicLevel":10,"bonusAttack":100,"bonusStrength":100},"5259":{"name":"Oipuis","combatLevel":149},"5260":{"name":"Uyoro","combatLevel":149},"5261":{"name":"Ouhai","combatLevel":149},"5262":{"name":"Uodai","combatLevel":149},"5263":{"name":"Padulah","hitpoints":130,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5271":{"name":"Monkey Guard","hitpoints":130,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":130},"5272":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5273":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5274":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"5275":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5276":{"name":"Monkey Guard","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":200,"rangeLevel":1,"magicLevel":130,"bonusAttack":50},"5281":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":98,"attackSpeed":4,"attackLevel":150,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":35},"5282":{"name":"Monkey Zombie","hitpoints":90,"combatLevel":129,"attackSpeed":4,"attackLevel":150,"strengthLevel":110,"defenceLevel":90,"rangeLevel":1,"magicLevel":90,"bonusAttack":35},"5283":{"name":"Monkey Zombie","hitpoints":60,"combatLevel":82,"attackSpeed":4,"attackLevel":100,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":60,"bonusAttack":15},"5293":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5294":{"name":"Elf Warrior","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5295":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5296":{"name":"Elf Archer","hitpoints":105,"combatLevel":90,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5329":{"name":"Sigmund","hitpoints":70,"combatLevel":64,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"magic":8,"poisonImmune":true,"venomImmune":true},"5330":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5331":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5332":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5333":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5334":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":26,"attackSpeed":6,"attackLevel":25,"strengthLevel":18,"defenceLevel":25,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":16,"crushDef":19,"rangeDef":12},"5335":{"name":"Cave goblin guard","hitpoints":26,"combatLevel":24,"attackSpeed":6,"attackLevel":22,"strengthLevel":16,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"slashDef":15,"crushDef":19,"rangeDef":12},"5336":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5337":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5338":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5339":{"name":"Cave goblin miner","hitpoints":10,"combatLevel":11,"attackSpeed":4,"attackLevel":10,"strengthLevel":12,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5342":{"name":"Undead one","hitpoints":47,"combatLevel":68,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63},"5343":{"name":"Undead one","hitpoints":47,"combatLevel":68,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63},"5344":{"name":"Undead one","hitpoints":47,"combatLevel":61,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5},"5345":{"name":"Undead one","hitpoints":47,"combatLevel":61,"attackSpeed":4,"attackLevel":55,"strengthLevel":55,"defenceLevel":55,"stabDef":5,"slashDef":5,"crushDef":4,"rangeDef":4,"magicDef":1,"bonusAttack":7,"bonusStrength":5},"5346":{"name":"Undead one","hitpoints":47,"combatLevel":68,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63},"5347":{"name":"Undead one","hitpoints":47,"combatLevel":68,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63},"5348":{"name":"Undead one","hitpoints":47,"combatLevel":68,"attackSpeed":4,"attackLevel":63,"strengthLevel":63,"defenceLevel":63},"5349":{"name":"Undead one","hitpoints":59,"combatLevel":73,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5},"5350":{"name":"Undead one","hitpoints":59,"combatLevel":73,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5},"5351":{"name":"Undead one","hitpoints":59,"combatLevel":73,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"bonusAttack":4,"bonusStrength":5},"5353":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5354":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"5355":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"5369":{"name":"Goblin guard","hitpoints":43,"combatLevel":42,"attackSpeed":4,"attackLevel":32,"strengthLevel":37,"defenceLevel":37,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"5370":{"name":"Ghost","hitpoints":20,"combatLevel":24,"attackSpeed":4,"attackLevel":23,"strengthLevel":23,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"5372":{"name":"Grave scorpion","hitpoints":7,"combatLevel":12,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":3},"5373":{"name":"Poison spider","hitpoints":25,"combatLevel":31,"attackSpeed":4,"attackLevel":28,"strengthLevel":28,"defenceLevel":28,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":10,"rangeDef":14,"magicDef":14},"5418":{"name":"Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":9,"bonusStrength":7},"5420":{"name":"Watchman","hitpoints":22,"combatLevel":33,"attackSpeed":6,"attackLevel":31,"strengthLevel":31,"defenceLevel":31,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16},"5421":{"name":"Soldier","hitpoints":22,"combatLevel":28,"attackSpeed":5,"attackLevel":26,"strengthLevel":25,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"bonusAttack":8,"bonusStrength":10},"5457":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"5512":{"name":"Gardener","hitpoints":7,"combatLevel":4,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":7,"rangeLevel":1,"magicLevel":1},"5534":{"name":"Whirlpool","slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"rangeDef":300,"magicDef":130},"5535":{"name":"Enormous Tentacle","hitpoints":120,"combatLevel":112,"slayerLevel":87,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":150,"magicLevel":1,"rangeDef":270},"5563":{"name":"Angry barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5564":{"name":"Enraged barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5565":{"name":"Berserk barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"rangeDef":2,"bonusAttack":9,"bonusStrength":15},"5566":{"name":"Ferocious barbarian spirit","hitpoints":190,"combatLevel":166,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"slashDef":73,"crushDef":72,"rangeDef":72,"bonusAttack":9,"bonusStrength":15},"5615":{"name":"Swamp snake","hitpoints":120,"combatLevel":80,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":70,"rangeLevel":30,"magicLevel":30},"5616":{"name":"Swamp snake","hitpoints":125,"combatLevel":109,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30},"5617":{"name":"Swamp snake","hitpoints":130,"combatLevel":139,"attackSpeed":4,"attackLevel":90,"strengthLevel":170,"defenceLevel":90,"rangeLevel":30,"magicLevel":30},"5625":{"name":"Ghast","hitpoints":115,"combatLevel":79,"attackSpeed":8,"attackLevel":80,"strengthLevel":30,"defenceLevel":60,"rangeLevel":30,"magicLevel":30},"5626":{"name":"Ghast","hitpoints":135,"combatLevel":109,"attackSpeed":8,"attackLevel":110,"strengthLevel":70,"defenceLevel":70,"rangeLevel":30,"magicLevel":30},"5627":{"name":"Ghast","hitpoints":160,"combatLevel":139,"attackSpeed":8,"attackLevel":135,"strengthLevel":110,"defenceLevel":80,"rangeLevel":30,"magicLevel":30},"5628":{"name":"Giant snail","hitpoints":125,"combatLevel":80,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":60,"rangeLevel":70,"magicLevel":30},"5629":{"name":"Giant snail","hitpoints":150,"combatLevel":109,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":75,"rangeLevel":110,"magicLevel":30},"5630":{"name":"Giant snail","hitpoints":160,"combatLevel":139,"attackSpeed":4,"attackLevel":30,"strengthLevel":30,"defenceLevel":86,"rangeLevel":160,"magicLevel":30},"5631":{"name":"Riyl shadow","hitpoints":76,"combatLevel":80,"attackSpeed":4,"attackLevel":87,"strengthLevel":56,"defenceLevel":60,"rangeLevel":50,"magicLevel":50},"5632":{"name":"Asyn shadow","hitpoints":94,"combatLevel":110,"attackSpeed":4,"attackLevel":110,"strengthLevel":96,"defenceLevel":80,"rangeLevel":50,"magicLevel":50},"5633":{"name":"Shade","hitpoints":115,"combatLevel":140,"attackSpeed":4,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50},"5634":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5635":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5636":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5637":{"name":"Vampyre Juvinate","hitpoints":50,"combatLevel":59,"attackSpeed":4,"attackLevel":95,"strengthLevel":16,"defenceLevel":45,"rangeLevel":50,"magicLevel":50},"5638":{"name":"Vampyre Juvinate","hitpoints":100,"combatLevel":90,"attackSpeed":4,"attackLevel":113,"strengthLevel":46,"defenceLevel":55,"rangeLevel":50,"magicLevel":50},"5639":{"name":"Vampyre Juvinate","hitpoints":150,"combatLevel":119,"attackSpeed":4,"attackLevel":127,"strengthLevel":76,"defenceLevel":65,"rangeLevel":50,"magicLevel":50},"5640":{"name":"Feral Vampyre","hitpoints":75,"combatLevel":70,"attackSpeed":4,"attackLevel":90,"strengthLevel":46,"defenceLevel":30},"5641":{"name":"Feral Vampyre","hitpoints":135,"combatLevel":100,"attackSpeed":4,"attackLevel":105,"strengthLevel":76,"defenceLevel":30},"5642":{"name":"Feral Vampyre","hitpoints":185,"combatLevel":130,"attackSpeed":4,"attackLevel":120,"strengthLevel":116,"defenceLevel":30},"5643":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5644":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5645":{"name":"Head","hitpoints":150,"combatLevel":140,"attackSpeed":10,"attackLevel":73,"strengthLevel":186,"defenceLevel":75,"rangeLevel":50,"magicLevel":50},"5646":{"name":"Tentacle","hitpoints":75,"combatLevel":99,"attackSpeed":6,"attackLevel":115,"strengthLevel":76,"defenceLevel":75,"rangeLevel":115,"magicLevel":50},"5647":{"name":"Zombie","hitpoints":20,"combatLevel":23,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"5648":{"name":"Undead Lumberjack","hitpoints":10,"combatLevel":30,"attackSpeed":4,"attackLevel":73,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"5649":{"name":"Undead Lumberjack","hitpoints":10,"combatLevel":30,"attackSpeed":4,"attackLevel":73,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"5650":{"name":"Undead Lumberjack","hitpoints":10,"combatLevel":30,"attackSpeed":4,"attackLevel":73,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"5651":{"name":"Undead Lumberjack","hitpoints":10,"combatLevel":30,"attackSpeed":4,"attackLevel":73,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"5652":{"name":"Undead Lumberjack","hitpoints":10,"combatLevel":30,"attackSpeed":4,"attackLevel":73,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"5653":{"name":"Undead Lumberjack","hitpoints":10,"combatLevel":30,"attackSpeed":4,"attackLevel":73,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"5654":{"name":"Undead Lumberjack","hitpoints":10,"combatLevel":30,"attackSpeed":4,"attackLevel":73,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"5655":{"name":"Undead Lumberjack","hitpoints":10,"combatLevel":30,"attackSpeed":4,"attackLevel":73,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"5656":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5657":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5658":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5659":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5660":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5661":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5662":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5663":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":35,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5665":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5666":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5667":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5668":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5669":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5670":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5671":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5672":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":40,"attackSpeed":4,"attackLevel":101,"strengthLevel":6,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"5673":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"5674":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"5675":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"5676":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"5677":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"5678":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"5679":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"5680":{"name":"Undead Lumberjack","hitpoints":13,"combatLevel":45,"attackSpeed":4,"attackLevel":105,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"5681":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"5682":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"5683":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"5684":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"5685":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"5686":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"5687":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"5688":{"name":"Undead Lumberjack","hitpoints":14,"combatLevel":50,"attackSpeed":4,"attackLevel":117,"strengthLevel":16,"defenceLevel":14,"rangeLevel":1,"magicLevel":1},"5689":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5690":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5691":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5692":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5693":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5694":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5695":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5696":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":55,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5697":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"5698":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"5699":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"5700":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"5701":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"5702":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"5703":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"5704":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":60,"attackSpeed":4,"attackLevel":137,"strengthLevel":26,"defenceLevel":16,"rangeLevel":1,"magicLevel":1},"5705":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5706":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5707":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5708":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5709":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5710":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5711":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5712":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":64,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5713":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5714":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5715":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5716":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5717":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5718":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5719":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5720":{"name":"Undead Lumberjack","hitpoints":12,"combatLevel":70,"attackSpeed":4,"rangeLevel":1,"magicLevel":1},"5729":{"name":"Shipyard worker","hitpoints":10,"combatLevel":11,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"bonusAttack":6,"bonusStrength":6},"5732":{"name":"Market Guard","hitpoints":22,"combatLevel":20,"attackSpeed":5,"attackLevel":17,"strengthLevel":18,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"5739":{"name":"Penance Fighter","hitpoints":28,"combatLevel":30,"attackSpeed":4,"defenceLevel":25},"5740":{"name":"Penance Fighter","hitpoints":29,"combatLevel":32,"attackSpeed":4,"defenceLevel":27},"5741":{"name":"Penance Fighter","hitpoints":32,"combatLevel":37,"attackSpeed":4,"defenceLevel":34},"5742":{"name":"Penance Fighter","hitpoints":37,"combatLevel":42,"attackSpeed":4,"defenceLevel":37},"5743":{"name":"Penance Fighter","hitpoints":38,"combatLevel":47,"attackSpeed":4,"defenceLevel":44},"5744":{"name":"Penance Fighter","hitpoints":49,"combatLevel":56,"attackSpeed":4,"defenceLevel":48},"5745":{"name":"Penance Fighter","hitpoints":50,"combatLevel":61,"attackSpeed":4,"defenceLevel":52},"5746":{"name":"Penance Fighter","hitpoints":55,"combatLevel":68,"attackSpeed":4,"defenceLevel":62},"5747":{"name":"Penance Fighter","hitpoints":56,"combatLevel":77,"attackSpeed":4,"defenceLevel":66},"5757":{"name":"Penance Ranger","hitpoints":20,"combatLevel":21,"attackSpeed":4,"defenceLevel":21},"5758":{"name":"Penance Ranger","hitpoints":29,"combatLevel":25,"attackSpeed":4,"defenceLevel":29},"5759":{"name":"Penance Ranger","hitpoints":32,"combatLevel":32,"attackSpeed":4,"defenceLevel":33},"5760":{"name":"Penance Ranger","hitpoints":34,"combatLevel":38,"attackSpeed":4,"defenceLevel":42},"5761":{"name":"Penance Ranger","hitpoints":41,"combatLevel":43,"attackSpeed":4,"defenceLevel":46},"5762":{"name":"Penance Ranger","hitpoints":50,"combatLevel":51,"attackSpeed":4,"defenceLevel":54},"5763":{"name":"Penance Ranger","hitpoints":50,"combatLevel":57,"attackSpeed":4,"defenceLevel":61},"5764":{"name":"Penance Ranger","hitpoints":55,"combatLevel":64,"attackSpeed":4,"defenceLevel":68},"5765":{"name":"Penance Ranger","hitpoints":58,"combatLevel":72,"attackSpeed":4,"defenceLevel":80},"5775":{"name":"Penance Queen","hitpoints":250,"combatLevel":209,"attackSpeed":4,"attackLevel":260,"strengthLevel":92,"defenceLevel":132,"rangeLevel":116,"magicLevel":1},"5776":{"name":"Queen spawn","hitpoints":45,"combatLevel":63,"attackSpeed":4,"attackLevel":60,"strengthLevel":62,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"5779":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"5816":{"name":"Yak","hitpoints":50,"combatLevel":22,"attackSpeed":4,"attackLevel":20,"strengthLevel":10,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5822":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"5823":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5824":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5825":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5826":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5828":{"name":"Ice troll runt","hitpoints":60,"combatLevel":74,"attackSpeed":4,"attackLevel":60,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5829":{"name":"Ice troll male","hitpoints":80,"combatLevel":82,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5830":{"name":"Ice troll female","hitpoints":80,"combatLevel":82,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5831":{"name":"Ice troll grunt","hitpoints":80,"combatLevel":102,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":60,"crushDef":30,"bonusAttack":60,"bonusStrength":60},"5842":{"name":"Cow","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5848":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"5853":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5854":{"name":"Baby tanglefoot","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"5862":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5863":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5866":{"name":"Cerberus","hitpoints":600,"combatLevel":318,"slayerLevel":91,"attackSpeed":6,"attackLevel":220,"strengthLevel":220,"defenceLevel":100,"rangeLevel":220,"magicLevel":220,"range":50,"magic":50,"stabDef":50,"slashDef":100,"crushDef":25,"rangeDef":100,"magicDef":100,"bonusAttack":50,"poisonImmune":true,"venomImmune":true},"5872":{"name":"Baby green dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"5873":{"name":"Baby green dragon","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"5874":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"5875":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"5876":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"5877":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"5878":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5879":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5880":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5881":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5882":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"5886":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65},"5887":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65},"5888":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65},"5889":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65},"5890":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65},"5891":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65},"5908":{"name":"Abyssal Sire","hitpoints":400,"combatLevel":350,"slayerLevel":85,"attackSpeed":7,"attackLevel":180,"strengthLevel":136,"defenceLevel":250,"rangeLevel":1,"magicLevel":200,"stabDef":40,"slashDef":60,"crushDef":50,"rangeDef":60,"magicDef":20,"bonusAttack":65},"5914":{"name":"Respiratory system","hitpoints":50,"defenceLevel":80},"5916":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5917":{"name":"Spawn","hitpoints":15,"combatLevel":60,"attackSpeed":4,"attackLevel":120,"strengthLevel":30,"defenceLevel":30,"rangeLevel":50,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"5918":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"5935":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5936":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"5938":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5939":{"name":"Wallasalki","hitpoints":120,"combatLevel":98,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":100,"stabDef":100,"slashDef":150,"crushDef":175,"magicDef":250},"5940":{"name":"Giant Rock Crab","hitpoints":180,"combatLevel":137,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":200,"rangeLevel":1,"magicLevel":1,"stabDef":225,"slashDef":200,"crushDef":175,"rangeDef":250},"5942":{"name":"Dagannoth","hitpoints":85,"combatLevel":88,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":75,"rangeLevel":100,"magicLevel":1,"slashDef":10,"crushDef":90,"rangeDef":150,"magicDef":200},"5943":{"name":"Dagannoth","hitpoints":95,"combatLevel":90,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"5944":{"name":"Rock lobster","hitpoints":150,"combatLevel":127,"attackSpeed":2,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":50,"rangeDef":150,"magicDef":50},"5946":{"name":"Suspicious water","hitpoints":100,"combatLevel":34},"5947":{"name":"Spinolyp","hitpoints":100,"combatLevel":76,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5948":{"name":"Suspicious water","hitpoints":100,"combatLevel":34},"5961":{"name":"Spinolyp","hitpoints":100,"combatLevel":76,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5962":{"name":"Suspicious water","hitpoints":100,"combatLevel":34},"5963":{"name":"Spinolyp","hitpoints":100,"combatLevel":76,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":100,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":50,"magicDef":50},"5964":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5965":{"name":"Khazard trooper","hitpoints":22,"combatLevel":19,"attackSpeed":5,"attackLevel":17,"strengthLevel":16,"defenceLevel":13,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":22,"bonusAttack":9,"bonusStrength":5},"5966":{"name":"Gnome troop","hitpoints":3,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"5967":{"name":"Gnome troop","hitpoints":3,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"stabDef":3,"slashDef":4,"crushDef":5,"rangeDef":4,"magicDef":2,"bonusAttack":2,"bonusStrength":3,"bonusRangeStrength":2},"5968":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5969":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"5970":{"name":"Gnome","hitpoints":3,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1,"bonusRangeStrength":2},"5971":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15,"bonusRangeStrength":2},"5972":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15,"bonusRangeStrength":2},"5973":{"name":"Mounted terrorbird gnome","hitpoints":55,"combatLevel":49,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":10,"magicDef":15,"bonusRangeStrength":2},"5977":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"6046":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6047":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6048":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6049":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"6050":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6051":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6052":{"name":"Black Guard Berserker","hitpoints":50,"combatLevel":66,"attackSpeed":3,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"bonusAttack":55,"bonusStrength":55},"6056":{"name":"Guard","hitpoints":50,"combatLevel":37,"attackSpeed":6,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":40,"magicLevel":1,"stabDef":18,"slashDef":23,"crushDef":27,"rangeDef":19,"magicDef":10,"bonusAttack":19,"bonusStrength":8,"bonusRangeStrength":8},"6065":{"name":"Tower Archer","hitpoints":30,"combatLevel":19,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":20,"magicLevel":1,"rangeDef":12,"magicDef":6,"bonusRangeStrength":16},"6066":{"name":"Tower Archer","hitpoints":50,"combatLevel":34,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":40,"magicLevel":1,"rangeDef":40,"magicDef":24,"bonusRangeStrength":22},"6067":{"name":"Tower Archer","hitpoints":70,"combatLevel":49,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":60,"magicLevel":1,"rangeDef":45,"magicDef":20,"bonusRangeStrength":31},"6068":{"name":"Tower Archer","hitpoints":90,"combatLevel":64,"attackSpeed":6,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":80,"magicLevel":1,"rangeDef":66,"magicDef":34,"bonusRangeStrength":49},"6075":{"name":"Tortoise","hitpoints":100,"combatLevel":79,"attackSpeed":4,"attackLevel":15,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6076":{"name":"Tortoise","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":30,"strengthLevel":100,"defenceLevel":80,"rangeLevel":50,"magicLevel":50},"6077":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6078":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6079":{"name":"Gnome child","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6081":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6082":{"name":"Gnome guard","hitpoints":31,"combatLevel":23,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"bonusAttack":8,"bonusStrength":13},"6086":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6087":{"name":"Gnome woman","hitpoints":2,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6094":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6095":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6096":{"name":"Gnome","hitpoints":3,"combatLevel":1,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"bonusRangeStrength":2},"6097":{"name":"Gnome Archer","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":6,"magicLevel":1},"6098":{"name":"Gnome Driver","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":5,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6099":{"name":"Gnome Mage","hitpoints":10,"combatLevel":5,"attackSpeed":6,"attackLevel":3,"strengthLevel":1,"defenceLevel":1,"rangeLevel":5,"magicLevel":1},"6102":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6103":{"name":"Bush snake","hitpoints":25,"combatLevel":35,"attackSpeed":3,"attackLevel":25,"strengthLevel":25,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6118":{"name":"Elvarg (hard)","hitpoints":240,"combatLevel":214,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":70,"rangeLevel":1,"magicLevel":210,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6119":{"name":"The Inadequacy (hard)","hitpoints":255,"combatLevel":600,"attackSpeed":4,"attackLevel":1128,"strengthLevel":340,"defenceLevel":240,"rangeLevel":340,"magicLevel":1},"6120":{"name":"The Everlasting (hard)","hitpoints":255,"combatLevel":365,"attackSpeed":6,"attackLevel":374,"strengthLevel":462,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6121":{"name":"The Untouchable (hard)","hitpoints":180,"combatLevel":440,"attackSpeed":6,"attackLevel":374,"strengthLevel":510,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6177":{"name":"Scion","hitpoints":50,"combatLevel":100,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":80,"rangeLevel":100,"magicLevel":1,"range":30,"bonusAttack":30,"bonusRangeStrength":30,"poisonImmune":true,"venomImmune":true},"6267":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6271":{"name":"Jungle spider","hitpoints":50,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":37,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"6272":{"name":"Large mosquito","hitpoints":3,"combatLevel":13,"attackSpeed":4,"attackLevel":5,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6273":{"name":"Mosquito swarm","hitpoints":9,"combatLevel":17,"attackSpeed":2,"attackLevel":10,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6291":{"name":"Tanglefoot (hard)","hitpoints":204,"combatLevel":199,"attackSpeed":4,"attackLevel":194,"strengthLevel":194,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6292":{"name":"Chronozon (hard)","hitpoints":120,"combatLevel":297,"attackSpeed":4,"attackLevel":346,"strengthLevel":344,"defenceLevel":173,"rangeLevel":1,"magicLevel":1},"6293":{"name":"Bouncer (hard)","hitpoints":232,"combatLevel":244,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6294":{"name":"Ice Troll King (hard)","hitpoints":255,"combatLevel":213,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6295":{"name":"Black demon (hard)","hitpoints":255,"combatLevel":292,"attackSpeed":4,"attackLevel":290,"strengthLevel":296,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"6297":{"name":"Glod (hard)","hitpoints":255,"combatLevel":276,"attackSpeed":4,"attackLevel":230,"strengthLevel":240,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6298":{"name":"Treus Dayth (hard)","hitpoints":240,"combatLevel":194,"attackSpeed":4,"attackLevel":168,"strengthLevel":168,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6299":{"name":"Black Knight Titan (hard)","hitpoints":255,"combatLevel":210,"attackSpeed":7,"attackLevel":182,"strengthLevel":200,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6300":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6301":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6302":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6303":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6304":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6305":{"name":"Dagannoth mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6306":{"name":"Evil Chicken (hard)","hitpoints":240,"combatLevel":286,"attackSpeed":4,"defenceLevel":126,"magicLevel":400},"6307":{"name":"Culinaromancer (hard)","hitpoints":255,"combatLevel":209,"attackSpeed":4,"attackLevel":40,"strengthLevel":400,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6308":{"name":"Agrith-Na-Na (hard)","hitpoints":255,"combatLevel":235,"attackSpeed":4,"attackLevel":166,"strengthLevel":300,"defenceLevel":82,"rangeLevel":200,"magicLevel":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6309":{"name":"Flambeed (hard)","hitpoints":255,"combatLevel":238,"attackSpeed":4,"attackLevel":240,"strengthLevel":240,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6310":{"name":"Karamel (hard)","hitpoints":255,"combatLevel":186,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":200,"magicLevel":1,"range":268,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":110},"6311":{"name":"Dessourt (hard)","hitpoints":255,"combatLevel":217,"attackSpeed":3,"attackLevel":198,"strengthLevel":198,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6312":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6313":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6314":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6315":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6316":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6317":{"name":"Gelatinnoth Mother (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":81,"rangeLevel":120,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6318":{"name":"Nezikchened (hard)","hitpoints":150,"combatLevel":295,"attackSpeed":5,"attackLevel":330,"strengthLevel":336,"defenceLevel":167,"rangeLevel":320,"magicLevel":320},"6319":{"name":"Tree spirit (hard)","hitpoints":187,"combatLevel":199,"attackSpeed":4,"attackLevel":200,"strengthLevel":209,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6320":{"name":"Me (hard)","hitpoints":135,"combatLevel":201,"attackSpeed":4,"attackLevel":225,"strengthLevel":234,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6321":{"name":"Jungle Demon (hard)","hitpoints":255,"combatLevel":327,"attackSpeed":6,"attackLevel":340,"strengthLevel":340,"defenceLevel":170,"rangeLevel":1,"magicLevel":340,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"6322":{"name":"The Kendal (hard)","hitpoints":150,"combatLevel":210,"attackSpeed":4,"attackLevel":195,"strengthLevel":195,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6323":{"name":"Giant Roc (hard)","hitpoints":255,"combatLevel":257,"attackSpeed":6,"attackLevel":260,"strengthLevel":260,"defenceLevel":100,"rangeLevel":260,"magicLevel":1,"magicDef":150},"6324":{"name":"Slagilith (hard)","hitpoints":150,"combatLevel":202,"attackSpeed":4,"attackLevel":150,"strengthLevel":300,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6325":{"name":"Moss Guardian (hard)","hitpoints":240,"combatLevel":182,"attackSpeed":6,"attackLevel":165,"strengthLevel":165,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"6326":{"name":"Skeleton Hellhound (hard)","hitpoints":132,"combatLevel":198,"attackSpeed":4,"attackLevel":168,"strengthLevel":264,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6327":{"name":"Agrith Naar (hard)","hitpoints":209,"combatLevel":196,"attackSpeed":4,"attackLevel":182,"strengthLevel":198,"defenceLevel":82,"rangeLevel":220,"magicLevel":220},"6329":{"name":"Khazard warlord (hard)","hitpoints":255,"combatLevel":192,"attackSpeed":4,"attackLevel":165,"strengthLevel":170,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6330":{"name":"Dad (hard)","hitpoints":240,"combatLevel":201,"attackSpeed":8,"attackLevel":132,"strengthLevel":264,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6331":{"name":"Arrg (hard)","hitpoints":255,"combatLevel":210,"attackSpeed":4,"attackLevel":140,"strengthLevel":280,"defenceLevel":40,"rangeLevel":140,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6332":{"name":"Count Draynor (hard)","hitpoints":210,"combatLevel":177,"attackSpeed":4,"attackLevel":198,"strengthLevel":165,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6333":{"name":"Witch's experiment (hard)","hitpoints":63,"combatLevel":47,"attackSpeed":4,"attackLevel":54,"strengthLevel":30,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6334":{"name":"Witch's experiment (second form) (hard)","hitpoints":93,"combatLevel":77,"attackSpeed":4,"attackLevel":84,"strengthLevel":60,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6335":{"name":"Witch's experiment (third form) (hard)","hitpoints":103,"combatLevel":90,"attackSpeed":4,"attackLevel":95,"strengthLevel":75,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6336":{"name":"Witch's experiment (fourth form) (hard)","hitpoints":113,"combatLevel":103,"attackSpeed":4,"attackLevel":105,"strengthLevel":88,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6337":{"name":"Nazastarool (hard)","hitpoints":154,"combatLevel":176,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6338":{"name":"Nazastarool (hard)","hitpoints":180,"combatLevel":153,"attackSpeed":4,"attackLevel":150,"strengthLevel":140,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6339":{"name":"Nazastarool (hard)","hitpoints":176,"combatLevel":181,"attackSpeed":4,"attackLevel":187,"strengthLevel":176,"defenceLevel":80},"6340":{"name":"Cow (hard)","hitpoints":160,"combatLevel":170,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6342":{"name":"Barrelchest","hitpoints":134,"combatLevel":190,"attackSpeed":5,"attackLevel":170,"strengthLevel":145,"defenceLevel":140,"rangeLevel":1,"magicLevel":90,"bonusAttack":80,"bonusStrength":80},"6343":{"name":"Giant scarab","hitpoints":130,"combatLevel":191,"attackSpeed":4,"attackLevel":169,"strengthLevel":190,"defenceLevel":169,"rangeLevel":190,"magicLevel":1,"stabDef":70,"slashDef":99,"crushDef":99,"rangeDef":149,"magicDef":159},"6344":{"name":"Dessous","hitpoints":200,"combatLevel":139,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6345":{"name":"Kamil","hitpoints":130,"combatLevel":154,"attackSpeed":4,"attackLevel":190,"strengthLevel":80,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":60,"crushDef":35,"bonusAttack":60,"bonusStrength":100},"6346":{"name":"Damis","hitpoints":90,"combatLevel":103,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":80},"6347":{"name":"Damis","hitpoints":200,"combatLevel":174,"attackSpeed":3,"attackLevel":160,"strengthLevel":100,"defenceLevel":160,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":120,"magicDef":80,"bonusStrength":100},"6348":{"name":"Fareed","hitpoints":130,"combatLevel":167,"attackSpeed":4,"attackLevel":190,"strengthLevel":120,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":100,"slashDef":100,"crushDef":100,"bonusStrength":120},"6349":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"6350":{"name":"The Inadequacy","hitpoints":180,"combatLevel":343,"attackSpeed":4,"attackLevel":564,"strengthLevel":170,"defenceLevel":240,"rangeLevel":170,"magicLevel":1},"6351":{"name":"The Everlasting","hitpoints":230,"combatLevel":223,"attackSpeed":6,"attackLevel":187,"strengthLevel":231,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6352":{"name":"The Untouchable","hitpoints":90,"combatLevel":274,"attackSpeed":6,"attackLevel":187,"strengthLevel":255,"defenceLevel":434,"rangeLevel":1,"magicLevel":1},"6353":{"name":"Tanglefoot","hitpoints":102,"combatLevel":111,"attackSpeed":4,"attackLevel":97,"strengthLevel":97,"defenceLevel":91,"rangeLevel":1,"magicLevel":1},"6354":{"name":"Chronozon","hitpoints":60,"combatLevel":170,"attackSpeed":4,"attackLevel":173,"strengthLevel":172,"defenceLevel":173,"rangeLevel":1,"magicLevel":1},"6355":{"name":"Bouncer","hitpoints":116,"combatLevel":137,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"6356":{"name":"Ice Troll King","hitpoints":150,"combatLevel":122,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":45,"slashDef":45,"crushDef":45,"rangeDef":2000,"magicDef":2000,"bonusAttack":60,"bonusStrength":60},"6357":{"name":"Black demon","hitpoints":157,"combatLevel":172,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"6358":{"name":"Glod","hitpoints":160,"combatLevel":138,"attackSpeed":4,"attackLevel":115,"strengthLevel":120,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":105,"slashDef":110,"crushDef":130,"rangeDef":100,"magicDef":125},"6359":{"name":"Treus Dayth","hitpoints":100,"combatLevel":95,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"6360":{"name":"Black Knight Titan","hitpoints":142,"combatLevel":120,"attackSpeed":7,"attackLevel":91,"strengthLevel":100,"defenceLevel":91,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":27,"crushDef":18,"rangeDef":1000,"magicDef":1000,"bonusAttack":27,"bonusStrength":22},"6361":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6362":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6363":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6364":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6365":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6366":{"name":"Dagannoth mother","hitpoints":120,"combatLevel":100,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6367":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6368":{"name":"Culinaromancer","hitpoints":150,"combatLevel":75,"attackSpeed":4,"attackLevel":10,"strengthLevel":100,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"6369":{"name":"Agrith-Na-Na","hitpoints":200,"combatLevel":146,"attackSpeed":4,"attackLevel":83,"strengthLevel":150,"defenceLevel":82,"rangeLevel":100,"magicLevel":100,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":100},"6370":{"name":"Flambeed","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":100},"6371":{"name":"Karamel","hitpoints":250,"combatLevel":136,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":100,"magicLevel":1,"range":134,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":150,"magicDef":150,"bonusRangeStrength":55},"6372":{"name":"Dessourt","hitpoints":130,"combatLevel":121,"attackSpeed":3,"attackLevel":99,"strengthLevel":99,"defenceLevel":99,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":150,"crushDef":150,"bonusAttack":50,"bonusStrength":50},"6373":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6374":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6375":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6376":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6377":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6378":{"name":"Gelatinnoth Mother","hitpoints":240,"combatLevel":130,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":50,"magicDef":50},"6379":{"name":"Nezikchened","hitpoints":150,"combatLevel":187,"attackSpeed":5,"attackLevel":165,"strengthLevel":168,"defenceLevel":167,"rangeLevel":160,"magicLevel":160},"6380":{"name":"Tree spirit","hitpoints":85,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6381":{"name":"Me","hitpoints":45,"combatLevel":79,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":74,"rangeLevel":1,"magicLevel":1},"6382":{"name":"Jungle Demon","hitpoints":170,"combatLevel":195,"attackSpeed":6,"attackLevel":170,"strengthLevel":170,"defenceLevel":170,"rangeLevel":1,"magicLevel":170,"slashDef":50,"magicDef":50,"bonusAttack":50,"bonusStrength":50},"6383":{"name":"The Kendal","hitpoints":50,"combatLevel":70,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":60,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":20,"bonusAttack":5,"bonusStrength":10},"6384":{"name":"Giant Roc","hitpoints":250,"combatLevel":172,"attackSpeed":6,"attackLevel":130,"strengthLevel":130,"defenceLevel":100,"rangeLevel":130,"magicLevel":1,"magicDef":150},"6385":{"name":"Slagilith","hitpoints":60,"combatLevel":92,"attackSpeed":4,"attackLevel":60,"strengthLevel":120,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":5,"rangeDef":50,"magicDef":5,"bonusAttack":10},"6386":{"name":"Moss Guardian","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"6387":{"name":"Skeleton Hellhound","hitpoints":55,"combatLevel":97,"attackSpeed":4,"attackLevel":70,"strengthLevel":110,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6388":{"name":"Agrith Naar","hitpoints":95,"combatLevel":100,"attackSpeed":4,"attackLevel":83,"strengthLevel":90,"defenceLevel":82,"rangeLevel":100,"magicLevel":100},"6390":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6391":{"name":"Dad","hitpoints":120,"combatLevel":101,"attackSpeed":8,"attackLevel":60,"strengthLevel":120,"defenceLevel":50,"stabDef":25,"slashDef":25,"crushDef":40,"rangeDef":200,"magicDef":200,"bonusAttack":40,"bonusStrength":70},"6392":{"name":"Arrg","hitpoints":140,"combatLevel":113,"attackSpeed":4,"attackLevel":70,"strengthLevel":140,"defenceLevel":40,"rangeLevel":70,"stabDef":35,"slashDef":60,"crushDef":35,"rangeDef":200,"magicDef":200,"bonusAttack":60,"bonusStrength":100},"6393":{"name":"Count Draynor","hitpoints":35,"combatLevel":34,"attackSpeed":4,"attackLevel":30,"strengthLevel":25,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":1,"crushDef":3},"6394":{"name":"Witch's experiment","hitpoints":21,"combatLevel":19,"attackSpeed":4,"attackLevel":18,"strengthLevel":10,"defenceLevel":19,"rangeLevel":1,"magicLevel":1},"6395":{"name":"Witch's experiment (second form)","hitpoints":31,"combatLevel":30,"attackSpeed":4,"attackLevel":28,"strengthLevel":20,"defenceLevel":29,"rangeLevel":1,"magicLevel":1},"6396":{"name":"Witch's experiment (third form)","hitpoints":41,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":30,"defenceLevel":39,"rangeLevel":1,"magicLevel":1},"6397":{"name":"Witch's experiment (fourth form)","hitpoints":51,"combatLevel":53,"attackSpeed":4,"attackLevel":48,"strengthLevel":40,"defenceLevel":49,"rangeLevel":1,"magicLevel":1},"6398":{"name":"Nazastarool","hitpoints":70,"combatLevel":91,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6399":{"name":"Nazastarool","hitpoints":70,"combatLevel":68,"attackSpeed":4,"attackLevel":58,"strengthLevel":54,"defenceLevel":58,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5,"magicDef":5,"bonusAttack":15,"bonusStrength":15},"6400":{"name":"Nazastarool","hitpoints":80,"combatLevel":93,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":80},"6401":{"name":"Cow","hitpoints":8,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"6402":{"name":"Mosquito swarm","hitpoints":15,"combatLevel":20,"attackSpeed":2,"attackLevel":15,"strengthLevel":1,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":2,"slashDef":2,"crushDef":5,"magicDef":2},"6406":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6407":{"name":"Tribesman","hitpoints":39,"combatLevel":32,"attackSpeed":4,"attackLevel":23,"strengthLevel":27,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":6,"crushDef":6,"bonusAttack":8,"bonusStrength":5},"6408":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6409":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6410":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6411":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6412":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6413":{"name":"Broodoo victim","hitpoints":100,"combatLevel":60,"attackSpeed":6,"defenceLevel":26,"rangeLevel":1,"magicLevel":60,"magic":25,"stabDef":20,"slashDef":20,"crushDef":20},"6434":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6435":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6436":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6437":{"name":"Cave goblin","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6438":{"name":"Animated steel armour","hitpoints":50,"combatLevel":53,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":2,"rangeLevel":2,"magicLevel":2,"stabDef":50,"slashDef":25,"crushDef":25,"rangeDef":400,"magicDef":400,"bonusAttack":4,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6440":{"name":"Giant skeleton","hitpoints":110,"combatLevel":100,"attackSpeed":6,"attackLevel":84,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"6441":{"name":"Skeleton","hitpoints":85,"combatLevel":94,"attackSpeed":6,"attackLevel":70,"strengthLevel":80,"defenceLevel":60,"rangeLevel":1,"magicLevel":110,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5},"6442":{"name":"Skeleton","hitpoints":80,"combatLevel":77,"attackSpeed":4,"attackLevel":72,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":5},"6443":{"name":"Skeleton","hitpoints":71,"combatLevel":81,"attackSpeed":4,"attackLevel":72,"strengthLevel":64,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":40},"6444":{"name":"Skeleton","hitpoints":40,"combatLevel":42,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40},"6445":{"name":"Skeleton","hitpoints":53,"combatLevel":59,"attackSpeed":4,"attackLevel":50,"strengthLevel":46,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40},"6446":{"name":"Skeleton","hitpoints":42,"combatLevel":42,"attackSpeed":4,"attackLevel":36,"strengthLevel":38,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40},"6447":{"name":"Skeleton","hitpoints":58,"combatLevel":63,"attackSpeed":4,"attackLevel":56,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40},"6448":{"name":"Skeleton","hitpoints":26,"combatLevel":40,"attackSpeed":4,"attackLevel":33,"strengthLevel":31,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40},"6449":{"name":"Zombie","hitpoints":38,"combatLevel":40,"attackSpeed":4,"attackLevel":36,"strengthLevel":35,"defenceLevel":33,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6450":{"name":"Zombie","hitpoints":40,"combatLevel":42,"attackSpeed":4,"attackLevel":39,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6451":{"name":"Zombie","hitpoints":42,"combatLevel":47,"attackSpeed":4,"attackLevel":42,"strengthLevel":39,"defenceLevel":42,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6452":{"name":"Zombie","hitpoints":48,"combatLevel":50,"attackSpeed":4,"attackLevel":44,"strengthLevel":42,"defenceLevel":44,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6453":{"name":"Zombie","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6454":{"name":"Zombie","hitpoints":57,"combatLevel":61,"attackSpeed":4,"attackLevel":53,"strengthLevel":55,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6455":{"name":"Zombie","hitpoints":63,"combatLevel":67,"attackSpeed":4,"attackLevel":56,"strengthLevel":58,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6456":{"name":"Zombie","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6457":{"name":"Zombie","hitpoints":68,"combatLevel":72,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6458":{"name":"Zombie","hitpoints":71,"combatLevel":76,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6459":{"name":"Zombie","hitpoints":73,"combatLevel":80,"attackSpeed":4,"attackLevel":72,"strengthLevel":73,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6460":{"name":"Zombie","hitpoints":75,"combatLevel":85,"attackSpeed":4,"attackLevel":71,"strengthLevel":81,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6461":{"name":"Zombie","hitpoints":76,"combatLevel":86,"attackSpeed":4,"attackLevel":74,"strengthLevel":80,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6462":{"name":"Zombie","hitpoints":81,"combatLevel":90,"attackSpeed":4,"attackLevel":82,"strengthLevel":80,"defenceLevel":72,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6463":{"name":"Zombie","hitpoints":92,"combatLevel":95,"attackSpeed":4,"attackLevel":85,"strengthLevel":80,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6464":{"name":"Zombie","hitpoints":96,"combatLevel":98,"attackSpeed":4,"attackLevel":85,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6465":{"name":"Zombie","hitpoints":102,"combatLevel":100,"attackSpeed":4,"attackLevel":86,"strengthLevel":83,"defenceLevel":81,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6466":{"name":"Zombie","hitpoints":76,"combatLevel":81,"attackSpeed":4,"attackLevel":69,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"6467":{"name":"Skeleton","hitpoints":69,"combatLevel":72,"attackSpeed":4,"attackLevel":75,"strengthLevel":61,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"6468":{"name":"Skeleton","hitpoints":92,"combatLevel":87,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":40,"rangeDef":40,"bonusStrength":15},"6469":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6470":{"name":"Animated spade","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"6473":{"name":"Terror dog","hitpoints":87,"combatLevel":110,"slayerLevel":40,"attackSpeed":4,"attackLevel":110,"strengthLevel":104,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"bonusStrength":20},"6474":{"name":"Terror dog","hitpoints":82,"combatLevel":100,"slayerLevel":40,"attackSpeed":4,"attackLevel":100,"strengthLevel":90,"defenceLevel":74,"rangeLevel":1,"magicLevel":1,"bonusStrength":10},"6476":{"name":"Tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6477":{"name":"Mutant tarn","hitpoints":80,"combatLevel":69,"slayerLevel":40,"attackSpeed":4,"attackLevel":40,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"6492":{"name":"Kree'arra","hitpoints":255,"combatLevel":580,"attackSpeed":3,"attackLevel":300,"strengthLevel":200,"defenceLevel":260,"rangeLevel":380,"magicLevel":200,"range":120,"stabDef":180,"slashDef":180,"crushDef":180,"rangeDef":200,"magicDef":200,"bonusAttack":136,"bonusStrength":12,"bonusRangeStrength":50},"6493":{"name":"Commander Zilyana","hitpoints":255,"combatLevel":596,"attackSpeed":2,"attackLevel":280,"strengthLevel":196,"defenceLevel":300,"rangeLevel":250,"magicLevel":300,"magic":200,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":100,"bonusAttack":195,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"6494":{"name":"General Graardor","hitpoints":255,"combatLevel":624,"attackSpeed":6,"attackLevel":280,"strengthLevel":350,"defenceLevel":250,"rangeLevel":350,"magicLevel":80,"range":100,"stabDef":90,"slashDef":90,"crushDef":90,"rangeDef":90,"magicDef":298,"bonusAttack":120,"bonusStrength":43,"bonusRangeStrength":40,"poisonImmune":true,"venomImmune":true},"6495":{"name":"K'ril Tsutsaroth","hitpoints":255,"combatLevel":650,"attackSpeed":6,"attackLevel":340,"strengthLevel":300,"defenceLevel":270,"rangeLevel":1,"magicLevel":200,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":80,"magicDef":130,"bonusAttack":160,"bonusStrength":31},"6496":{"name":"Dagannoth Supreme","hitpoints":255,"combatLevel":303,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":128,"rangeLevel":255,"magicLevel":255,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":550,"magicDef":255},"6497":{"name":"Dagannoth Prime","hitpoints":255,"combatLevel":303,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"magicLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":10,"magicDef":255},"6498":{"name":"Dagannoth Rex","hitpoints":255,"combatLevel":303,"attackSpeed":4,"attackLevel":255,"strengthLevel":255,"defenceLevel":255,"rangeLevel":255,"stabDef":255,"slashDef":255,"crushDef":255,"rangeDef":255,"magicDef":10},"6499":{"name":"Giant Mole","hitpoints":200,"combatLevel":230,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":200,"stabDef":60,"slashDef":80,"crushDef":100,"rangeDef":60,"magicDef":80},"6500":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":100,"magicDef":100},"6501":{"name":"Kalphite Queen","hitpoints":255,"combatLevel":333,"attackSpeed":4,"attackLevel":300,"strengthLevel":300,"defenceLevel":300,"rangeLevel":1,"magicLevel":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":10,"magicDef":10},"6503":{"name":"Callisto","hitpoints":255,"combatLevel":470,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6504":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6505":{"name":"Chaos Elemental","hitpoints":250,"combatLevel":305,"attackSpeed":5,"attackLevel":270,"strengthLevel":270,"defenceLevel":270,"rangeLevel":270,"magicLevel":270,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":70,"magicDef":70},"6506":{"name":"TzTok-Jad","hitpoints":250,"combatLevel":702,"attackSpeed":8,"attackLevel":640,"strengthLevel":960,"defenceLevel":480,"rangeLevel":960,"magicLevel":480,"magic":60},"6574":{"name":"Gnome guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6575":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6576":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6579":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6580":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6581":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6582":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6583":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6587":{"name":"Armadylian guard","hitpoints":132,"combatLevel":97,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":82,"rangeLevel":90,"magicLevel":80,"magicDef":3},"6588":{"name":"Bandosian guard","hitpoints":130,"combatLevel":125,"attackSpeed":5,"attackLevel":110,"strengthLevel":115,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":12,"slashDef":14,"crushDef":13,"rangeDef":13,"magicDef":5,"bonusAttack":19,"bonusStrength":4,"poisonImmune":true},"6593":{"name":"Lava dragon","hitpoints":230,"combatLevel":252,"attackSpeed":4,"attackLevel":240,"strengthLevel":220,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":70,"slashDef":90,"crushDef":90,"rangeDef":70,"magicDef":80},"6594":{"name":"Ent","hitpoints":105,"combatLevel":101,"attackSpeed":4,"attackLevel":80,"strengthLevel":95,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40},"6596":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"6597":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"6598":{"name":"Zombie","hitpoints":24,"combatLevel":18,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1},"6600":{"name":"Runite Golem","hitpoints":170,"combatLevel":178,"attackSpeed":4,"attackLevel":140,"strengthLevel":150,"defenceLevel":165,"rangeLevel":1,"magicLevel":1},"6603":{"name":"Rogue","hitpoints":125,"combatLevel":135,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":150,"rangeLevel":1,"magicLevel":1},"6604":{"name":"Mammoth","hitpoints":130,"combatLevel":80,"attackSpeed":4,"attackLevel":55,"strengthLevel":60,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"6605":{"name":"Bandit","hitpoints":155,"combatLevel":130,"attackSpeed":4,"attackLevel":57,"strengthLevel":57,"defenceLevel":57,"rangeLevel":1,"magicLevel":1,"slashDef":23,"crushDef":22,"bonusAttack":57,"bonusStrength":52},"6606":{"name":"Dark warrior","hitpoints":165,"combatLevel":145,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":55,"rangeLevel":1,"magicLevel":1,"stabDef":106,"slashDef":109,"crushDef":139,"bonusAttack":80,"bonusStrength":76},"6607":{"name":"Elder Chaos druid","hitpoints":150,"combatLevel":129,"attackSpeed":4,"attackLevel":98,"strengthLevel":98,"defenceLevel":65,"rangeLevel":1,"magicLevel":110},"6608":{"name":"Ankou","hitpoints":70,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"6609":{"name":"Callisto","hitpoints":255,"combatLevel":470,"attackSpeed":4,"attackLevel":350,"strengthLevel":370,"defenceLevel":440,"rangeLevel":1,"magicLevel":1,"stabDef":135,"slashDef":104,"crushDef":175,"rangeDef":230,"magicDef":900,"poisonImmune":true,"venomImmune":true},"6610":{"name":"Venenatis","hitpoints":255,"combatLevel":464,"attackLevel":470,"strengthLevel":490,"defenceLevel":490,"rangeLevel":1,"magicLevel":150,"stabDef":260,"slashDef":260,"crushDef":260,"rangeDef":100,"magicDef":850,"poisonImmune":true,"venomImmune":true},"6611":{"name":"Vet'ion","hitpoints":255,"combatLevel":454,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250},"6612":{"name":"Vet'ion Reborn","hitpoints":255,"combatLevel":454,"attackSpeed":4,"attackLevel":430,"strengthLevel":430,"defenceLevel":395,"rangeLevel":1,"magicLevel":300,"stabDef":201,"slashDef":200,"rangeDef":270,"magicDef":250},"6613":{"name":"Skeleton Hellhound","hitpoints":110,"combatLevel":214,"attackSpeed":4,"attackLevel":210,"strengthLevel":250,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":101,"slashDef":103,"crushDef":10,"rangeDef":266,"magicDef":180},"6614":{"name":"Greater Skeleton Hellhound","hitpoints":190,"combatLevel":281,"attackSpeed":4,"attackLevel":240,"strengthLevel":310,"defenceLevel":220,"rangeLevel":1,"magicLevel":1,"stabDef":150,"slashDef":163,"crushDef":20,"rangeDef":275,"magicDef":210},"6615":{"name":"Scorpia","hitpoints":200,"combatLevel":225,"attackSpeed":4,"attackLevel":250,"strengthLevel":150,"defenceLevel":180,"rangeLevel":1,"magicLevel":1,"stabDef":246,"slashDef":284,"crushDef":284,"rangeDef":284,"magicDef":44,"bonusAttack":60},"6616":{"name":"Scorpia's offspring","hitpoints":2,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":30,"magicLevel":1,"range":900},"6617":{"name":"Scorpia's guardian","hitpoints":70,"combatLevel":47,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":30,"magicLevel":30},"6618":{"name":"Crazy archaeologist","hitpoints":225,"combatLevel":204,"attackSpeed":3,"attackLevel":160,"strengthLevel":90,"defenceLevel":240,"rangeLevel":180,"magicLevel":1,"range":75,"stabDef":5,"slashDef":5,"crushDef":30,"rangeDef":250,"bonusAttack":250,"bonusStrength":25},"6619":{"name":"Chaos Fanatic","hitpoints":225,"combatLevel":202,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":200,"range":75,"stabDef":260,"slashDef":260,"crushDef":250,"rangeDef":80,"magicDef":280},"6624":{"name":"Energy sprite","hitpoints":62},"6698":{"name":"Ghost guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6699":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6700":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6701":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6702":{"name":"Guard","hitpoints":800,"combatLevel":1337,"attackSpeed":4,"attackLevel":800,"strengthLevel":400,"defenceLevel":300,"rangeLevel":1,"magicLevel":1,"stabDef":8,"slashDef":9,"crushDef":7,"rangeDef":8,"bonusAttack":60,"bonusStrength":7},"6716":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380},"6723":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380},"6725":{"name":"Rock Golem","combatLevel":14,"attackSpeed":4},"6726":{"name":"Rock Golem","combatLevel":29,"attackSpeed":4},"6727":{"name":"Rock Golem","combatLevel":49,"attackSpeed":4},"6728":{"name":"Rock Golem","hitpoints":86,"combatLevel":79,"attackSpeed":4},"6729":{"name":"Rock Golem","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":75,"magicLevel":1},"6730":{"name":"Rock Golem","hitpoints":166,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":80,"magicLevel":1},"6732":{"name":"River troll","combatLevel":14,"attackSpeed":4,"attackLevel":17,"strengthLevel":17,"defenceLevel":17,"rangeLevel":1,"magicLevel":1},"6733":{"name":"River troll","combatLevel":29,"attackSpeed":4,"attackLevel":32,"strengthLevel":32,"defenceLevel":32,"rangeLevel":1,"magicLevel":1},"6734":{"name":"River troll","combatLevel":49,"attackSpeed":4,"attackLevel":48,"strengthLevel":48,"defenceLevel":48,"rangeLevel":1,"magicLevel":1},"6735":{"name":"River troll","hitpoints":85,"combatLevel":79,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1},"6736":{"name":"River troll","hitpoints":120,"combatLevel":120,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"6737":{"name":"River troll","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6739":{"name":"Evil Chicken","hitpoints":120,"combatLevel":159,"attackSpeed":4,"defenceLevel":126,"magicLevel":200},"6740":{"name":"Shade","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6741":{"name":"Zombie","hitpoints":170,"combatLevel":159,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1},"6762":{"name":"Pyrelord","hitpoints":80,"combatLevel":60,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"6766":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6767":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"6794":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6795":{"name":"Pyrelord","hitpoints":80,"combatLevel":60,"slayerLevel":30,"attackSpeed":4,"attackLevel":60,"strengthLevel":40,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":10,"rangeDef":10},"6805":{"name":"Kruk","hitpoints":210,"combatLevel":149,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":150,"rangeLevel":170,"magicLevel":130,"range":150,"stabDef":100,"slashDef":100,"crushDef":100,"rangeDef":100,"magicDef":250,"bonusAttack":160,"bonusStrength":90,"bonusRangeStrength":70},"6813":{"name":"Monkey Archer","hitpoints":50,"combatLevel":86,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":110,"magicLevel":1},"6815":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6818":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6824":{"name":"Giant bat","hitpoints":32,"combatLevel":27,"attackSpeed":4,"attackLevel":22,"strengthLevel":22,"defenceLevel":22,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":12,"rangeDef":8,"magicDef":10},"6896":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6897":{"name":"Gangster","hitpoints":40,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":20,"bonusStrength":30},"6898":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6899":{"name":"Gangster","hitpoints":50,"combatLevel":50,"attackSpeed":5,"attackLevel":50,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"bonusAttack":35,"bonusStrength":15},"6900":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6901":{"name":"Gang boss","hitpoints":80,"combatLevel":83,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6902":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6903":{"name":"Gang boss","hitpoints":80,"combatLevel":76,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":70,"rangeLevel":80,"magicLevel":1,"range":50,"crushDef":10},"6904":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6905":{"name":"Soldier (tier 1)","hitpoints":50,"combatLevel":39,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":12,"bonusStrength":11,"poisonImmune":true,"venomImmune":true},"6906":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6907":{"name":"Soldier (tier 2)","hitpoints":50,"combatLevel":48,"attackSpeed":4,"attackLevel":40,"strengthLevel":40,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"bonusAttack":25,"bonusStrength":30,"poisonImmune":true,"venomImmune":true},"6908":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6909":{"name":"Soldier (tier 3)","hitpoints":55,"combatLevel":58,"attackSpeed":5,"attackLevel":50,"strengthLevel":50,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"bonusAttack":20,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6910":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6911":{"name":"Soldier (tier 4)","hitpoints":65,"combatLevel":70,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"stabDef":1,"slashDef":1,"bonusAttack":10,"bonusStrength":8,"poisonImmune":true,"venomImmune":true},"6912":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6913":{"name":"Soldier (tier 5)","hitpoints":90,"combatLevel":99,"attackSpeed":4,"attackLevel":85,"strengthLevel":85,"defenceLevel":86,"rangeLevel":1,"magicLevel":1,"bonusAttack":5,"bonusStrength":5,"poisonImmune":true,"venomImmune":true},"6914":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6915":{"name":"Lizardman","hitpoints":60,"combatLevel":53,"attackSpeed":4,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":43,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"6916":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6917":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"6918":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6919":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"6956":{"name":"Monk","hitpoints":15,"combatLevel":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"6987":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6988":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6989":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6990":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6991":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6992":{"name":"Woman","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"6993":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"slashDef":1,"bonusAttack":9,"bonusStrength":10},"6994":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":2,"bonusAttack":8,"bonusStrength":10},"6995":{"name":"Pirate","hitpoints":20,"combatLevel":23,"attackSpeed":5,"attackLevel":21,"strengthLevel":21,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":2,"bonusAttack":8,"bonusStrength":10},"6996":{"name":"Mugger","hitpoints":8,"combatLevel":6,"attackSpeed":4,"attackLevel":5,"strengthLevel":5,"defenceLevel":5,"rangeLevel":1,"magicLevel":1},"7016":{"name":"Kourend guard","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":25,"crushDef":19,"rangeDef":20,"bonusAttack":9,"bonusStrength":7},"7017":{"name":"Kourend head guard","hitpoints":86,"combatLevel":84,"attackSpeed":4,"attackLevel":75,"strengthLevel":73,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":16,"slashDef":16,"crushDef":18,"rangeDef":27,"bonusAttack":17,"bonusStrength":15},"7018":{"name":"Reanimated goblin","hitpoints":5,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7019":{"name":"Reanimated monkey","hitpoints":5,"attackSpeed":4,"attackLevel":2,"strengthLevel":2,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"7020":{"name":"Reanimated imp","hitpoints":5,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7021":{"name":"Reanimated minotaur","hitpoints":10,"attackSpeed":4,"attackLevel":12,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"7022":{"name":"Reanimated scorpion","hitpoints":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":12,"defenceLevel":11,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"magicDef":5},"7023":{"name":"Reanimated bear","hitpoints":15,"attackSpeed":4,"attackLevel":17,"strengthLevel":18,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"7024":{"name":"Reanimated unicorn","hitpoints":15,"attackSpeed":4,"attackLevel":11,"strengthLevel":13,"defenceLevel":13,"rangeLevel":1,"magicLevel":1},"7025":{"name":"Reanimated dog","hitpoints":35,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"7026":{"name":"Reanimated chaos druid","hitpoints":35,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":10},"7027":{"name":"Reanimated giant","hitpoints":35,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"7028":{"name":"Reanimated ogre","hitpoints":35,"attackSpeed":6,"attackLevel":43,"strengthLevel":43,"defenceLevel":43,"rangeLevel":1,"magicLevel":1,"bonusAttack":22,"bonusStrength":20},"7029":{"name":"Reanimated elf","hitpoints":35,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":20,"crushDef":40,"rangeDef":50,"magicDef":60},"7030":{"name":"Reanimated troll","hitpoints":35,"attackSpeed":4,"attackLevel":40,"strengthLevel":75,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"crushDef":10,"rangeDef":200,"magicDef":200,"bonusAttack":20,"bonusStrength":20},"7031":{"name":"Reanimated horror","hitpoints":35,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":55,"rangeLevel":1,"magicLevel":1},"7032":{"name":"Reanimated kalphite","hitpoints":35,"attackSpeed":4,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":5,"rangeDef":50,"magicDef":50},"7033":{"name":"Reanimated dagannoth","hitpoints":35,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":81,"rangeLevel":50,"magicLevel":1},"7034":{"name":"Reanimated bloodveld","hitpoints":35,"slayerLevel":50,"attackSpeed":4,"attackLevel":75,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"7035":{"name":"Reanimated TzHaar","hitpoints":35,"attackSpeed":5,"attackLevel":120,"strengthLevel":140,"defenceLevel":120,"rangeLevel":1,"magicLevel":40},"7036":{"name":"Reanimated demon","hitpoints":35,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7037":{"name":"Reanimated aviansie","hitpoints":35,"attackSpeed":5,"attackLevel":71,"strengthLevel":1,"defenceLevel":70,"rangeLevel":1,"magicLevel":1},"7038":{"name":"Reanimated abyssal","hitpoints":35,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"7039":{"name":"Reanimated dragon","hitpoints":35,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"7095":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7096":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7097":{"name":"Tortured gorilla","hitpoints":110,"combatLevel":142,"attackSpeed":4,"attackLevel":180,"strengthLevel":90,"defenceLevel":110,"rangeLevel":1,"magicLevel":110,"bonusAttack":90,"bonusStrength":123},"7101":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7102":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7103":{"name":"Glough","hitpoints":575,"combatLevel":378,"attackSpeed":6,"attackLevel":260,"strengthLevel":270,"defenceLevel":248,"rangeLevel":262,"magicLevel":250,"range":100,"magic":80,"bonusAttack":122,"bonusStrength":75,"bonusRangeStrength":40,"bonusMagicDamage":40},"7104":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7105":{"name":"Keef","hitpoints":180,"combatLevel":178,"attackSpeed":5,"attackLevel":165,"strengthLevel":120,"defenceLevel":165,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"bonusAttack":190,"bonusStrength":170},"7106":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7107":{"name":"Kob","hitpoints":200,"combatLevel":185,"attackSpeed":5,"attackLevel":180,"strengthLevel":175,"defenceLevel":80,"stabDef":85,"slashDef":85,"crushDef":90,"rangeDef":200,"magicDef":200,"bonusAttack":200,"bonusStrength":135,"poisonImmune":true,"venomImmune":true},"7118":{"name":"Maniacal monkey","hitpoints":65,"combatLevel":140,"attackSpeed":4,"attackLevel":200,"strengthLevel":175,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"7119":{"name":"Maniacal Monkey Archer","hitpoints":60,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":80,"rangeLevel":200,"magicLevel":1},"7144":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29},"7145":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29},"7146":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29},"7147":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29},"7148":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29},"7149":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29},"7150":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7151":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7152":{"name":"Demonic gorilla","hitpoints":380,"combatLevel":275,"attackSpeed":5,"attackLevel":205,"strengthLevel":195,"defenceLevel":200,"rangeLevel":195,"magicLevel":195,"range":43,"magic":40,"magicDef":50,"bonusAttack":43,"bonusStrength":29,"bonusRangeStrength":29},"7153":{"name":"Tortured gorilla","hitpoints":210,"combatLevel":141,"attackSpeed":5,"attackLevel":105,"strengthLevel":95,"defenceLevel":95,"rangeLevel":95,"magicLevel":95,"range":22,"magic":20,"magicDef":25,"bonusAttack":22,"bonusStrength":16,"bonusRangeStrength":16,"bonusMagicDamage":16},"7206":{"name":"Sand Crab","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7207":{"name":"Sandy rocks","hitpoints":60,"combatLevel":15,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7209":{"name":"Guard dog","hitpoints":49,"combatLevel":44,"attackSpeed":4,"attackLevel":35,"strengthLevel":36,"defenceLevel":37,"rangeLevel":1,"magicLevel":1},"7234":{"name":"Ent","hitpoints":75,"combatLevel":86,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":30,"magicDef":40,"bonusAttack":35,"bonusStrength":65},"7238":{"name":"Forester","hitpoints":17,"combatLevel":15,"attackSpeed":4,"attackLevel":14,"strengthLevel":13,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":4,"slashDef":3,"crushDef":5},"7241":{"name":"Abyssal demon","hitpoints":150,"combatLevel":124,"slayerLevel":85,"attackSpeed":4,"attackLevel":97,"strengthLevel":67,"defenceLevel":135,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20},"7242":{"name":"Black demon","hitpoints":170,"combatLevel":184,"attackSpeed":4,"attackLevel":155,"strengthLevel":158,"defenceLevel":162,"rangeLevel":1,"magicLevel":1},"7243":{"name":"Black demon","hitpoints":160,"combatLevel":178,"attackSpeed":4,"attackLevel":145,"strengthLevel":148,"defenceLevel":175,"rangeLevel":1,"magicLevel":1},"7244":{"name":"Greater demon","hitpoints":120,"combatLevel":101,"attackSpeed":4,"attackLevel":90,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7245":{"name":"Greater demon","hitpoints":115,"combatLevel":100,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7246":{"name":"Greater demon","hitpoints":130,"combatLevel":113,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7247":{"name":"Lesser demon","hitpoints":87,"combatLevel":87,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7248":{"name":"Lesser demon","hitpoints":98,"combatLevel":94,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":85,"rangeLevel":1,"magicLevel":1},"7249":{"name":"Dust devil","hitpoints":130,"combatLevel":110,"slayerLevel":65,"attackSpeed":4,"attackLevel":120,"strengthLevel":90,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"7250":{"name":"Dark beast","hitpoints":220,"combatLevel":182,"slayerLevel":90,"attackSpeed":4,"attackLevel":140,"strengthLevel":160,"defenceLevel":120,"rangeLevel":1,"magicLevel":160,"stabDef":30,"slashDef":40,"crushDef":100,"rangeDef":100,"magicDef":90},"7251":{"name":"Fire giant","hitpoints":150,"combatLevel":109,"attackSpeed":5,"attackLevel":90,"strengthLevel":80,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7252":{"name":"Fire giant","hitpoints":130,"combatLevel":104,"attackSpeed":5,"attackLevel":65,"strengthLevel":65,"defenceLevel":120,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":10,"crushDef":10,"magicDef":50,"bonusAttack":50,"bonusStrength":20},"7253":{"name":"Bronze dragon","hitpoints":122,"combatLevel":143,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":112,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"7254":{"name":"Iron dragon","hitpoints":195,"combatLevel":215,"attackSpeed":4,"attackLevel":185,"strengthLevel":185,"defenceLevel":185,"rangeLevel":1,"magicLevel":120,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"7255":{"name":"Steel dragon","hitpoints":250,"combatLevel":274,"attackSpeed":4,"attackLevel":235,"strengthLevel":235,"defenceLevel":235,"rangeLevel":1,"magicLevel":130,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"7256":{"name":"Hellhound","hitpoints":116,"combatLevel":122,"attackSpeed":4,"attackLevel":105,"strengthLevel":104,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7257":{"name":"Ankou","hitpoints":60,"combatLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7258":{"name":"Shade","hitpoints":115,"combatLevel":140,"attackSpeed":6,"attackLevel":130,"strengthLevel":136,"defenceLevel":100,"rangeLevel":50,"magicLevel":50},"7259":{"name":"Dagannoth","hitpoints":70,"combatLevel":74,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":50,"rangeLevel":1,"magicLevel":1},"7260":{"name":"Dagannoth","hitpoints":120,"combatLevel":92,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7261":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"7262":{"name":"Moss giant","hitpoints":60,"combatLevel":42,"attackSpeed":6,"attackLevel":30,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"bonusAttack":33,"bonusStrength":31},"7263":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"7264":{"name":"Ghost","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":13,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"crushDef":5,"rangeDef":5},"7265":{"name":"Skeleton","hitpoints":29,"combatLevel":22,"attackSpeed":4,"attackLevel":15,"strengthLevel":18,"defenceLevel":17,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":5,"rangeDef":5},"7266":{"name":"King Sand Crab","hitpoints":200,"combatLevel":107,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7267":{"name":"Sandy Boulder","hitpoints":200,"combatLevel":107,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7268":{"name":"Possessed pickaxe","hitpoints":40,"combatLevel":50,"attackSpeed":4,"attackLevel":40,"strengthLevel":55,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7269":{"name":"Magic axe","hitpoints":44,"combatLevel":42,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":29,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":5,"crushDef":15,"rangeDef":10,"magicDef":5},"7270":{"name":"Cyclops","hitpoints":100,"combatLevel":76,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7271":{"name":"Cyclops","hitpoints":75,"combatLevel":56,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":35,"rangeLevel":1,"magicLevel":1},"7272":{"name":"Twisted Banshee","hitpoints":100,"combatLevel":89,"slayerLevel":15,"attackSpeed":4,"attackLevel":75,"strengthLevel":85,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":15,"crushDef":15,"rangeDef":15},"7273":{"name":"Brutal blue dragon","hitpoints":245,"combatLevel":271,"attackSpeed":4,"attackLevel":298,"strengthLevel":198,"defenceLevel":198,"magicLevel":198,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true},"7274":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true},"7275":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"7276":{"name":"Mutated Bloodveld","hitpoints":170,"combatLevel":123,"slayerLevel":50,"attackSpeed":4,"attackLevel":110,"strengthLevel":115,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"7277":{"name":"Warped Jelly","hitpoints":140,"combatLevel":112,"slayerLevel":52,"attackSpeed":4,"attackLevel":95,"strengthLevel":90,"defenceLevel":70,"rangeLevel":1,"magicLevel":95},"7278":{"name":"Greater Nechryael","hitpoints":205,"combatLevel":200,"slayerLevel":80,"attackSpeed":4,"attackLevel":197,"strengthLevel":197,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50},"7279":{"name":"Deviant spectre","hitpoints":190,"combatLevel":169,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":90,"rangeLevel":1,"magicLevel":205,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":85},"7286":{"name":"Skotizo","hitpoints":450,"combatLevel":321,"attackSpeed":6,"attackLevel":240,"strengthLevel":250,"defenceLevel":200,"rangeLevel":1,"magicLevel":280,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":130,"magicDef":130,"bonusAttack":160,"bonusStrength":31,"poisonImmune":true,"venomImmune":true},"7287":{"name":"Reanimated demon spawn","hitpoints":85,"combatLevel":87,"attackSpeed":4,"attackLevel":80,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7288":{"name":"Awakened Altar","hitpoints":100},"7290":{"name":"Awakened Altar","hitpoints":100},"7292":{"name":"Awakened Altar","hitpoints":100},"7294":{"name":"Awakened Altar","hitpoints":100},"7296":{"name":"Dark Ankou","hitpoints":60,"combatLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":70,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7307":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":1,"magicLevel":150},"7308":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":98,"attackSpeed":4,"attackLevel":50,"strengthLevel":30,"defenceLevel":20,"rangeLevel":150,"magicLevel":80,"bonusRangeStrength":30},"7309":{"name":"Ancient Wizard","hitpoints":80,"combatLevel":112,"attackSpeed":4,"attackLevel":120,"strengthLevel":150,"defenceLevel":20,"rangeLevel":1,"magicLevel":80,"bonusAttack":80,"bonusStrength":80},"7310":{"name":"Brassican Mage","hitpoints":150,"combatLevel":140,"attackSpeed":3,"attackLevel":80,"strengthLevel":70,"defenceLevel":80,"rangeLevel":140,"magicLevel":170},"7312":{"name":"Double agent","hitpoints":160,"combatLevel":141,"attackSpeed":4,"attackLevel":130,"strengthLevel":105,"defenceLevel":100,"rangeLevel":1,"magicLevel":95,"stabDef":20,"slashDef":20,"crushDef":20,"bonusAttack":40,"bonusStrength":40},"7322":{"name":"Wild dog","hitpoints":62,"combatLevel":63,"attackSpeed":4,"attackLevel":53,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1},"7388":{"name":"Crushing hand","hitpoints":55,"combatLevel":45,"slayerLevel":5,"attackSpeed":4,"attackLevel":45,"strengthLevel":42,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"poisonImmune":true},"7389":{"name":"Chasm Crawler","hitpoints":64,"combatLevel":68,"slayerLevel":10,"attackSpeed":4,"attackLevel":22,"strengthLevel":18,"defenceLevel":18,"rangeLevel":1,"magicLevel":1,"stabDef":10,"slashDef":10,"crushDef":5,"rangeDef":10,"magicDef":5},"7390":{"name":"Screaming banshee","hitpoints":61,"combatLevel":70,"slayerLevel":15,"attackSpeed":4,"attackLevel":65,"strengthLevel":61,"defenceLevel":56,"rangeLevel":1,"magicLevel":1,"stabDef":13,"slashDef":13,"crushDef":13,"rangeDef":13,"poisonImmune":true,"venomImmune":true},"7391":{"name":"Screaming twisted banshee","hitpoints":220,"combatLevel":144,"slayerLevel":15,"attackSpeed":4,"attackLevel":103,"strengthLevel":110,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"poisonImmune":true,"venomImmune":true},"7392":{"name":"Giant rockslug","hitpoints":77,"combatLevel":86,"slayerLevel":20,"attackSpeed":6,"attackLevel":72,"strengthLevel":77,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"7393":{"name":"Cockathrice","hitpoints":95,"combatLevel":89,"slayerLevel":25,"attackSpeed":4,"attackLevel":63,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"magicDef":20,"poisonImmune":true,"venomImmune":true},"7394":{"name":"Flaming pyrelord","hitpoints":126,"combatLevel":97,"slayerLevel":30,"attackSpeed":4,"attackLevel":98,"strengthLevel":65,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":18,"crushDef":18,"rangeDef":18,"poisonImmune":true,"venomImmune":true},"7395":{"name":"Monstrous basilisk","hitpoints":170,"combatLevel":135,"slayerLevel":40,"attackSpeed":4,"attackLevel":88,"strengthLevel":98,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":35,"slashDef":35,"magicDef":35,"poisonImmune":true,"venomImmune":true},"7396":{"name":"Malevolent Mage","hitpoints":175,"combatLevel":162,"slayerLevel":45,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":135,"rangeLevel":1,"magicLevel":175,"poisonImmune":true,"venomImmune":true},"7397":{"name":"Insatiable Bloodveld","hitpoints":380,"combatLevel":202,"slayerLevel":50,"attackSpeed":4,"attackLevel":190,"strengthLevel":145,"defenceLevel":85,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7398":{"name":"Insatiable mutated Bloodveld","hitpoints":410,"combatLevel":278,"slayerLevel":50,"attackSpeed":4,"attackLevel":250,"strengthLevel":190,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"venomImmune":true},"7399":{"name":"Vitreous Jelly","hitpoints":190,"combatLevel":206,"slayerLevel":52,"attackSpeed":4,"attackLevel":170,"strengthLevel":150,"defenceLevel":220,"rangeLevel":1,"magicLevel":150},"7400":{"name":"Vitreous warped Jelly","hitpoints":220,"combatLevel":241,"slayerLevel":52,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":250,"rangeLevel":1,"magicLevel":180},"7401":{"name":"Cave abomination","hitpoints":130,"combatLevel":206,"slayerLevel":58,"attackLevel":230,"strengthLevel":195,"defenceLevel":142,"rangeLevel":1,"magicLevel":230},"7402":{"name":"Abhorrent spectre","hitpoints":250,"combatLevel":253,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":180,"rangeLevel":1,"magicLevel":300,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":30,"venomImmune":true},"7403":{"name":"Repugnant spectre","hitpoints":390,"combatLevel":335,"slayerLevel":60,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":220,"rangeLevel":1,"magicLevel":380,"stabDef":120,"slashDef":120,"crushDef":120,"rangeDef":115,"venomImmune":true},"7404":{"name":"Choke devil","hitpoints":300,"combatLevel":264,"slayerLevel":65,"attackSpeed":4,"attackLevel":260,"strengthLevel":230,"defenceLevel":120,"rangeLevel":1,"magicLevel":1},"7405":{"name":"King kurask","hitpoints":420,"combatLevel":295,"slayerLevel":70,"attackSpeed":4,"attackLevel":190,"strengthLevel":320,"defenceLevel":250,"rangeLevel":1,"magicLevel":1,"slashDef":50,"crushDef":50,"poisonImmune":true,"venomImmune":true},"7406":{"name":"Nuclear smoke devil","hitpoints":240,"combatLevel":280,"slayerLevel":93,"attackSpeed":4,"attackLevel":240,"strengthLevel":230,"defenceLevel":390,"rangeLevel":280,"magicLevel":1,"rangeDef":80,"magicDef":850,"poisonImmune":true,"venomImmune":true},"7407":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7408":{"name":"Marble gargoyle","hitpoints":270,"combatLevel":349,"slayerLevel":75,"attackSpeed":4,"attackLevel":230,"strengthLevel":250,"defenceLevel":190,"rangeLevel":220,"magicLevel":1,"stabDef":50,"slashDef":50,"rangeDef":50,"magicDef":50,"bonusRangeStrength":20,"venomImmune":true},"7409":{"name":"Night beast","hitpoints":550,"combatLevel":374,"slayerLevel":90,"attackSpeed":4,"attackLevel":270,"strengthLevel":290,"defenceLevel":220,"rangeLevel":1,"magicLevel":300,"stabDef":75,"slashDef":80,"crushDef":200,"rangeDef":200,"magicDef":190,"venomImmune":true},"7410":{"name":"Greater abyssal demon","hitpoints":400,"combatLevel":342,"slayerLevel":85,"attackSpeed":4,"attackLevel":300,"strengthLevel":260,"defenceLevel":240,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"venomImmune":true},"7411":{"name":"Nechryarch","hitpoints":320,"combatLevel":300,"slayerLevel":80,"attackSpeed":4,"attackLevel":310,"strengthLevel":260,"defenceLevel":140,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":30},"7416":{"name":"Obor","hitpoints":120,"combatLevel":106,"attackSpeed":6,"attackLevel":90,"strengthLevel":100,"defenceLevel":60,"rangeLevel":120,"magicLevel":1,"range":100,"stabDef":35,"slashDef":40,"crushDef":45,"rangeDef":20,"magicDef":20,"bonusAttack":100,"bonusStrength":68,"bonusRangeStrength":65},"7418":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":85,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7419":{"name":"Zamorak warrior","hitpoints":50,"combatLevel":85,"attackSpeed":4,"attackLevel":90,"strengthLevel":70,"defenceLevel":90,"rangeLevel":1,"magicLevel":1},"7420":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":81,"attackSpeed":4,"attackLevel":75,"strengthLevel":75,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7421":{"name":"Zamorak ranger","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":1},"7422":{"name":"Zamorak mage","hitpoints":50,"combatLevel":84,"attackSpeed":4,"attackLevel":78,"strengthLevel":81,"defenceLevel":82,"rangeLevel":1,"magicLevel":85},"7423":{"name":"Zamorak mage","hitpoints":50,"combatLevel":82,"attackSpeed":4,"attackLevel":75,"strengthLevel":80,"defenceLevel":80,"rangeLevel":1,"magicLevel":85},"7424":{"name":"Cave lizard","hitpoints":20,"combatLevel":37,"attackSpeed":4,"attackLevel":38,"strengthLevel":36,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"7426":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7427":{"name":"Zamorak crafter","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":15,"defenceLevel":12,"rangeLevel":1,"magicLevel":20},"7485":{"name":"Zombie","hitpoints":65,"combatLevel":70,"attackSpeed":4,"attackLevel":61,"strengthLevel":60,"defenceLevel":61,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"7486":{"name":"Zombie","hitpoints":50,"combatLevel":56,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":47,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"7487":{"name":"Zombie","hitpoints":71,"combatLevel":76,"attackSpeed":4,"attackLevel":69,"strengthLevel":65,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"7488":{"name":"Zombie","hitpoints":68,"combatLevel":72,"attackSpeed":4,"attackLevel":61,"strengthLevel":63,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"rangeDef":10,"bonusStrength":10},"7513":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7515":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7527":{"name":"Vanguard","hitpoints":280,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":240,"rangeLevel":225,"magicLevel":225,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":400,"magicDef":20,"bonusAttack":20,"bonusStrength":10},"7528":{"name":"Vanguard","hitpoints":280,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":240,"rangeLevel":225,"magicLevel":225,"range":40,"stabDef":55,"slashDef":60,"crushDef":100,"rangeDef":300,"magicDef":400,"bonusRangeStrength":25},"7529":{"name":"Vanguard","hitpoints":280,"attackSpeed":4,"attackLevel":225,"strengthLevel":225,"defenceLevel":240,"rangeLevel":225,"magicLevel":225,"magic":40,"stabDef":315,"slashDef":340,"crushDef":400,"rangeDef":50,"magicDef":110,"bonusMagicDamage":25},"7530":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7531":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7532":{"name":"Vespula","hitpoints":200,"attackSpeed":3,"rangeDef":60,"magicDef":70},"7533":{"name":"Abyssal portal","hitpoints":250,"attackSpeed":2,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"rangeDef":140,"magicDef":60},"7538":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7539":{"name":"Vespine soldier","hitpoints":100,"attackSpeed":4,"rangeLevel":1,"magicDef":30},"7540":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7541":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7542":{"name":"Tekton","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7543":{"name":"Tekton (enraged)","hitpoints":300,"attackSpeed":3,"attackLevel":390,"strengthLevel":390,"defenceLevel":205,"rangeLevel":1,"magicLevel":205,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7544":{"name":"Tekton (enraged)","hitpoints":420,"attackSpeed":3,"attackLevel":585,"strengthLevel":585,"defenceLevel":246,"rangeLevel":1,"magicLevel":246,"stabDef":280,"slashDef":290,"crushDef":180,"bonusAttack":64,"bonusStrength":30},"7545":{"name":"Tekton","hitpoints":420,"attackSpeed":3,"attackLevel":585,"strengthLevel":585,"defenceLevel":246,"rangeLevel":1,"magicLevel":246,"stabDef":155,"slashDef":165,"crushDef":105,"bonusAttack":64,"bonusStrength":20},"7548":{"name":"Scavenger beast","hitpoints":30,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":45,"rangeLevel":1,"magicLevel":1},"7549":{"name":"Scavenger beast","hitpoints":45,"attackSpeed":4,"attackLevel":180,"strengthLevel":180,"defenceLevel":67,"rangeLevel":1,"magicLevel":1},"7550":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":87,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7551":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7552":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":250,"strengthLevel":250,"defenceLevel":175,"rangeLevel":250,"magicLevel":175,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7553":{"name":"Great Olm (Right claw)","hitpoints":600,"combatLevel":549,"attackSpeed":4,"attackLevel":375,"strengthLevel":375,"defenceLevel":262,"rangeLevel":375,"magicLevel":130,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"magicDef":50},"7554":{"name":"Great Olm","hitpoints":800,"combatLevel":1043,"attackSpeed":4,"attackLevel":375,"strengthLevel":375,"defenceLevel":225,"rangeLevel":375,"magicLevel":375,"range":60,"magic":60,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":50,"magicDef":200},"7555":{"name":"Great Olm (Left claw)","hitpoints":600,"combatLevel":750,"attackSpeed":4,"attackLevel":375,"strengthLevel":375,"defenceLevel":262,"rangeLevel":375,"magicLevel":262,"range":60,"magic":60,"stabDef":50,"slashDef":50,"crushDef":50,"rangeDef":50,"magicDef":50},"7559":{"name":"Deathly ranger","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"range":120,"bonusRangeStrength":70},"7560":{"name":"Deathly mage","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"magic":120},"7561":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7562":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7563":{"name":"Muttadile","hitpoints":250,"attackSpeed":4},"7566":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7567":{"name":"Vasa Nistirio","hitpoints":300,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"range":100,"stabDef":170,"slashDef":190,"crushDef":50,"rangeDef":60,"magicDef":400},"7568":{"name":"Glowing crystal","hitpoints":120,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"rangeLevel":1,"slashDef":180,"crushDef":180},"7569":{"name":"Guardian","hitpoints":250,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":80,"slashDef":180,"bonusStrength":20},"7570":{"name":"Guardian","hitpoints":375,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":80,"slashDef":180,"bonusStrength":20},"7571":{"name":"Guardian","hitpoints":250,"attackSpeed":4,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":1,"magicLevel":1,"stabDef":80,"slashDef":180,"bonusStrength":20},"7572":{"name":"Guardian","hitpoints":375,"attackSpeed":4,"attackLevel":210,"strengthLevel":210,"defenceLevel":150,"rangeLevel":1,"magicLevel":1,"stabDef":80,"slashDef":180,"bonusStrength":20},"7573":{"name":"Lizardman shaman","hitpoints":190,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7574":{"name":"Lizardman shaman","hitpoints":190,"attackSpeed":4,"range":56,"stabDef":102,"slashDef":160,"crushDef":150,"magicDef":160,"bonusAttack":58,"bonusStrength":52,"bonusRangeStrength":49},"7584":{"name":"Ice demon","hitpoints":140,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":160,"rangeLevel":390,"magicLevel":390,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60},"7585":{"name":"Ice demon","hitpoints":210,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":240,"rangeLevel":585,"magicLevel":585,"stabDef":70,"slashDef":70,"crushDef":110,"rangeDef":140,"magicDef":60},"7604":{"name":"Skeletal Mystic","hitpoints":160,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7605":{"name":"Skeletal Mystic","hitpoints":160,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7606":{"name":"Skeletal Mystic","hitpoints":160,"attackSpeed":4,"rangeLevel":1,"magic":40,"stabDef":155,"slashDef":155,"crushDef":115,"rangeDef":115,"magicDef":140,"bonusAttack":85,"bonusStrength":50,"bonusMagicDamage":38},"7620":{"name":"Temple guardian","hitpoints":45,"combatLevel":30,"attackSpeed":4,"attackLevel":20,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7621":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7622":{"name":"Khazard warlord","hitpoints":170,"combatLevel":112,"attackSpeed":4,"attackLevel":75,"strengthLevel":78,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7649":{"name":"Chaotic death spawn","hitpoints":50,"combatLevel":215,"attackSpeed":3,"attackLevel":380,"strengthLevel":1,"defenceLevel":70,"rangeLevel":380,"magicLevel":380},"7656":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7657":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7658":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"7659":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"7660":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"7661":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"7662":{"name":"Mummy","hitpoints":90,"combatLevel":84,"attackSpeed":4,"attackLevel":90,"strengthLevel":30,"defenceLevel":90,"rangeLevel":1,"magicLevel":1,"stabDef":90,"slashDef":90,"crushDef":30,"magicDef":90,"bonusStrength":30},"7664":{"name":"Lesser demon","hitpoints":81,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7679":{"name":"TzHaar-Ket","hitpoints":200,"combatLevel":221,"attackSpeed":4,"attackLevel":200,"strengthLevel":180,"defenceLevel":190,"rangeLevel":1,"magicLevel":40},"7682":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7683":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7684":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7685":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7686":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7687":{"name":"TzHaar-Hur","hitpoints":80,"combatLevel":74,"attackSpeed":5,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":80},"7691":{"name":"Jal-Nib","hitpoints":10,"combatLevel":32,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":15,"rangeLevel":1,"magicLevel":15},"7692":{"name":"Jal-MejRah","hitpoints":25,"combatLevel":85,"attackSpeed":3,"defenceLevel":55,"rangeLevel":120,"magicLevel":120,"range":30,"stabDef":30,"slashDef":30,"crushDef":30,"rangeDef":45,"bonusRangeStrength":30},"7693":{"name":"Jal-Ak","hitpoints":40,"combatLevel":165,"attackSpeed":6,"attackLevel":160,"strengthLevel":160,"defenceLevel":95,"rangeLevel":160,"magicLevel":160,"range":45,"magic":45,"stabDef":25,"slashDef":25,"crushDef":25,"rangeDef":25,"magicDef":25,"bonusStrength":45,"bonusRangeStrength":45,"bonusMagicDamage":45},"7694":{"name":"Jal-AkRek-Mej","hitpoints":15,"combatLevel":70,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":1,"magicLevel":120,"magic":25,"magicDef":25,"bonusMagicDamage":25},"7695":{"name":"Jal-AkRek-Xil","hitpoints":15,"combatLevel":70,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":95,"rangeLevel":120,"magicLevel":1,"range":25,"rangeDef":25,"bonusRangeStrength":25},"7696":{"name":"Jal-AkRek-Ket","hitpoints":15,"combatLevel":70,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":25,"crushDef":25,"bonusStrength":25},"7697":{"name":"Jal-ImKot","hitpoints":75,"combatLevel":240,"attackSpeed":4,"attackLevel":210,"strengthLevel":290,"defenceLevel":120,"rangeLevel":220,"magicLevel":120,"stabDef":65,"slashDef":65,"crushDef":65,"rangeDef":50,"magicDef":30,"bonusStrength":40},"7698":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7699":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7700":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"range":80,"magic":100,"bonusMagicDamage":75},"7701":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7702":{"name":"Jal-Xil","hitpoints":130,"combatLevel":370,"attackSpeed":4,"attackLevel":140,"strengthLevel":180,"defenceLevel":60,"rangeLevel":250,"magicLevel":90,"range":40,"bonusRangeStrength":50},"7703":{"name":"Jal-Zek","hitpoints":220,"combatLevel":490,"attackSpeed":4,"attackLevel":370,"strengthLevel":510,"defenceLevel":260,"rangeLevel":510,"magicLevel":300,"magic":80},"7704":{"name":"JalTok-Jad","hitpoints":350,"combatLevel":900,"attackSpeed":8,"attackLevel":750,"strengthLevel":1020,"defenceLevel":480,"rangeLevel":1020,"magicLevel":510,"range":80,"magic":100,"bonusMagicDamage":75},"7705":{"name":"Yt-HurKot","hitpoints":90,"combatLevel":141,"attackSpeed":4,"attackLevel":165,"strengthLevel":125,"defenceLevel":100,"rangeLevel":150,"magicLevel":150,"range":80,"magic":100,"rangeDef":130,"magicDef":130},"7706":{"name":"TzKal-Zuk","hitpoints":1200,"combatLevel":1400,"attackLevel":350,"strengthLevel":600,"defenceLevel":260,"rangeLevel":400,"magicLevel":150,"range":550,"magic":550,"rangeDef":100,"magicDef":350,"bonusStrength":200,"bonusRangeStrength":200,"bonusMagicDamage":450},"7708":{"name":"Jal-MejJak","hitpoints":80,"combatLevel":250,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":1,"magicLevel":1},"7744":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7745":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"7792":{"name":"Long-tailed Wyvern","hitpoints":200,"combatLevel":152,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":120,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140},"7793":{"name":"Taloned Wyvern","hitpoints":200,"combatLevel":147,"slayerLevel":66,"attackSpeed":6,"attackLevel":120,"strengthLevel":110,"defenceLevel":90,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140},"7794":{"name":"Spitting Wyvern","hitpoints":200,"combatLevel":139,"slayerLevel":66,"attackSpeed":6,"attackLevel":125,"strengthLevel":80,"defenceLevel":90,"rangeLevel":125,"magicLevel":125,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":140},"7795":{"name":"Ancient Wyvern","hitpoints":300,"combatLevel":210,"slayerLevel":82,"attackSpeed":5,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":90,"magicLevel":90,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":120,"magicDef":170},"7796":{"name":"Lobstrosity","hitpoints":50,"combatLevel":68,"attackSpeed":4,"attackLevel":60,"strengthLevel":80,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":15,"rangeDef":70,"magicDef":99},"7797":{"name":"Ancient Zygomite","hitpoints":150,"combatLevel":109,"slayerLevel":57,"attackSpeed":4,"attackLevel":80,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":30,"magicDef":30,"bonusAttack":50},"7799":{"name":"Ammonite Crab","hitpoints":100,"combatLevel":25,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"7802":{"name":"Hoop Snake","hitpoints":25,"combatLevel":19,"attackSpeed":4,"attackLevel":15,"strengthLevel":10,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7804":{"name":"Tar Monster","hitpoints":200,"combatLevel":132,"attackSpeed":4,"attackLevel":120,"strengthLevel":80,"defenceLevel":70,"rangeLevel":100,"magicLevel":1},"7806":{"name":"Deranged archaeologist","hitpoints":200,"combatLevel":276,"attackSpeed":3,"attackLevel":280,"strengthLevel":160,"defenceLevel":280,"rangeLevel":320,"magicLevel":1,"range":90,"stabDef":20,"slashDef":20,"crushDef":50,"rangeDef":300,"magicDef":300,"bonusAttack":280,"bonusStrength":30,"bonusRangeStrength":90},"7817":{"name":"Lava beast","hitpoints":65,"attackSpeed":4},"7851":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7852":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7853":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7854":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7855":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7858":{"name":"Justiciar Zachariah","hitpoints":320,"combatLevel":348,"attackSpeed":6,"attackLevel":500,"strengthLevel":250,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusAttack":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7859":{"name":"Derwen","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":80,"magic":180,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7860":{"name":"Porazdir","hitpoints":320,"combatLevel":235,"attackSpeed":6,"attackLevel":250,"strengthLevel":150,"defenceLevel":100,"rangeLevel":1,"magicLevel":180,"magic":80,"stabDef":200,"slashDef":200,"crushDef":200,"rangeDef":200,"bonusMagicDamage":80,"poisonImmune":true,"venomImmune":true},"7861":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"7862":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"7863":{"name":"Black dragon","hitpoints":250,"combatLevel":247,"attackSpeed":4,"attackLevel":200,"strengthLevel":215,"defenceLevel":200,"rangeLevel":1,"magicLevel":150,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"7864":{"name":"Ankou","hitpoints":100,"combatLevel":98,"attackSpeed":4,"attackLevel":75,"strengthLevel":90,"defenceLevel":80,"rangeLevel":1,"magicLevel":1},"7865":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7866":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7867":{"name":"Lesser demon","hitpoints":110,"combatLevel":94,"attackSpeed":4,"attackLevel":68,"strengthLevel":85,"defenceLevel":71,"rangeLevel":1,"magicLevel":1},"7868":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"7869":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"7870":{"name":"Green dragon","hitpoints":100,"combatLevel":88,"attackSpeed":4,"attackLevel":68,"strengthLevel":75,"defenceLevel":68,"rangeLevel":1,"magicLevel":75,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"7871":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"7872":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"7873":{"name":"Greater demon","hitpoints":120,"combatLevel":104,"attackSpeed":4,"attackLevel":76,"strengthLevel":90,"defenceLevel":81,"rangeLevel":1,"magicLevel":1},"7874":{"name":"Black demon","hitpoints":200,"combatLevel":188,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"7875":{"name":"Black demon","hitpoints":200,"combatLevel":188,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"7876":{"name":"Black demon","hitpoints":200,"combatLevel":188,"attackSpeed":4,"attackLevel":145,"strengthLevel":165,"defenceLevel":152,"rangeLevel":1,"magicLevel":1},"7877":{"name":"Hellhound","hitpoints":150,"combatLevel":136,"attackSpeed":4,"attackLevel":105,"strengthLevel":120,"defenceLevel":102,"rangeLevel":1,"magicLevel":1},"7878":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7879":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7880":{"name":"Ice giant","hitpoints":100,"combatLevel":67,"attackSpeed":5,"attackLevel":40,"strengthLevel":60,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"slashDef":3,"crushDef":2,"bonusAttack":29,"bonusStrength":31},"7881":{"name":"Revenant imp","hitpoints":10,"combatLevel":7,"attackSpeed":5,"attackLevel":5,"strengthLevel":5,"defenceLevel":4,"rangeLevel":5,"magicLevel":9,"magic":5,"magicDef":5},"7882":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7883":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7884":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7885":{"name":"Dawn","hitpoints":450,"combatLevel":228,"slayerLevel":75,"attackSpeed":6,"attackLevel":140,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":100,"magicDef":80,"poisonImmune":true,"venomImmune":true},"7886":{"name":"Dusk","hitpoints":450,"combatLevel":248,"slayerLevel":75,"attackSpeed":6,"attackLevel":200,"strengthLevel":140,"defenceLevel":100,"rangeLevel":140,"magicLevel":140},"7887":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7888":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7889":{"name":"Dusk","hitpoints":450,"combatLevel":328,"slayerLevel":75,"attackSpeed":6,"attackLevel":300,"strengthLevel":250,"defenceLevel":150,"rangeLevel":250,"magicLevel":250},"7894":{"name":"Sand Snake (hard)","hitpoints":180,"combatLevel":154,"attackSpeed":4,"attackLevel":180,"strengthLevel":140,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7895":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7903":{"name":"Sand Snake","hitpoints":60,"combatLevel":36,"attackSpeed":4,"attackLevel":30,"strengthLevel":20,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"7914":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"7915":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"7916":{"name":"Thief","hitpoints":22,"combatLevel":21,"attackSpeed":4,"attackLevel":19,"strengthLevel":18,"defenceLevel":14,"rangeLevel":1,"magicLevel":1,"stabDef":24,"slashDef":14,"crushDef":19,"rangeDef":16,"magicDef":4,"bonusAttack":9,"bonusStrength":7},"7931":{"name":"Revenant goblin","hitpoints":14,"combatLevel":15,"attackSpeed":5,"attackLevel":13,"strengthLevel":14,"defenceLevel":14,"rangeLevel":15,"magicLevel":12,"range":21,"magic":37,"stabDef":25,"slashDef":28,"crushDef":31,"rangeDef":31,"magicDef":1,"bonusAttack":6,"bonusStrength":8,"bonusRangeStrength":12,"bonusMagicDamage":12},"7932":{"name":"Revenant pyrefiend","hitpoints":48,"combatLevel":52,"attackSpeed":5,"attackLevel":60,"strengthLevel":40,"defenceLevel":33,"rangeLevel":40,"magicLevel":67,"stabDef":45,"slashDef":40,"crushDef":50,"rangeDef":10,"magicDef":15},"7933":{"name":"Revenant hobgoblin","hitpoints":72,"combatLevel":60,"attackSpeed":4,"attackLevel":50,"strengthLevel":50,"defenceLevel":41,"rangeLevel":60,"magicLevel":55,"range":25,"magic":5,"stabDef":65,"slashDef":60,"crushDef":68,"rangeDef":50,"magicDef":30,"bonusAttack":20,"bonusStrength":24},"7934":{"name":"Revenant cyclops","hitpoints":110,"combatLevel":82,"attackSpeed":6,"attackLevel":60,"strengthLevel":73,"defenceLevel":49,"rangeLevel":70,"magicLevel":65,"stabDef":140,"slashDef":130,"crushDef":135,"rangeDef":135,"magicDef":10,"bonusAttack":53,"bonusStrength":64},"7935":{"name":"Revenant hellhound","hitpoints":80,"combatLevel":90,"attackSpeed":5,"attackLevel":76,"strengthLevel":80,"defenceLevel":80,"rangeLevel":80,"magicLevel":104,"magic":30,"stabDef":138,"slashDef":140,"crushDef":142,"rangeDef":140,"magicDef":62,"bonusAttack":38,"bonusStrength":40},"7936":{"name":"Revenant demon","hitpoints":80,"combatLevel":98,"attackSpeed":5,"attackLevel":83,"strengthLevel":76,"defenceLevel":80,"rangeLevel":80,"magicLevel":120,"range":40,"magic":50,"stabDef":124,"slashDef":118,"crushDef":130,"rangeDef":90,"magicDef":85,"bonusAttack":30,"bonusStrength":50,"bonusRangeStrength":30,"bonusMagicDamage":24},"7937":{"name":"Revenant ork","hitpoints":105,"combatLevel":105,"attackSpeed":5,"attackLevel":99,"strengthLevel":100,"defenceLevel":60,"rangeLevel":130,"magicLevel":110,"range":50,"stabDef":148,"slashDef":150,"crushDef":146,"rangeDef":148,"magicDef":50,"bonusAttack":60,"bonusStrength":55},"7938":{"name":"Revenant dark beast","hitpoints":140,"combatLevel":120,"attackSpeed":5,"attackLevel":93,"strengthLevel":110,"defenceLevel":80,"rangeLevel":135,"magicLevel":130,"range":45,"stabDef":153,"slashDef":152,"crushDef":155,"rangeDef":158,"magicDef":70,"bonusAttack":65,"bonusStrength":60},"7939":{"name":"Revenant knight","hitpoints":143,"combatLevel":126,"attackSpeed":5,"attackLevel":100,"strengthLevel":119,"defenceLevel":80,"rangeLevel":146,"magicLevel":146,"range":55,"magic":55,"stabDef":195,"slashDef":200,"crushDef":180,"rangeDef":190,"magicDef":95,"bonusAttack":69,"bonusStrength":71,"bonusRangeStrength":45,"bonusMagicDamage":50},"7940":{"name":"Revenant dragon","hitpoints":155,"combatLevel":135,"attackSpeed":5,"attackLevel":106,"strengthLevel":126,"defenceLevel":87,"rangeLevel":151,"magicLevel":150,"range":60,"magic":61,"stabDef":201,"slashDef":206,"crushDef":188,"rangeDef":197,"magicDef":101,"bonusAttack":72,"bonusStrength":78,"bonusRangeStrength":51,"bonusMagicDamage":35},"7948":{"name":"Corsair Traitor (hard)","hitpoints":160,"combatLevel":103,"attackSpeed":3,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":90},"7949":{"name":"Corsair Traitor","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7955":{"name":"Baby black dragon","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":1,"stabDef":30,"slashDef":50,"crushDef":50,"rangeDef":30,"magicDef":40},"7964":{"name":"Ithoi the Navigator","hitpoints":55,"combatLevel":35,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":30,"rangeLevel":1,"magicLevel":30},"7989":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7990":{"name":"Ogress Warrior","hitpoints":82,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":70,"defenceLevel":82,"rangeLevel":1,"magicLevel":60,"stabDef":10,"slashDef":12,"crushDef":12,"rangeDef":16,"magicDef":14},"7991":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7992":{"name":"Ogress Shaman","hitpoints":82,"combatLevel":82,"attackSpeed":4,"attackLevel":68,"strengthLevel":20,"defenceLevel":82,"rangeLevel":1,"magicLevel":68,"stabDef":12,"slashDef":14,"crushDef":14,"rangeDef":8,"magicDef":16},"7996":{"name":"Corrupt Lizardman (hard)","hitpoints":150,"combatLevel":152,"attackSpeed":4,"attackLevel":162,"strengthLevel":162,"defenceLevel":38,"rangeLevel":162,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"7997":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8000":{"name":"Corrupt Lizardman","hitpoints":50,"combatLevel":46,"attackSpeed":4,"attackLevel":38,"strengthLevel":38,"defenceLevel":38,"rangeLevel":38,"magicLevel":1,"range":22,"slashDef":25,"bonusAttack":22,"bonusStrength":20,"bonusRangeStrength":20},"8027":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14,"poisonImmune":true,"venomImmune":true},"8030":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30},"8031":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14},"8033":{"name":"Elvarg","hitpoints":80,"combatLevel":83,"attackSpeed":4,"attackLevel":70,"strengthLevel":70,"defenceLevel":70,"rangeLevel":1,"magicLevel":70,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8056":{"name":"Spawn","hitpoints":80,"combatLevel":100,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"range":1,"magic":1,"stabDef":5,"slashDef":15,"crushDef":15,"rangeDef":5},"8057":{"name":"Robert the Strong","hitpoints":280,"combatLevel":194,"attackSpeed":4,"defenceLevel":140,"rangeLevel":328,"magicLevel":128,"range":126,"stabDef":140,"slashDef":180,"crushDef":60,"rangeDef":860,"magicDef":940,"poisonImmune":true,"venomImmune":true},"8058":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14},"8059":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16},"8060":{"name":"Vorkath","hitpoints":460,"combatLevel":392,"attackSpeed":5,"attackLevel":560,"strengthLevel":268,"defenceLevel":164,"rangeLevel":268,"magicLevel":148,"range":96,"magic":148,"stabDef":66,"slashDef":126,"crushDef":126,"rangeDef":80,"magicDef":204,"bonusAttack":14},"8061":{"name":"Vorkath","hitpoints":750,"combatLevel":732,"attackSpeed":5,"attackLevel":560,"strengthLevel":308,"defenceLevel":214,"rangeLevel":308,"magicLevel":150,"range":78,"magic":150,"stabDef":26,"slashDef":108,"crushDef":108,"rangeDef":26,"magicDef":240,"bonusAttack":16},"8062":{"name":"Zombified Spawn","hitpoints":8,"combatLevel":55,"attackLevel":80,"strengthLevel":80,"defenceLevel":4,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3},"8063":{"name":"Zombified Spawn","hitpoints":38,"combatLevel":64,"attackLevel":82,"strengthLevel":82,"defenceLevel":6,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":3,"crushDef":3,"rangeDef":3},"8064":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":150,"strengthLevel":148,"defenceLevel":138,"rangeLevel":1,"magicLevel":118},"8065":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":128,"magicLevel":118},"8066":{"name":"Stone Guardian","hitpoints":62,"combatLevel":124,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":138,"rangeLevel":1,"magicLevel":128},"8067":{"name":"Zombie","hitpoints":54,"combatLevel":132,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30},"8068":{"name":"Zombie","hitpoints":54,"combatLevel":132,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30},"8069":{"name":"Zombie","hitpoints":54,"combatLevel":132,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20},"8070":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"attackSpeed":5,"attackLevel":160,"strengthLevel":180,"defenceLevel":62,"rangeLevel":1,"magicLevel":1,"stabDef":25,"slashDef":20,"crushDef":25,"rangeDef":30,"magicDef":10,"bonusAttack":30},"8071":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":180,"magicLevel":1,"range":20,"stabDef":15,"slashDef":10,"crushDef":15,"rangeDef":20,"magicDef":30},"8072":{"name":"Skeleton","hitpoints":54,"combatLevel":132,"attackSpeed":5,"attackLevel":160,"strengthLevel":1,"defenceLevel":62,"rangeLevel":1,"magicLevel":180,"magic":20,"stabDef":35,"slashDef":30,"crushDef":35,"rangeDef":10,"magicDef":20},"8073":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8075":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8076":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8078":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8079":{"name":"Red dragon","hitpoints":140,"combatLevel":152,"attackSpeed":4,"attackLevel":130,"strengthLevel":130,"defenceLevel":130,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8080":{"name":"Iron dragon","hitpoints":165,"combatLevel":189,"attackSpeed":4,"attackLevel":165,"strengthLevel":165,"defenceLevel":165,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"8081":{"name":"Brutal green dragon","hitpoints":175,"combatLevel":227,"attackSpeed":4,"attackLevel":268,"strengthLevel":168,"defenceLevel":168,"magicLevel":168,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true},"8082":{"name":"Green dragon","hitpoints":75,"combatLevel":79,"attackSpeed":4,"attackLevel":68,"strengthLevel":68,"defenceLevel":68,"rangeLevel":1,"magicLevel":68,"stabDef":20,"slashDef":40,"crushDef":40,"rangeDef":20,"magicDef":30},"8083":{"name":"Blue dragon","hitpoints":105,"combatLevel":111,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":95,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8084":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8085":{"name":"Black dragon","hitpoints":190,"combatLevel":227,"attackSpeed":4,"attackLevel":200,"strengthLevel":200,"defenceLevel":200,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8086":{"name":"Steel dragon","hitpoints":210,"combatLevel":246,"attackSpeed":4,"attackLevel":215,"strengthLevel":215,"defenceLevel":215,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":90,"magicDef":30},"8087":{"name":"Brutal red dragon","hitpoints":285,"combatLevel":289,"attackSpeed":4,"attackLevel":310,"strengthLevel":210,"defenceLevel":198,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"poisonImmune":true,"venomImmune":true},"8088":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"poisonImmune":true,"venomImmune":true},"8089":{"name":"Mithril dragon","hitpoints":254,"combatLevel":304,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":268,"rangeLevel":168,"magicLevel":168,"stabDef":50,"slashDef":100,"crushDef":70,"rangeDef":90,"magicDef":30,"poisonImmune":true,"venomImmune":true},"8090":{"name":"Adamant dragon","hitpoints":295,"combatLevel":338,"attackSpeed":4,"attackLevel":280,"strengthLevel":280,"defenceLevel":272,"rangeLevel":186,"magicLevel":186,"stabDef":30,"slashDef":110,"crushDef":85,"rangeDef":95,"magicDef":30},"8091":{"name":"Rune dragon","hitpoints":330,"combatLevel":380,"attackSpeed":4,"attackLevel":284,"strengthLevel":284,"defenceLevel":276,"rangeLevel":246,"magicLevel":196,"stabDef":30,"slashDef":115,"crushDef":90,"rangeDef":95,"magicDef":30,"bonusRangeStrength":14},"8092":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"8093":{"name":"Brutal black dragon","hitpoints":315,"combatLevel":318,"slayerLevel":77,"attackSpeed":4,"attackLevel":330,"strengthLevel":210,"defenceLevel":258,"magicLevel":250,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60,"bonusStrength":20,"poisonImmune":true,"venomImmune":true},"8094":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42},"8095":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42},"8096":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42},"8097":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42},"8098":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42},"8137":{"name":"Spider","hitpoints":4,"combatLevel":35,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8138":{"name":"Spider","hitpoints":4,"combatLevel":35,"attackSpeed":4,"attackLevel":45,"strengthLevel":47,"defenceLevel":20,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":20,"crushDef":10,"rangeDef":20,"magicDef":17},"8149":{"name":"White Knight","hitpoints":52,"combatLevel":36,"attackSpeed":7,"attackLevel":27,"strengthLevel":29,"defenceLevel":21,"rangeLevel":1,"magicLevel":1,"stabDef":83,"slashDef":76,"crushDef":70,"rangeDef":74,"bonusAttack":30,"bonusStrength":31},"8150":{"name":"Paladin","hitpoints":66,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8177":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42},"8178":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42},"8179":{"name":"Galvek","hitpoints":1200,"combatLevel":608,"attackSpeed":6,"attackLevel":632,"strengthLevel":268,"defenceLevel":188,"rangeLevel":246,"magicLevel":160,"range":180,"magic":160,"stabDef":80,"slashDef":140,"crushDef":140,"rangeDef":86,"magicDef":280,"bonusAttack":34,"bonusRangeStrength":6,"bonusMagicDamage":42},"8194":{"name":"Growthling","hitpoints":10,"combatLevel":37,"attackSpeed":4,"attackLevel":40,"strengthLevel":38,"defenceLevel":40,"rangeLevel":1,"magicLevel":1,"poisonImmune":true,"venomImmune":true},"8195":{"name":"Bryophyta","hitpoints":115,"combatLevel":128,"attackSpeed":6,"attackLevel":130,"strengthLevel":100,"defenceLevel":100,"rangeLevel":1,"magicLevel":90,"bonusAttack":33,"bonusStrength":31},"8239":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8240":{"name":"Vanstrom Klause","hitpoints":155,"combatLevel":169,"attackSpeed":8,"attackLevel":150,"strengthLevel":136,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"poisonImmune":true,"venomImmune":true},"8242":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8243":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8244":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8245":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8246":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8247":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"attackSpeed":5,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusStrength":34,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8248":{"name":"Ranis Drakan","hitpoints":400,"combatLevel":233,"attackSpeed":2,"attackLevel":120,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":120,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":60,"magicDef":60,"bonusAttack":160,"bonusMagicDamage":34,"poisonImmune":true,"venomImmune":true},"8251":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8252":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8253":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8254":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8255":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8256":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8257":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8258":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8259":{"name":"Vyrewatch","hitpoints":75,"combatLevel":87,"attackSpeed":8,"attackLevel":80,"strengthLevel":75,"defenceLevel":75,"rangeLevel":1,"magicLevel":75},"8260":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8261":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8262":{"name":"Abomination","hitpoints":200,"combatLevel":149,"attackSpeed":5,"attackLevel":110,"strengthLevel":110,"defenceLevel":110,"rangeLevel":110,"magicLevel":110,"stabDef":80,"slashDef":80,"crushDef":80,"rangeDef":180,"magicDef":20},"8297":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8298":{"name":"Swamp Crab","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8299":{"name":"Swampy log","hitpoints":75,"combatLevel":55,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50,"stabDef":100,"slashDef":100,"crushDef":100,"magicDef":100},"8300":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8301":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8302":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8303":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8304":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8305":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8306":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8307":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"8340":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"range":57,"rangeDef":160},"8341":{"name":"Xarpus","hitpoints":5080,"combatLevel":960,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":250,"rangeLevel":1,"magicLevel":220,"range":57,"rangeDef":160},"8342":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8343":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8344":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8345":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8346":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8347":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8348":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8349":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8350":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8351":{"name":"Nylocas Ischyros","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8352":{"name":"Nylocas Toxobolos","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8353":{"name":"Nylocas Hagios","hitpoints":22,"combatLevel":260,"attackSpeed":3,"attackLevel":250,"strengthLevel":230,"defenceLevel":20,"rangeLevel":250,"magicLevel":20,"magic":500,"bonusMagicDamage":500},"8355":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8356":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8357":{"name":"Nylocas Vasilias","hitpoints":2500,"combatLevel":800,"attackSpeed":4,"attackLevel":400,"strengthLevel":350,"defenceLevel":50,"rangeLevel":350,"magicLevel":50,"magic":600,"bonusStrength":60,"bonusRangeStrength":60,"bonusMagicDamage":600},"8359":{"name":"Pestilent Bloat","hitpoints":2000,"combatLevel":870,"attackSpeed":1,"attackLevel":250,"strengthLevel":340,"defenceLevel":100,"rangeLevel":180,"magicLevel":150,"range":180,"stabDef":40,"slashDef":20,"crushDef":40,"rangeDef":800,"magicDef":600,"bonusAttack":150,"bonusStrength":82,"bonusRangeStrength":4},"8360":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8361":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8362":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8363":{"name":"The Maiden of Sugadinti","hitpoints":3500,"combatLevel":940,"attackSpeed":10,"attackLevel":350,"strengthLevel":350,"defenceLevel":200,"rangeLevel":350,"magicLevel":350,"magic":300},"8366":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8367":{"name":"Blood spawn","hitpoints":120,"combatLevel":55,"attackLevel":1,"strengthLevel":1,"rangeLevel":1},"8369":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8370":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8371":{"name":"Verzik Vitur","hitpoints":2000,"combatLevel":1040,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":20,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusRangeStrength":80,"bonusMagicDamage":150},"8372":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8373":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1265,"attackSpeed":4,"attackLevel":400,"strengthLevel":400,"defenceLevel":200,"rangeLevel":400,"magicLevel":400,"range":80,"magic":80,"stabDef":100,"slashDef":60,"crushDef":100,"rangeDef":250,"magicDef":70,"bonusRangeStrength":80,"bonusMagicDamage":80},"8374":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8375":{"name":"Verzik Vitur","hitpoints":3250,"combatLevel":1520,"attackSpeed":7,"attackLevel":400,"strengthLevel":400,"defenceLevel":150,"rangeLevel":300,"magicLevel":300,"range":80,"magic":80,"stabDef":70,"slashDef":30,"crushDef":70,"rangeDef":230,"magicDef":100,"bonusAttack":80,"bonusStrength":30,"bonusRangeStrength":5,"bonusMagicDamage":5},"8381":{"name":"Nylocas Ischyros","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8382":{"name":"Nylocas Toxobolos","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8383":{"name":"Nylocas Hagios","hitpoints":11,"combatLevel":162,"attackSpeed":3,"attackLevel":200,"strengthLevel":160,"defenceLevel":1,"rangeLevel":200,"magicLevel":1,"magic":1073,"bonusMagicDamage":928},"8384":{"name":"Nylocas Athanatos","hitpoints":180,"combatLevel":350,"attackLevel":1,"strengthLevel":1,"defenceLevel":50,"rangeLevel":1,"magicLevel":50},"8385":{"name":"Nylocas Matomenos","hitpoints":200,"combatLevel":115,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":100,"magicLevel":100},"8387":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":48,"poisonImmune":true,"venomImmune":true},"8388":{"name":"Sotetseg","hitpoints":4000,"combatLevel":995,"attackSpeed":5,"attackLevel":250,"strengthLevel":250,"defenceLevel":200,"magicLevel":250,"stabDef":70,"slashDef":70,"crushDef":70,"rangeDef":150,"magicDef":30,"bonusStrength":48,"poisonImmune":true,"venomImmune":true},"8400":{"name":"Monk of Zamorak","hitpoints":20,"combatLevel":22,"attackSpeed":4,"attackLevel":18,"strengthLevel":18,"defenceLevel":22,"rangeLevel":1,"magicLevel":25},"8401":{"name":"Monk of Zamorak","hitpoints":10,"combatLevel":17,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":25},"8439":{"name":"Don't Know What","hitpoints":220,"combatLevel":163,"attackSpeed":3,"attackLevel":120,"strengthLevel":90,"defenceLevel":160,"rangeLevel":115,"magicLevel":60,"magicDef":200,"bonusRangeStrength":40},"8474":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8475":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8476":{"name":"Black Guard","hitpoints":40,"combatLevel":48,"attackSpeed":3,"attackLevel":40,"strengthLevel":45,"defenceLevel":45,"rangeLevel":1,"magicLevel":1,"stabDef":40,"slashDef":40,"crushDef":40,"rangeDef":40,"bonusAttack":30,"bonusStrength":30},"8496":{"name":"Dwarf","hitpoints":18,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"rangeDef":10,"magicDef":5,"bonusAttack":5,"bonusStrength":7},"8512":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8513":{"name":"Tormented Soul","hitpoints":20,"combatLevel":16,"attackSpeed":4,"attackLevel":16,"strengthLevel":12,"defenceLevel":10,"rangeLevel":1,"magicLevel":1},"8514":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8528":{"name":"Trapped Soul","hitpoints":30,"combatLevel":30,"attackSpeed":4,"attackLevel":25,"strengthLevel":29,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8529":{"name":"Trapped Soul (hard)","hitpoints":100,"combatLevel":101,"attackSpeed":4,"attackLevel":100,"strengthLevel":120,"defenceLevel":20,"rangeLevel":1,"magicLevel":1},"8563":{"name":"Lizardman","hitpoints":60,"combatLevel":62,"attackSpeed":4,"attackLevel":53,"strengthLevel":53,"defenceLevel":52,"rangeLevel":1,"magicLevel":1,"range":28,"slashDef":20,"crushDef":5,"bonusAttack":28,"bonusStrength":25,"bonusRangeStrength":25},"8564":{"name":"Lizardman brute","hitpoints":60,"combatLevel":73,"attackSpeed":4,"attackLevel":65,"strengthLevel":65,"defenceLevel":65,"rangeLevel":1,"magicLevel":1,"range":34,"slashDef":30,"crushDef":10,"bonusAttack":34,"bonusStrength":30,"bonusRangeStrength":30},"8565":{"name":"Lizardman shaman","hitpoints":150,"combatLevel":150,"attackSpeed":4,"attackLevel":120,"strengthLevel":120,"defenceLevel":140,"rangeLevel":120,"magicLevel":130,"range":45,"slashDef":40,"crushDef":30,"magicDef":50,"bonusAttack":45,"bonusStrength":38,"bonusRangeStrength":38},"8578":{"name":"Swamp frog","hitpoints":25,"combatLevel":24,"attackSpeed":4,"attackLevel":25,"strengthLevel":20,"defenceLevel":15,"rangeLevel":1,"magicLevel":1},"8583":{"name":"Hespori","hitpoints":300,"combatLevel":284,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":120,"rangeLevel":150,"magicLevel":126,"range":150,"magic":150,"stabDef":60,"slashDef":20,"crushDef":60,"rangeDef":80,"magicDef":80},"8584":{"name":"Flower","hitpoints":10},"8609":{"name":"Hydra","hitpoints":300,"combatLevel":194,"slayerLevel":95,"attackSpeed":6,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":210,"magicLevel":210,"stabDef":160,"slashDef":160,"crushDef":160,"magicDef":160},"8610":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30},"8611":{"name":"Wyrm","hitpoints":130,"combatLevel":99,"slayerLevel":62,"attackSpeed":4,"attackLevel":85,"strengthLevel":60,"defenceLevel":80,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":50,"crushDef":50,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30},"8612":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40},"8613":{"name":"Drake","hitpoints":250,"combatLevel":192,"slayerLevel":84,"attackSpeed":4,"attackLevel":140,"strengthLevel":118,"defenceLevel":120,"rangeLevel":140,"magicLevel":112,"range":40,"stabDef":60,"slashDef":60,"crushDef":60,"rangeDef":100,"magicDef":20,"bonusAttack":40,"bonusStrength":12,"bonusRangeStrength":40},"8614":{"name":"Sulphur Lizard","hitpoints":50,"combatLevel":50,"slayerLevel":44,"attackSpeed":4,"attackLevel":50,"strengthLevel":45,"defenceLevel":30,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":25,"crushDef":25,"rangeDef":15},"8615":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20},"8616":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20},"8617":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20},"8618":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20},"8619":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20},"8620":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":6,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20},"8621":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20},"8622":{"name":"Alchemical Hydra","hitpoints":1100,"combatLevel":426,"slayerLevel":95,"attackSpeed":4,"attackLevel":100,"strengthLevel":100,"defenceLevel":100,"rangeLevel":260,"magicLevel":260,"range":45,"magic":45,"stabDef":75,"slashDef":150,"crushDef":150,"rangeDef":45,"magicDef":150,"bonusRangeStrength":20,"bonusMagicDamage":20},"8633":{"name":"The Mimic","hitpoints":230,"combatLevel":186,"attackSpeed":3,"attackLevel":185,"strengthLevel":120,"defenceLevel":120,"rangeLevel":1,"magicLevel":60,"magic":180,"stabDef":160,"slashDef":165,"crushDef":150,"rangeDef":145,"magicDef":30,"bonusAttack":135,"bonusStrength":48},"8635":{"name":"Third Age Warrior","hitpoints":40,"combatLevel":83,"attackSpeed":5,"attackLevel":90,"strengthLevel":75,"defenceLevel":80,"rangeLevel":1,"magicLevel":1,"stabDef":96,"slashDef":108,"crushDef":113,"rangeDef":97,"bonusAttack":105,"bonusStrength":75},"8636":{"name":"Third Age Ranger","hitpoints":40,"combatLevel":76,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":95,"magicLevel":1,"range":140,"stabDef":55,"slashDef":47,"crushDef":60,"rangeDef":55,"magicDef":60,"bonusRangeStrength":7},"8637":{"name":"Third Age Mage","hitpoints":40,"combatLevel":83,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":80,"rangeLevel":1,"magicLevel":110,"magic":145,"stabDef":5,"slashDef":6,"crushDef":5,"magicDef":65,"bonusMagicDamage":24},"8678":{"name":"Feral Vampyre","hitpoints":50,"combatLevel":72,"attackSpeed":4,"attackLevel":65,"strengthLevel":70,"defenceLevel":65,"rangeLevel":1,"magicLevel":50},"8698":{"name":"Monk of Zamorak","hitpoints":16,"combatLevel":23,"attackSpeed":4,"attackLevel":15,"strengthLevel":13,"defenceLevel":18,"rangeLevel":1,"magicLevel":30},"8700":{"name":"Giant frog","hitpoints":23,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":8,"defenceLevel":6,"rangeLevel":1,"magicLevel":1},"8701":{"name":"Big frog","hitpoints":18,"combatLevel":10,"attackSpeed":4,"attackLevel":8,"strengthLevel":6,"defenceLevel":4,"rangeLevel":1,"magicLevel":1},"8702":{"name":"Frog","hitpoints":8,"combatLevel":5,"attackSpeed":4,"attackLevel":5,"strengthLevel":4,"defenceLevel":3,"rangeLevel":1,"magicLevel":1},"8703":{"name":"Temple Spider","hitpoints":70,"combatLevel":75,"attackSpeed":4,"attackLevel":120,"strengthLevel":50,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":30,"crushDef":10,"rangeDef":20,"magicDef":25},"8709":{"name":"Shaeded Beast","hitpoints":210,"combatLevel":186,"attackSpeed":4,"attackLevel":50,"strengthLevel":80,"defenceLevel":50,"rangeLevel":1,"magicLevel":250,"stabDef":50,"slashDef":30,"crushDef":100,"rangeDef":50,"magicDef":150,"bonusMagicDamage":10},"8713":{"name":"Sarachnis","hitpoints":400,"combatLevel":318,"attackSpeed":4,"attackLevel":200,"strengthLevel":240,"defenceLevel":150,"rangeLevel":300,"magicLevel":150,"range":15,"stabDef":60,"slashDef":40,"crushDef":10,"rangeDef":300,"magicDef":150,"bonusAttack":30,"bonusRangeStrength":15},"8714":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":107,"attackSpeed":3,"attackLevel":150,"strengthLevel":120,"defenceLevel":50,"rangeLevel":1,"magicLevel":1,"stabDef":50,"slashDef":50,"crushDef":20,"rangeDef":150,"bonusAttack":50},"8715":{"name":"Spawn of Sarachnis","hitpoints":30,"combatLevel":68,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":50,"rangeLevel":1,"magicLevel":100,"stabDef":50,"slashDef":50,"crushDef":50,"magicDef":150},"8736":{"name":"Moss Giant","hitpoints":120,"combatLevel":84,"attackSpeed":6,"attackLevel":60,"strengthLevel":60,"defenceLevel":60,"rangeLevel":1,"magicLevel":1,"bonusAttack":66,"bonusStrength":62},"8759":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8760":{"name":"Iorwerth Archer","hitpoints":105,"combatLevel":90,"attackSpeed":5,"attackLevel":10,"strengthLevel":10,"defenceLevel":80,"rangeLevel":90,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"8847":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8858":{"name":"Man","hitpoints":7,"combatLevel":2,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"8871":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8872":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8917":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10,"bonusAttack":236,"bonusStrength":44},"8918":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10,"bonusAttack":236,"bonusStrength":44},"8919":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10,"bonusAttack":236,"bonusStrength":44},"8920":{"name":"Fragment of Seren","hitpoints":1000,"combatLevel":494,"attackSpeed":7,"attackLevel":242,"strengthLevel":288,"defenceLevel":102,"rangeLevel":235,"magicLevel":102,"range":224,"stabDef":320,"slashDef":220,"crushDef":320,"rangeDef":480,"magicDef":10,"bonusAttack":236,"bonusStrength":44},"8950":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"8978":{"name":"Blessed spider","hitpoints":32,"combatLevel":39,"attackSpeed":4,"attackLevel":35,"strengthLevel":35,"defenceLevel":35,"rangeLevel":1,"magicLevel":1,"stabDef":15,"slashDef":16,"crushDef":7,"rangeDef":16,"magicDef":12},"8987":{"name":"Sir Jerro","hitpoints":57,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8988":{"name":"Sir Carl","hitpoints":57,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8989":{"name":"Sir Harry","hitpoints":57,"combatLevel":62,"attackSpeed":5,"attackLevel":54,"strengthLevel":54,"defenceLevel":54,"rangeLevel":1,"magicLevel":1,"stabDef":87,"slashDef":84,"crushDef":76,"rangeDef":79,"bonusAttack":20,"bonusStrength":22},"8993":{"name":"Kalrag","hitpoints":78,"combatLevel":89,"attackSpeed":4,"attackLevel":78,"strengthLevel":78,"defenceLevel":78,"rangeLevel":1,"magicLevel":1,"stabDef":20,"slashDef":17,"crushDef":12,"rangeDef":13,"magicDef":13},"8994":{"name":"Othainian","hitpoints":87,"combatLevel":91,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"8995":{"name":"Doomion","hitpoints":87,"combatLevel":91,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"8996":{"name":"Holthion","hitpoints":87,"combatLevel":91,"attackSpeed":4,"attackLevel":76,"strengthLevel":78,"defenceLevel":77,"rangeLevel":1,"magicLevel":1},"8997":{"name":"Disciple of Iban","hitpoints":20,"combatLevel":13,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":12,"rangeLevel":1,"magicLevel":1},"9008":{"name":"Mourner","hitpoints":19,"combatLevel":13,"attackSpeed":4,"attackLevel":10,"strengthLevel":10,"defenceLevel":10,"rangeLevel":1,"magicLevel":1,"stabDef":3,"slashDef":2,"crushDef":4},"9013":{"name":"Mourner","hitpoints":19,"combatLevel":11,"attackSpeed":4,"attackLevel":8,"strengthLevel":8,"defenceLevel":8,"rangeLevel":1,"magicLevel":1,"stabDef":6,"slashDef":6,"crushDef":9,"bonusAttack":6,"bonusStrength":2},"9016":{"name":"Essyllt","hitpoints":320,"combatLevel":236,"attackSpeed":4,"attackLevel":268,"strengthLevel":268,"defenceLevel":104,"rangeLevel":342,"magicLevel":104,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusStrength":28,"bonusRangeStrength":28},"9017":{"name":"Mourner","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9021":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5,"attackLevel":600,"strengthLevel":240,"defenceLevel":240,"rangeLevel":240,"magicLevel":240,"range":76,"magic":76,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusAttack":76,"bonusStrength":64,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9022":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5,"attackLevel":600,"strengthLevel":240,"defenceLevel":240,"rangeLevel":240,"magicLevel":240,"range":76,"magic":76,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusAttack":76,"bonusStrength":64,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9023":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5,"attackLevel":600,"strengthLevel":240,"defenceLevel":240,"rangeLevel":240,"magicLevel":240,"range":76,"magic":76,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusAttack":76,"bonusStrength":64,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9024":{"name":"Crystalline Hunllef","hitpoints":600,"combatLevel":674,"attackSpeed":5,"attackLevel":600,"strengthLevel":240,"defenceLevel":240,"rangeLevel":240,"magicLevel":240,"range":76,"magic":76,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusAttack":76,"bonusStrength":64,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9026":{"name":"Crystalline Rat","hitpoints":14,"combatLevel":24,"attackSpeed":4,"attackLevel":28,"strengthLevel":32,"defenceLevel":6,"magicLevel":6,"poisonImmune":true,"venomImmune":true},"9028":{"name":"Crystalline Bat","hitpoints":14,"combatLevel":33,"attackSpeed":4,"attackLevel":24,"strengthLevel":68,"defenceLevel":2,"magicLevel":2,"poisonImmune":true,"venomImmune":true},"9029":{"name":"Crystalline Unicorn","hitpoints":44,"combatLevel":48,"attackSpeed":4,"attackLevel":50,"strengthLevel":48,"defenceLevel":24,"magicLevel":24,"poisonImmune":true,"venomImmune":true},"9030":{"name":"Crystalline Scorpion","hitpoints":38,"combatLevel":64,"attackSpeed":4,"attackLevel":48,"strengthLevel":106,"defenceLevel":18,"magicLevel":18,"poisonImmune":true,"venomImmune":true},"9031":{"name":"Crystalline Wolf","hitpoints":52,"combatLevel":74,"attackSpeed":4,"attackLevel":106,"strengthLevel":66,"defenceLevel":22,"magicLevel":22,"poisonImmune":true,"venomImmune":true},"9032":{"name":"Crystalline Bear","hitpoints":100,"combatLevel":172,"attackSpeed":4,"attackLevel":98,"strengthLevel":98,"defenceLevel":98,"rangeLevel":98,"magicLevel":98,"bonusAttack":54,"bonusStrength":106,"poisonImmune":true,"venomImmune":true},"9033":{"name":"Crystalline Dragon","hitpoints":100,"combatLevel":172,"attackSpeed":4,"attackLevel":98,"strengthLevel":98,"defenceLevel":98,"rangeLevel":98,"magicLevel":98,"magic":54,"bonusMagicDamage":106,"poisonImmune":true,"venomImmune":true},"9034":{"name":"Crystalline Dark Beast","hitpoints":100,"combatLevel":172,"attackSpeed":4,"attackLevel":98,"strengthLevel":98,"defenceLevel":98,"rangeLevel":98,"magicLevel":98,"range":54,"bonusRangeStrength":106,"poisonImmune":true,"venomImmune":true},"9035":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":240,"magicLevel":240,"range":90,"magic":90,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusAttack":90,"bonusStrength":112,"bonusRangeStrength":112,"bonusMagicDamage":112,"poisonImmune":true,"venomImmune":true},"9036":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":240,"magicLevel":240,"range":90,"magic":90,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusAttack":90,"bonusStrength":112,"bonusRangeStrength":112,"bonusMagicDamage":112,"poisonImmune":true,"venomImmune":true},"9037":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":240,"magicLevel":240,"range":90,"magic":90,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusAttack":90,"bonusStrength":112,"bonusRangeStrength":112,"bonusMagicDamage":112,"poisonImmune":true,"venomImmune":true},"9038":{"name":"Corrupted Hunllef","hitpoints":1000,"combatLevel":894,"attackSpeed":5,"attackLevel":240,"strengthLevel":240,"defenceLevel":240,"rangeLevel":240,"magicLevel":240,"range":90,"magic":90,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":20,"magicDef":20,"bonusAttack":90,"bonusStrength":112,"bonusRangeStrength":112,"bonusMagicDamage":112,"poisonImmune":true,"venomImmune":true},"9040":{"name":"Corrupted Rat","hitpoints":14,"combatLevel":34,"attackSpeed":4,"attackLevel":42,"strengthLevel":48,"defenceLevel":6,"magicLevel":6,"poisonImmune":true,"venomImmune":true},"9041":{"name":"Corrupted Spider","hitpoints":12,"combatLevel":32,"attackSpeed":4,"attackLevel":48,"strengthLevel":39,"defenceLevel":4,"magicLevel":4,"poisonImmune":true,"venomImmune":true},"9042":{"name":"Corrupted Bat","combatLevel":48,"attackSpeed":4,"attackLevel":36,"strengthLevel":102,"defenceLevel":2,"magicLevel":2,"poisonImmune":true,"venomImmune":true},"9043":{"name":"Corrupted Unicorn","hitpoints":44,"combatLevel":64,"attackSpeed":4,"attackLevel":75,"strengthLevel":72,"defenceLevel":24,"magicLevel":24,"poisonImmune":true,"venomImmune":true},"9044":{"name":"Corrupted Scorpion","hitpoints":38,"combatLevel":89,"attackSpeed":4,"attackLevel":72,"strengthLevel":159,"defenceLevel":18,"magicLevel":18,"poisonImmune":true,"venomImmune":true},"9045":{"name":"Corrupted Wolf","hitpoints":52,"combatLevel":102,"attackSpeed":4,"attackLevel":159,"strengthLevel":99,"defenceLevel":22,"magicLevel":22,"poisonImmune":true,"venomImmune":true},"9046":{"name":"Corrupted Bear","hitpoints":100,"combatLevel":258,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":98,"rangeLevel":147,"magicLevel":98,"bonusAttack":81,"bonusStrength":132,"poisonImmune":true,"venomImmune":true},"9047":{"name":"Corrupted Dragon","hitpoints":100,"combatLevel":258,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":98,"rangeLevel":147,"magicLevel":98,"magic":146,"bonusMagicDamage":226,"poisonImmune":true,"venomImmune":true},"9048":{"name":"Corrupted Dark Beast","hitpoints":100,"combatLevel":258,"attackSpeed":4,"attackLevel":147,"strengthLevel":147,"defenceLevel":98,"rangeLevel":147,"magicLevel":98,"range":81,"bonusRangeStrength":132,"poisonImmune":true,"venomImmune":true},"9049":{"name":"Zalcano","hitpoints":1000,"combatLevel":336,"attackSpeed":5,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"9051":{"name":"Golem","hitpoints":14,"combatLevel":64},"9118":{"name":"Rabbit","hitpoints":2000,"combatLevel":2,"attackSpeed":3,"attackLevel":600,"strengthLevel":200,"defenceLevel":450,"rangeLevel":1,"magicLevel":300,"stabDef":150,"slashDef":150,"crushDef":150,"rangeDef":200,"magicDef":150,"bonusAttack":80,"bonusStrength":60},"9181":{"name":"Dire Wolf","hitpoints":74,"combatLevel":72,"attackSpeed":4,"attackLevel":60,"strengthLevel":61,"defenceLevel":62,"rangeLevel":1,"magicLevel":1},"9182":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9183":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9184":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9185":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9186":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9187":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9188":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9189":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9190":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9191":{"name":"Guard","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":80,"defenceLevel":95,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9247":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9249":{"name":"Essyllt (hard)","hitpoints":320,"combatLevel":395,"attackSpeed":4,"attackLevel":408,"strengthLevel":408,"defenceLevel":104,"rangeLevel":512,"magicLevel":104,"range":168,"stabDef":40,"slashDef":40,"crushDef":20,"rangeDef":120,"magicDef":30,"bonusAttack":14,"bonusStrength":28,"bonusRangeStrength":28},"9258":{"name":"Basilisk Sentinel","hitpoints":520,"combatLevel":358,"slayerLevel":60,"attackSpeed":4,"attackLevel":274,"strengthLevel":274,"defenceLevel":274,"rangeLevel":1,"magicLevel":274,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":10,"magicDef":50,"bonusAttack":12,"bonusMagicDamage":12},"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,"slayerLevel":40,"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,"slayerLevel":40,"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":214,"strengthLevel":214,"defenceLevel":214,"rangeLevel":214,"magicLevel":214,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50},"9290":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":214,"strengthLevel":214,"defenceLevel":214,"rangeLevel":214,"magicLevel":214,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50},"9291":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":214,"strengthLevel":214,"defenceLevel":214,"rangeLevel":214,"magicLevel":214,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50},"9292":{"name":"The Jormungand","hitpoints":600,"combatLevel":363,"slayerLevel":40,"attackSpeed":5,"attackLevel":214,"strengthLevel":214,"defenceLevel":214,"rangeLevel":214,"magicLevel":214,"stabDef":50,"slashDef":50,"crushDef":10,"rangeDef":50,"magicDef":50},"9293":{"name":"Basilisk Knight","hitpoints":300,"combatLevel":204,"slayerLevel":60,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30},"9295":{"name":"Typhor","hitpoints":360,"combatLevel":218,"slayerLevel":40,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30,"poisonImmune":true,"venomImmune":true},"9296":{"name":"Typhor","hitpoints":360,"combatLevel":218,"slayerLevel":40,"attackSpeed":4,"attackLevel":186,"strengthLevel":186,"defenceLevel":186,"rangeLevel":1,"magicLevel":186,"stabDef":30,"slashDef":30,"magicDef":30,"poisonImmune":true,"venomImmune":true},"9415":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9416":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9417":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9418":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9419":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9420":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9421":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9422":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9423":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9424":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9425":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9426":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9427":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9428":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9429":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9430":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9431":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9432":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9433":{"name":"The Nightmare","hitpoints":2400,"combatLevel":814,"attackSpeed":6,"attackLevel":150,"strengthLevel":150,"defenceLevel":150,"rangeLevel":150,"magicLevel":150,"range":140,"magic":140,"stabDef":120,"slashDef":180,"crushDef":40,"rangeDef":600,"magicDef":600,"bonusAttack":140,"bonusStrength":128,"bonusRangeStrength":64,"bonusMagicDamage":64,"poisonImmune":true,"venomImmune":true},"9446":{"name":"Sleepwalker","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1},"9447":{"name":"Sleepwalker","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1},"9448":{"name":"Sleepwalker","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1},"9449":{"name":"Sleepwalker","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1},"9450":{"name":"Sleepwalker","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1},"9451":{"name":"Sleepwalker","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1},"9452":{"name":"Parasite","hitpoints":40,"combatLevel":86,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":40,"rangeLevel":60,"magicLevel":60,"range":12,"magic":12,"stabDef":50,"slashDef":70,"crushDef":10,"rangeDef":100,"magicDef":100,"bonusRangeStrength":26,"bonusMagicDamage":26},"9453":{"name":"Parasite","hitpoints":40,"combatLevel":57,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":40,"rangeLevel":60,"magicLevel":60,"range":12,"magic":12,"stabDef":50,"slashDef":70,"crushDef":10,"rangeDef":100,"magicDef":100,"bonusRangeStrength":26,"bonusMagicDamage":26},"9454":{"name":"Husk","hitpoints":20,"combatLevel":48,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":80},"9455":{"name":"Husk","hitpoints":20,"combatLevel":48,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":80,"magicLevel":80,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":80},"9465":{"name":"Infernal pyrelord","hitpoints":184,"combatLevel":134,"slayerLevel":30,"attackSpeed":4,"attackLevel":124,"strengthLevel":96,"defenceLevel":68,"rangeLevel":1,"magicLevel":1,"stabDef":18,"slashDef":18,"crushDef":18,"rangeDef":18},"9466":{"name":"Husk","hitpoints":20,"combatLevel":104,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"magicLevel":80,"magic":168,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":80,"bonusMagicDamage":82},"9467":{"name":"Husk","hitpoints":20,"combatLevel":104,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":20,"rangeLevel":80,"range":168,"stabDef":20,"slashDef":20,"crushDef":20,"rangeDef":80,"magicDef":80,"bonusRangeStrength":82},"9468":{"name":"Parasite","hitpoints":80,"combatLevel":129,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":60,"rangeLevel":60,"magicLevel":60,"range":85,"magic":84,"stabDef":60,"slashDef":80,"crushDef":20,"rangeDef":120,"magicDef":120,"bonusRangeStrength":102,"bonusMagicDamage":102},"9469":{"name":"Parasite","hitpoints":40,"combatLevel":91,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":40,"rangeLevel":60,"magicLevel":60,"range":44,"magic":44,"stabDef":50,"slashDef":70,"crushDef":10,"rangeDef":100,"magicDef":100,"bonusRangeStrength":62,"bonusMagicDamage":62},"9470":{"name":"Sleepwalker","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"poisonImmune":true,"venomImmune":true},"9502":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9503":{"name":"Iorwerth Warrior","hitpoints":105,"combatLevel":108,"attackSpeed":4,"attackLevel":95,"strengthLevel":95,"defenceLevel":80,"magicLevel":1,"stabDef":50,"slashDef":70,"crushDef":70,"rangeDef":50,"magicDef":60},"9573":{"name":"Acidic Bloodveld","hitpoints":5,"combatLevel":56,"attackSpeed":4,"attackLevel":80,"strengthLevel":46,"defenceLevel":2,"rangeLevel":1,"magicLevel":1},"9609":{"name":"Seagull","hitpoints":10,"combatLevel":3,"attackSpeed":4,"attackLevel":1,"strengthLevel":1,"defenceLevel":1,"rangeLevel":1,"magicLevel":1},"9727":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"9728":{"name":"Vampyre Juvinate","hitpoints":85,"combatLevel":54,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":40,"rangeLevel":1,"magicLevel":1},"9731":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"9732":{"name":"Vampyre Juvenile","hitpoints":60,"combatLevel":45,"attackSpeed":4,"attackLevel":40,"strengthLevel":30,"defenceLevel":30,"rangeLevel":1,"magicLevel":1},"9735":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"9736":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"9737":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"9738":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"9739":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"9740":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"9741":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"9742":{"name":"Vyrewatch","hitpoints":90,"combatLevel":105,"attackSpeed":8,"attackLevel":105,"strengthLevel":86,"defenceLevel":85,"rangeLevel":105,"magicLevel":105},"9756":{"name":"Vyrewatch Sentinel","hitpoints":150,"combatLevel":151,"slayerLevel":38,"attackSpeed":4,"attackLevel":120,"strengthLevel":160,"defenceLevel":180,"rangeLevel":120,"magicLevel":120,"bonusAttack":135,"bonusStrength":150},"9757":{"name":"Vyrewatch Sentinel","hitpoints":150,"combatLevel":151,"slayerLevel":38,"attackSpeed":4,"attackLevel":120,"strengthLevel":160,"defenceLevel":180,"rangeLevel":120,"magicLevel":120,"bonusAttack":135,"bonusStrength":150},"9758":{"name":"Vyrewatch Sentinel","hitpoints":150,"combatLevel":151,"slayerLevel":38,"attackSpeed":4,"attackLevel":120,"strengthLevel":160,"defenceLevel":180,"rangeLevel":120,"magicLevel":120,"bonusAttack":135,"bonusStrength":150},"9759":{"name":"Vyrewatch Sentinel","hitpoints":150,"combatLevel":151,"slayerLevel":38,"attackSpeed":4,"attackLevel":120,"strengthLevel":160,"defenceLevel":180,"rangeLevel":120,"magicLevel":120,"bonusAttack":135,"bonusStrength":150},"9760":{"name":"Vyrewatch Sentinel","hitpoints":150,"combatLevel":151,"slayerLevel":38,"attackSpeed":4,"attackLevel":120,"strengthLevel":160,"defenceLevel":180,"rangeLevel":120,"magicLevel":120,"bonusAttack":135,"bonusStrength":150},"9761":{"name":"Vyrewatch Sentinel","hitpoints":150,"combatLevel":151,"slayerLevel":38,"attackSpeed":4,"attackLevel":120,"strengthLevel":160,"defenceLevel":180,"rangeLevel":120,"magicLevel":120,"bonusAttack":135,"bonusStrength":150},"9762":{"name":"Vyrewatch Sentinel","hitpoints":150,"combatLevel":151,"slayerLevel":38,"attackSpeed":4,"attackLevel":120,"strengthLevel":160,"defenceLevel":180,"rangeLevel":120,"magicLevel":120,"bonusAttack":135,"bonusStrength":150},"9763":{"name":"Vyrewatch Sentinel","hitpoints":150,"combatLevel":151,"slayerLevel":38,"attackSpeed":4,"attackLevel":120,"strengthLevel":160,"defenceLevel":180,"rangeLevel":120,"magicLevel":120,"bonusAttack":135,"bonusStrength":150},"10374":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"10375":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"10376":{"name":"Hill Giant","hitpoints":35,"combatLevel":28,"attackSpeed":6,"attackLevel":18,"strengthLevel":22,"defenceLevel":26,"rangeLevel":1,"magicLevel":1,"bonusAttack":18,"bonusStrength":16},"10397":{"name":"Spiked Turoth","hitpoints":195,"combatLevel":244,"slayerLevel":55,"attackSpeed":4,"attackLevel":204,"strengthLevel":280,"defenceLevel":154,"rangeLevel":1,"magicLevel":1,"slashDef":40,"crushDef":40},"10398":{"name":"Shadow Wyrm","hitpoints":320,"combatLevel":267,"slayerLevel":62,"attackSpeed":4,"attackLevel":300,"strengthLevel":180,"defenceLevel":125,"rangeLevel":125,"magicLevel":160,"stabDef":20,"slashDef":100,"crushDef":100,"rangeDef":20,"magicDef":50,"bonusStrength":30,"bonusMagicDamage":30},"10400":{"name":"Guardian Drake","hitpoints":630,"combatLevel":386,"slayerLevel":84,"attackLevel":270,"strengthLevel":280,"defenceLevel":200,"rangeLevel":240,"magicLevel":300,"range":40,"stabDef":60,"slashDef":100,"crushDef":100,"rangeDef":150,"magicDef":20,"bonusStrength":12},"10402":{"name":"Colossal Hydra","hitpoints":750,"combatLevel":309,"slayerLevel":95,"attackLevel":1,"strengthLevel":1,"defenceLevel":100,"rangeLevel":250,"magicLevel":250,"stabDef":100,"slashDef":200,"crushDef":200,"rangeDef":20,"magicDef":200},"10435":{"name":"Pig Thing","hitpoints":40,"combatLevel":37,"attackLevel":35,"strengthLevel":30,"defenceLevel":25,"rangeLevel":35,"magicLevel":25,"range":35,"magic":25,"slashDef":30,"crushDef":10,"magicDef":30,"bonusAttack":18,"bonusStrength":16,"bonusRangeStrength":20},"10436":{"name":"Pig Thing","hitpoints":40,"combatLevel":37,"attackLevel":35,"strengthLevel":30,"defenceLevel":25,"rangeLevel":35,"magicLevel":25,"range":35,"magic":25,"slashDef":30,"crushDef":10,"magicDef":30,"bonusAttack":18,"bonusStrength":16,"bonusRangeStrength":20},"10437":{"name":"Pig Thing","hitpoints":40,"combatLevel":37,"attackLevel":35,"strengthLevel":30,"defenceLevel":25,"rangeLevel":35,"magicLevel":25,"range":35,"magic":25,"slashDef":30,"crushDef":10,"magicDef":30,"bonusAttack":18,"bonusStrength":16,"bonusRangeStrength":20}} \ No newline at end of file diff --git a/runelite-client/src/main/resources/sentry.properties b/runelite-client/src/main/resources/sentry.properties deleted file mode 100644 index 465d896b71..0000000000 --- a/runelite-client/src/main/resources/sentry.properties +++ /dev/null @@ -1,3 +0,0 @@ -dsn=https://fa31d674e44247fa93966c69a903770f@sentry.io/1811856 -release=@open.osrs.version@ -stacktrace.app.packages=net.runelite,com.openosrs \ No newline at end of file diff --git a/runelite-client/src/main/resources/skill_icons_small/soul_wars_zeal.png b/runelite-client/src/main/resources/skill_icons_small/soul_wars_zeal.png new file mode 100644 index 0000000000..2201b0a6f4 Binary files /dev/null and b/runelite-client/src/main/resources/skill_icons_small/soul_wars_zeal.png differ diff --git a/runelite-client/src/main/resources/slayer_xp.json b/runelite-client/src/main/resources/slayer_xp.json deleted file mode 100644 index 75aa32dd17..0000000000 --- a/runelite-client/src/main/resources/slayer_xp.json +++ /dev/null @@ -1,1970 +0,0 @@ -{ - "Wyrm": [ - 133.2, - 99 - ], - "Drake": [ - 268.7, - 192 - ], - "Hydra": [ - 322.5, - 194 - ], - "Alchemical Hydra": [ - 1320, - 426 - ], - "Rat": [ - 2.0, - 1.0, - 2.0, - 3.0, - 2.0, - 1.0, - 2.0, - 1.0 - ], - "Giant crypt rat": [ - 70.0, - 76.0 - ], - "Skeleton fremennik": [ - 25.0, - 40.0, - 35.0, - 50.0, - 40.0, - 60.0 - ], - "Revenant imp": [ - 10.0, - 7.0 - ], - "Gorak": [ - 112.0, - 145.0, - 112.0, - 149.0 - ], - "Moss giant": [ - 60.0, - 42.0, - 85.0, - 48.0 - ], - "Greater demon": [ - 87.0, - 92.0, - 115.0, - 100.0, - 120.0, - 101.0, - 120.0, - 104.0, - 130.0, - 113.0 - ], - "Malevolent Mage": [ - 1750.0, - 162.0 - ], - "Adamant dragon": [ - 325.0, - 338.0 - ], - "Skeleton Mage": [ - 17.0, - 16.0, - 80.0, - 83.0 - ], - "Ogre": [ - 60.0, - 53.0, - -1.0, - 58.0, - 60.0, - 63.0 - ], - "Reanimated dagannoth": [ - 35.0, - -1.0 - ], - "Feral Vampyre": [ - 40.0, - 61.0, - -1.0, - 64.0, - -1.0, - 70.0, - 50.0, - 72.0, - 60.0, - 77.0, - -1.0, - 100.0, - -1.0, - 130.0 - ], - "Thrower Troll": [ - 95.0, - 67.0, - 95.0, - 68.0 - ], - "Gorad": [ - 80.0, - 68.0 - ], - "Ancient Wyvern": [ - 315.0, - 210.0 - ], - "Mountain troll": [ - 90.0, - 69.0, - 90.0, - 71.0 - ], - "Infernal Mage": [ - 60.0, - 66.0 - ], - "Mourner": [ - -1.0, - 11.0, - -1.0, - 12.0, - -1.0, - 13.0, - -1.0, - 18.0, - -1.0, - 24.0, - -1.0, - 24.0, - 107.5, - 108.0 - ], - "Ancient Fungi": [ - 154.0, - 109.0 - ], - "Crawling Hand": [ - 16.0, - 8.0, - 19.0, - 12.0 - ], - "Jal-Nib": [ - 10.0, - 32.0 - ], - "Poison Scorpion": [ - 23.0, - 20.0 - ], - "Skeleton heavy": [ - 124.0, - 132.0 - ], - "Zygomite": [ - 65.0, - 74.0, - 75.0, - 86.0 - ], - "Jal-MejRah": [ - 25.0, - 85.0 - ], - "Cockathrice": [ - 950.0, - 89.0 - ], - "Jal-MejJak": [ - 80.0, - 250.0 - ], - "Jal-AkRek-Ket": [ - 15.0, - 70.0 - ], - "Yt-MejKot": [ - 80.0, - 180.0 - ], - "Revenant hellhound": [ - 86.0, - 90.0 - ], - "Chaos dwarf": [ - 61.0, - 48.0 - ], - "Undead cow": [ - 8.0, - 2.0 - ], - "Speedy Keith": [ - 37.0, - 34.0 - ], - "Ket-Zek": [ - 160.0, - 360.0 - ], - "Reanimated horror": [ - 35.0, - -1.0 - ], - "Karil the Tainted": [ - 100.0, - 98.0 - ], - "Flight Kilisa": [ - 132.5, - 159.0 - ], - "Zombie pirate": [ - 52.0, - 57.0 - ], - "Small Lizard": [ - 15.0, - 12.0 - ], - "Cave abomination": [ - 1300.0, - 206.0 - ], - "Dungeon rat": [ - 2.0, - 12.0 - ], - "Kraken": [ - 255.0, - 291.0 - ], - "Baby dragon": [ - 50.0, - 48.0, - 50.0, - 48.0, - 50.0, - 48.0, - 80.0, - 83.0 - ], - "Dharok the Wretched": [ - 115.0, - 115.0 - ], - "Chicken": [ - 3.0, - 1.0 - ], - "TzHaar-Mej": [ - 100.0, - 103.0 - ], - "Skeleton mage": [ - 17.0, - 16.0, - 80.0, - 83.0 - ], - "Undead Lumberjack": [ - 12.0, - 40.0, - 13.0, - 45.0, - 14.0, - 50.0, - 16.0, - 60.0 - ], - "Zulrah": [ - 500.0, - 725.0, - 500.0, - 725.0, - 500.0, - 725.0 - ], - "Vyrewatch": [ - -1.0, - 87.0, - 90.0, - 105.0, - 90.0, - 110.0, - 105.0, - 120.0, - 110.0, - 125.0 - ], - "Duckling": [ - 5.0, - 1.0 - ], - "Baby Roc": [ - 50.0, - 75.0 - ], - "Brutal black dragon": [ - 346.5, - 318.0 - ], - "Lava dragon": [ - 248.0, - 252.0 - ], - "Vulture": [ - 10.0, - 31.0 - ], - "Vampyre Juvinate": [ - -1.0, - 50.0, - -1.0, - 54.0, - -1.0, - 54.0, - -1.0, - 75.0, - 50.0, - 59.0, - 100.0, - 90.0, - -1.0, - 119.0 - ], - "Monkey": [ - 6.0, - 3.0 - ], - "Tstanon Karlak": [ - 142.0, - 145.0 - ], - "Zogre": [ - 71.0, - 44.0 - ], - "Aviansie": [ - 70.0, - 69.0, - 63.0, - 71.0, - 67.0, - 73.0, - 83.0, - 79.0, - 77.0, - 79.0, - 86.0, - 83.0, - 86.0, - 84.0, - 69.0, - 89.0, - 95.0, - 92.0, - 75.0, - 94.0, - 98.0, - 97.0, - 79.0, - 97.0, - 115.0, - 131.0, - 124.0, - 137.0, - 139.0, - 148.0 - ], - "Cave goblin": [ - 10.0, - 3.0 - ], - "Kalphite Worker": [ - 40.0, - 28.0 - ], - "Smoke Devil": [ - 185.0, - 160.0 - ], - "Arrg": [ - 150.0, - 113.0, - 299.5, - 210.0 - ], - "Crazy archaeologist": [ - 275.0, - 204.0 - ], - "Wolf": [ - 10.0, - 11.0, - 15.0, - 14.0, - 34.0, - 25.0, - 69.0, - 64.0 - ], - "Torag the Corrupted": [ - 112.5, - 115.0 - ], - "Suqah": [ - 107.5, - 111.0 - ], - "Night beast": [ - 6462.0, - 374.0 - ], - "Skeleton Hellhound": [ - 55.0, - 97.0, - -1.0, - 198.0 - ], - "Giant rockslug": [ - 770.0, - 86.0 - ], - "Rune dragon": [ - 363.0, - 380.0 - ], - "Dagannoth Prime": [ - 331.5, - 303.0 - ], - "Monkey Zombie": [ - 60.0, - 82.0, - 90.0, - 98.0, - 90.0, - 129.0 - ], - "Ogress Warrior": [ - 82.0, - 82.0 - ], - "Turoth": [ - 76.0, - 83.0, - 77.0, - 85.0, - 79.0, - 87.0, - 81.0, - 89.0 - ], - "Skotizo": [ - 618.5, - 321.0 - ], - "Iron dragon": [ - 173.2, - 189.0, - 204.5, - 215.0 - ], - "Revenant dragon": [ - 186.0, - 135.0 - ], - "Ice wolf": [ - 70.0, - 96.0, - 70.0, - 132.0 - ], - "Dark beast": [ - 225.4, - 182.0 - ], - "Ghost": [ - 25.0, - 19.0, - 20.0, - 24.0, - 75.0, - 76.0, - 80.0, - 77.0 - ], - "Dwarf gang member": [ - 40.0, - 44.0, - 25.0, - 49.0, - 25.0, - 44.0 - ], - "Revenant pyrefiend": [ - 48.0, - 52.0 - ], - "Abhorrent spectre": [ - 2500.0, - 253.0 - ], - "Cave slime": [ - 25.0, - 23.0 - ], - "Insatiable Bloodveld": [ - 2900.0, - 202.0 - ], - "Jungle spider": [ - 50.0, - 44.0 - ], - "Long-tailed Wyvern": [ - 205.0, - 152.0 - ], - "Elvarg": [ - 80.0, - 83.0, - -1.0, - 214.0 - ], - "General Graardor": [ - 338.0, - 624.0 - ], - "Scorpion": [ - 17.0, - 14.0, - 30.0, - 37.0, - 55.0, - 59.0 - ], - "Goblin": [ - 5.0, - 2.0, - 5.0, - 5.0, - 7.0, - 11.0, - 3.0, - 12.0, - 15.0, - 12.0, - 16.0, - 13.0, - 13.0, - 13.0, - 16.0, - 15.0, - 22.0, - 16.0, - 18.0, - 17.0, - 26.0, - 25.0 - ], - "Corrupt Lizardman": [ - 50.0, - 46.0, - 150.0, - 152.0 - ], - "Ranis Drakan": [ - 400.0, - 233.0, - 400.0, - 233.0 - ], - "Asyn Shade": [ - 90.0, - 100.0 - ], - "Greater Nechryael": [ - 205.0, - 200.0 - ], - "Undead chicken": [ - 3.0, - 1.0 - ], - "Basilisk": [ - 75.0, - 61.0 - ], - "Monkey Archer": [ - 50.0, - 86.0 - ], - "Cave goblin guard": [ - 26.0, - 24.0 - ], - "Ancient Zygomite": [ - 154.0, - 109.0 - ], - "Chompy bird": [ - 10.0, - 6.0 - ], - "Giant rat": [ - 5.0, - 3.0, - 10.0, - 6.0, - 25.0, - 26.0 - ], - "Blessed spider": [ - 32.0, - 39.0 - ], - "Brutal blue dragon": [ - 257.0, - 271.0 - ], - "Crypt spider": [ - 45.0, - 56.0 - ], - "Vitreous warped Jelly": [ - 2200.0, - 241.0 - ], - "Mutated Bloodveld": [ - 170.0, - 123.0 - ], - "Blue dragon": [ - 107.6, - 111.0 - ], - "Spiritual warrior": [ - 100.0, - 115.0, - 110.0, - 125.0, - 131.0, - 134.0, - 98.0, - 123.0 - ], - "Wall beast": [ - 105.0, - 49.0 - ], - "Giant bat": [ - 32.0, - 27.0 - ], - "Pee Hat": [ - 126.0, - 91.0 - ], - "Skeleton thug": [ - 124.0, - 132.0 - ], - "Dust devil": [ - 105.0, - 93.0, - 130.0, - 110.0 - ], - "Giant lobster": [ - 50.0, - 45.0 - ], - "Ice spider": [ - 65.0, - 61.0 - ], - "Scarab swarm": [ - 1.0, - 98.0 - ], - "Hill Giant": [ - 35.0, - 28.0 - ], - "Tz-Kek": [ - 20.0, - 45.0, - 10.0, - 22.0 - ], - "Twisted Banshee": [ - 100.0, - 89.0 - ], - "Sorebones": [ - 22.0, - 57.0 - ], - "Revenant hobgoblin": [ - 73.0, - 60.0 - ], - "Sergeant Grimspike": [ - 146.0, - 142.0 - ], - "Smoke devil": [ - 185.0, - 160.0 - ], - "Cyclops": [ - 75.0, - 56.0, - 100.0, - 76.0, - 110.0, - 81.0, - 150.0, - 106.0 - ], - "Jal-Zek": [ - 220.0, - 490.0 - ], - "TzHaar-Ket": [ - 140.0, - 149.0, - 200.0, - 221.0 - ], - "Flockleader Geerin": [ - 132.5, - 149.0 - ], - "Mammoth": [ - 130.0, - 80.0 - ], - "Stick": [ - 141.5, - 104.0 - ], - "TzKal-Zuk": [ - 101890.0, - 1400.0 - ], - "Waterfiend": [ - 128.0, - 115.0 - ], - "Skeleton hero": [ - 124.0, - 149.0 - ], - "Ghoul": [ - 50.0, - 42.0 - ], - "Thrower troll": [ - 95.0, - 67.0, - 95.0, - 68.0 - ], - "Enclave guard": [ - 80.0, - 83.0 - ], - "Crypt rat": [ - 35.0, - 43.0 - ], - "Fire giant": [ - 111.0, - 86.0, - 133.5, - 104.0, - 153.5, - 109.0 - ], - "Skeleton warlord": [ - 124.0, - 132.0 - ], - "Dagannoth Supreme": [ - 255.0, - 303.0 - ], - "Phrin Shadow": [ - 56.0, - 60.0 - ], - "Nechryarch": [ - 3280.0, - 300.0 - ], - "Giant scarab": [ - 137.0, - 191.0, - 280.5, - 316.0 - ], - "Kraka": [ - 126.0, - 91.0 - ], - "Bird": [ - 5.0, - 5.0, - 10.0, - 11.0 - ], - "Kolodion": [ - -1.0, - -1.0, - -1.0, - -1.0, - -1.0, - -1.0, - -1.0, - -1.0, - 107.0, - 112.0 - ], - "Ent": [ - 107.5, - 86.0, - 107.5, - 101.0 - ], - "White wolf": [ - 44.0, - 38.0 - ], - "Death wing": [ - 80.0, - 83.0 - ], - "Sergeant Strongstack": [ - 128.0, - 141.0 - ], - "Shade": [ - 5.0, - 159.0, - 115.0, - 140.0 - ], - "Mithril dragon": [ - 273.0, - 304.0 - ], - "Bronze dragon": [ - 125.0, - 131.0, - 125.0, - 143.0 - ], - "Ice troll grunt": [ - 84.0, - 100.0 - ], - "Bloodveld": [ - 120.0, - 76.0, - 120.0, - 81.0 - ], - "TzTok-Jad": [ - 25250.0, - 702.0 - ], - "Brine rat": [ - 50.0, - 70.0 - ], - "Vitreous Jelly": [ - 1900.0, - 206.0 - ], - "Taloned Wyvern": [ - 205.0, - 147.0 - ], - "Skeleton": [ - 18.0, - 13.0, - 24.0, - 21.0, - 29.0, - 22.0, - 17.0, - 25.0, - -1.0, - 42.0, - 59.0, - 45.0, - 70.0, - 60.0, - 70.0, - 68.0, - 51.0, - 77.0, - 77.0, - 85.0 - ], - "Cave horror": [ - 55.0, - 80.0 - ], - "Revenant cyclops": [ - 119.0, - 82.0 - ], - "Monkey guard": [ - 130.0, - 167.0 - ], - "Asyn Shadow": [ - 90.0, - 100.0 - ], - "Black dragon": [ - 199.5, - 227.0, - 262.0, - 247.0 - ], - "Black bear": [ - 25.0, - 19.0 - ], - "Troll general": [ - 150.5, - 113.0 - ], - "Greater Skeleton Hellhound": [ - 214.5, - 281.0 - ], - "Dusk": [ - 1350.0, - 248.0, - 1350.0, - 328.0 - ], - "Warped Jelly": [ - 140.0, - 112.0 - ], - "Black Heather": [ - 37.0, - 34.0 - ], - "Dark warrior": [ - 17.0, - 8.0, - 182.0, - 145.0 - ], - "K'ril Tsutsaroth": [ - 350.5, - 650.0 - ], - "Ice troll male": [ - 84.0, - 82.0 - ], - "Jal-Ak": [ - 40.0, - 165.0 - ], - "Molanisk": [ - 52.0, - 51.0 - ], - "Cave kraken": [ - 125.0, - 127.0 - ], - "Yt-HurKot": [ - 60.0, - 108.0, - -1.0, - 141.0 - ], - "Repugnant spectre": [ - 4085.0, - 335.0 - ], - "Abyssal Sire": [ - 450.0, - 350.0 - ], - "Gunthor the brave": [ - 35.0, - 29.0 - ], - "Earth warrior": [ - 54.0, - 51.0 - ], - "Terror dog": [ - 82.0, - 100.0, - 87.0, - 110.0 - ], - "Agrith Naar": [ - 100.0, - 100.0, - 100.0, - 196.0 - ], - "Marble gargoyle": [ - 2768.0, - 349.0 - ], - "Minotaur": [ - 10.0, - 12.0, - 22.0, - 27.0 - ], - "Reanimated abyssal": [ - 35.0, - -1.0 - ], - "Spider": [ - 2.0, - 1.0, - 2.0, - 1.0, - 2.0, - 1.0, - 22.0, - 24.0 - ], - "Red dragon": [ - 143.0, - 152.0 - ], - "Duck": [ - 6.0, - -1.0 - ], - "Guthan the Infested": [ - 115.0, - 115.0 - ], - "Cave goblin miner": [ - 10.0, - 11.0 - ], - "Rooster": [ - 7.0, - 2.0 - ], - "Wingman Skree": [ - 124.0, - 143.0 - ], - "Shadow warrior": [ - 67.0, - 48.0 - ], - "Monstrous basilisk": [ - 1700.0, - 135.0 - ], - "Banshee": [ - 22.0, - 23.0 - ], - "Ice Troll": [ - 129.0, - 120.0, - 97.0, - 121.0, - 86.0, - 123.0, - 86.0, - 124.0 - ], - "Zakl'n Gritch": [ - 150.0, - 142.0 - ], - "Harpie Bug Swarm": [ - 25.0, - 46.0 - ], - "Lizard": [ - 40.0, - 42.0 - ], - "Ice troll female": [ - 84.0, - 82.0 - ], - "Spiritual ranger": [ - 120.0, - 118.0, - 106.0, - 122.0, - 131.0, - 115.0, - 120.0, - 127.0 - ], - "Gargoyle": [ - 105.0, - 111.0 - ], - "Reanimated bloodveld": [ - 35.0, - -1.0 - ], - "Rogue": [ - 17.0, - 15.0, - 125.0, - 135.0 - ], - "Black demon": [ - 157.0, - 172.0, - 160.0, - 178.0, - 170.0, - 184.0, - 200.0, - 188.0, - 255.0, - 292.0 - ], - "Kree'arra": [ - 357.0, - 580.0 - ], - "Grave scorpion": [ - 7.0, - 12.0 - ], - "Brutal green dragon": [ - 183.0, - 227.0 - ], - "Chasm Crawler": [ - 600.0, - 68.0 - ], - "Elder Chaos druid": [ - 150.0, - 129.0 - ], - "Vampyre Juvenile": [ - 60.0, - 45.0, - 60.0, - 45.0 - ], - "Guard dog": [ - 49.0, - 44.0 - ], - "Seagull": [ - 5.0, - 2.0, - 5.0, - 3.0 - ], - "Skeleton brute": [ - 124.0, - 132.0 - ], - "Otherworldly being": [ - 66.0, - 64.0 - ], - "Lizardman shaman": [ - 157.5, - 150.0 - ], - "Tz-Kih": [ - 10.0, - 22.0 - ], - "Skeletal miner": [ - 39.0, - 42.0 - ], - "Blessed giant rat": [ - 30.0, - 9.0 - ], - "Flaming pyrelord": [ - 1250.0, - 97.0 - ], - "Insatiable mutated Bloodveld": [ - 4100.0, - 278.0 - ], - "Berry": [ - 90.0, - 71.0 - ], - "Cow calf": [ - 6.0, - 2.0 - ], - "Porazdir": [ - 376.0, - 235.0 - ], - "Lesser demon": [ - 79.0, - 82.0, - 85.0, - 87.0, - 98.0, - 94.0, - 110.0, - 94.0 - ], - "JalTok-Jad": [ - 350.0, - 900.0 - ], - "Terrorbird": [ - 34.0, - 28.0 - ], - "King Black Dragon": [ - 258.0, - 276.0 - ], - "Kalphite Guardian": [ - 170.0, - 141.0 - ], - "Fiyr Shadow": [ - 110.0, - 120.0, - 110.0, - 140.0 - ], - "Obor": [ - 129.0, - 106.0 - ], - "Revenant demon": [ - 86.0, - 98.0 - ], - "Ice giant": [ - 70.0, - 53.0, - 100.0, - 67.0 - ], - "Baby red dragon": [ - 50.0, - 48.0 - ], - "Temple guardian": [ - 45.0, - 30.0 - ], - "Hellhound": [ - 116.0, - 122.0, - 116.0, - 127.0, - 150.0, - 136.0 - ], - "Dwarf": [ - 16.0, - 10.0 - ], - "Skogre": [ - 71.0, - 44.0 - ], - "Tortured soul": [ - 51.0, - 59.0 - ], - "Steel dragon": [ - 220.5, - 246.0, - 262.5, - 274.0 - ], - "King Scorpion": [ - 30.0, - 32.0 - ], - "Callisto": [ - 312.0, - 470.0 - ], - "Spiritual mage": [ - 75.0, - 121.0, - 85.0, - 120.0, - 106.0, - 121.0, - 75.0, - 123.0 - ], - "Revenant knight": [ - 168.0, - 126.0 - ], - "Monkey Guard": [ - 130.0, - 167.0 - ], - "Kalphite Queen": [ - 535.5, - 333.0, - 537.5, - 333.0 - ], - "Revenant goblin": [ - 14.0, - 15.0 - ], - "Crushing hand": [ - 605.0, - 45.0 - ], - "Reanimated kalphite": [ - 35.0, - -1.0 - ], - "Green dragon": [ - 75.0, - 79.0, - 100.0, - 88.0 - ], - "Ice warrior": [ - 59.0, - 57.0 - ], - "Reanimated aviansie": [ - 35.0, - -1.0 - ], - "Nuclear smoke devil": [ - 2400.0, - 280.0 - ], - "Zombie swab": [ - 50.0, - 55.0 - ], - "Dark Ankou": [ - 60.0, - 95.0 - ], - "Poison spider": [ - 64.0, - 31.0, - 64.0, - 64.0 - ], - "Rockslug": [ - 27.0, - 29.0 - ], - "Sea Snake Young": [ - 85.0, - 90.0 - ], - "Fiyr Shade": [ - 110.0, - 120.0, - 110.0, - 140.0 - ], - "Venenatis": [ - 388.8, - 464.0 - ], - "Tortured gorilla": [ - 409.0, - 141.0, - -1.0, - 142.0 - ], - "Kamil": [ - 146.0, - 154.0, - -1.0, - 273.0 - ], - "Reanimated elf": [ - 35.0, - -1.0 - ], - "Jal-AkRek-Mej": [ - 15.0, - 70.0 - ], - "Grizzly bear cub": [ - 35.0, - 33.0 - ], - "Giant crypt spider": [ - 80.0, - 79.0 - ], - "Ogre chieftain": [ - 60.0, - 81.0 - ], - "Ice troll": [ - 129.0, - 120.0, - 97.0, - 121.0, - 86.0, - 123.0, - 86.0, - 124.0 - ], - "Dagannoth Rex": [ - 331.5, - 303.0 - ], - "Thermonuclear smoke devil": [ - 240.0, - 301.0 - ], - "Black Guard Berserker": [ - 50.0, - 66.0, - 50.0, - 66.0, - 50.0, - 66.0 - ], - "Chaos Elemental": [ - 250.0, - 305.0 - ], - "TzHaar-Hur": [ - 80.0, - 74.0 - ], - "Revenant ork": [ - 115.0, - 105.0 - ], - "Ahrim the Blighted": [ - 102.5, - 98.0 - ], - "Pit Scorpion": [ - 32.0, - 28.0 - ], - "Jungle horror": [ - 45.0, - 70.0 - ], - "Ice Troll King": [ - 161.0, - 122.0, - 287.0, - 213.0 - ], - "Dad": [ - 126.0, - 101.0, - 264.0, - 201.0 - ], - "Screaming banshee": [ - 610.0, - 70.0 - ], - "Jal-AkRek-Xil": [ - 15.0, - 70.0 - ], - "Bryophyta": [ - 115.0, - 128.0 - ], - "Cow": [ - 8.0, - 2.0, - -1.0, - 170.0 - ], - "Aberrant spectre": [ - 90.0, - 96.0 - ], - "Dagannoth spawn": [ - 35.0, - 42.0 - ], - "Fever spider": [ - 40.0, - 49.0 - ], - "Locust rider": [ - 92.5, - 98.0, - 92.5, - 106.0 - ], - "City guard": [ - 80.0, - 83.0 - ], - "Spitting Wyvern": [ - 205.0, - 139.0 - ], - "Skeletal Wyvern": [ - 210.0, - 140.0 - ], - "Shadow spider": [ - 55.0, - 52.0 - ], - "Giant spider": [ - 5.0, - 2.0, - 33.0, - 27.0, - 50.0, - 50.0 - ], - "Killerwatt": [ - 51.0, - 55.0 - ], - "Demonic gorilla": [ - 408.5, - 275.0 - ], - "Bear Cub": [ - 20.0, - 15.0 - ], - "Scarab mage": [ - 51.2, - -1.0 - ], - "Riyl Shadow": [ - 76.0, - 76.0 - ], - "Revenant dark beast": [ - 157.0, - 120.0 - ], - "Lizardman": [ - 60.0, - 53.0, - 60.0, - 62.0 - ], - "Penguin": [ - 4.0, - 2.0 - ], - "Scorpia's offspring": [ - 2.0, - 15.0 - ], - "Deadly red spider": [ - 35.0, - 34.0 - ], - "Loar Shadow": [ - 38.0, - 40.0 - ], - "Deviant spectre": [ - 194.5, - 169.0 - ], - "Entrana firebird": [ - 5.0, - 2.0 - ], - "Desert Lizard": [ - 15.0, - 12.0, - 25.0, - 24.0, - 40.0, - 42.0 - ], - "Riyl Shade": [ - 76.0, - 76.0 - ], - "Nechryael": [ - 105.0, - 115.0 - ], - "Big Wolf": [ - 74.0, - 73.0 - ], - "Grizzly bear": [ - 27.0, - -1.0 - ], - "King kurask": [ - 2767.0, - 295.0 - ], - "Vet'ion": [ - 312.0, - 454.0, - 322.0, - 454.0 - ], - "Hobgoblin": [ - 29.0, - 28.0, - 29.0, - 28.0, - 49.0, - 42.0, - -1.0, - 47.0 - ], - "Bouncer": [ - 116.0, - 137.0, - -1.0, - 244.0 - ], - "Troll spectator": [ - 90.0, - 71.0 - ], - "Zombie": [ - 22.0, - 13.0, - 24.0, - 18.0, - -1.0, - 23.0, - 30.0, - 24.0 - ], - "Wormbrain": [ - 5.0, - 2.0 - ], - "Jackal": [ - 27.0, - 21.0 - ], - "Cave bug": [ - 5.0, - 6.0, - 93.0, - 96.0 - ], - "Scorpia's guardian": [ - 70.0, - 47.0 - ], - "Choke devil": [ - 3000.0, - 264.0 - ], - "Mogre": [ - 48.0, - 60.0 - ], - "Mounted terrorbird gnome": [ - 36.0, - -1.0 - ], - "Ogress Shaman": [ - 82.0, - 82.0 - ], - "Loar Shade": [ - 38.0, - 40.0 - ], - "Dire Wolf": [ - 85.0, - 88.0 - ], - "Tok-Xil": [ - 40.0, - 90.0 - ], - "Elf warrior": [ - 107.5, - 108.0, - 105.0, - 90.0 - ], - "Ice troll runt": [ - 63.0, - 74.0 - ], - "Scorpia": [ - 260.0, - 225.0 - ], - "Abyssal demon": [ - 150.0, - 124.0, - 150.0, - 124.0 - ], - "Kalphite Soldier": [ - 90.0, - 85.0 - ], - "Icelord": [ - 60.0, - 51.0 - ], - "Jal-Xil": [ - 130.0, - 370.0 - ], - "Vorkath": [ - 750.0, - 732.0, - 460.0, - 392.0 - ], - "Chaos druid": [ - 20.0, - 13.0 - ], - "Jubbly bird": [ - 8.0, - 9.0 - ], - "Phrin Shade": [ - 56.0, - 60.0 - ], - "River troll": [ - 5.0, - 14.0, - -1.0, - 29.0, - -1.0, - 49.0, - -1.0, - 79.0, - 3.0, - 120.0, - -1.0, - 159.0 - ], - "Magic axe": [ - 44.0, - 42.0 - ], - "Guard Bandit": [ - 29.0, - 22.0 - ], - "Jungle Wolf": [ - 70.0, - 64.0 - ], - "Sea Snake Hatchling": [ - 50.0, - 62.0 - ], - "Balfrug Kreeyath": [ - 161.0, - 151.0 - ], - "Icefiend": [ - 15.0, - 13.0, - 20.0, - 18.0 - ], - "Sergeant Steelwill": [ - 127.0, - 142.0 - ], - "Desert Wolf": [ - 34.0, - 27.0 - ], - "Chaos Fanatic": [ - 253.0, - 202.0 - ], - "Cockatrice": [ - 37.0, - 37.0 - ], - "Verac the Defiled": [ - 112.5, - 115.0 - ], - "Brutal red dragon": [ - 306.2, - 289.0 - ], - "Wild dog": [ - 62.0, - 63.0 - ], - "Crocodile": [ - 62.0, - 63.0 - ], - "Werewolf": [ - -1.0, - 24.0, - 100.0, - 88.0, - -1.0, - 93.0 - ], - "Cerberus": [ - 690.0, - 318.0 - ], - "Giant Mole": [ - 215.0, - 230.0 - ], - "Flesh Crawler": [ - 25.0, - 28.0, - 25.0, - 35.0, - 25.0, - 41.0 - ], - "Greater abyssal demon": [ - 4200.0, - 342.0 - ], - "Pyrefiend": [ - 45.0, - 43.0 - ], - "Ankou": [ - 60.0, - 75.0, - 65.0, - 82.0, - 70.0, - 86.0, - 60.0, - 95.0, - 100.0, - 98.0 - ], - "Cave crawler": [ - 22.0, - 23.0 - ], - "Lizardman brute": [ - 60.0, - 73.0 - ], - "Jal-ImKot": [ - 81.0, - 240.0 - ], - "Treus Dayth": [ - 100.0, - 95.0, - 100.0, - 194.0 - ], - "Reanimated giant": [ - 35.0, - -1.0 - ], - "Reanimated troll": [ - 35.0, - -1.0 - ], - "Screaming twisted banshee": [ - 2200.0, - 144.0 - ], - "Black Guard": [ - 30.0, - 25.0, - 40.0, - 48.0 - ], - "Kurask": [ - 97.0, - 106.0 - ], - "Commander Zilyana": [ - 350.0, - 596.0 - ], - "Bat": [ - 8.0, - 6.0 - ], - "TzHaar-Xil": [ - 120.0, - 133.0 - ], - "Oomlie bird": [ - 90.0, - 46.0 - ], - "Catablepon": [ - 40.0, - 49.0, - 70.0, - 64.0, - 50.0, - 68.0 - ], - "Deranged archaeologist": [ - 200.0, - 276.0 - ], - "Shadow Hound": [ - 58.0, - 63.0 - ], - "Jelly": [ - 75.0, - 78.0 - ] -} diff --git a/runelite-client/src/main/resources/udp-openosrs.xml b/runelite-client/src/main/resources/udp-openosrs.xml index 5010d78591..f117e8b88f 100644 --- a/runelite-client/src/main/resources/udp-openosrs.xml +++ b/runelite-client/src/main/resources/udp-openosrs.xml @@ -7,7 +7,7 @@ + version="5.0.0"> unhiddenCasts = new HashSet(); @@ -246,6 +259,9 @@ public abstract class RSClientMixin implements RSClient @Inject private static ArrayList widgetItems = new ArrayList<>(); + @Inject + private static ArrayList hiddenWidgets = new ArrayList<>(); + @Inject @Override public void setPrintMenuActions(boolean yes) @@ -718,24 +734,6 @@ public abstract class RSClientMixin implements RSClient setChatCycle(getCycleCntr()); } - @Inject - @Override - public Widget getViewportWidget() - { - if (isResized()) - { - if (getVar(Varbits.SIDE_PANELS) == 1) - { - return getWidget(WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE); - } - else - { - return getWidget(WidgetInfo.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX); - } - } - return getWidget(WidgetInfo.FIXED_VIEWPORT); - } - @Inject @Override public MenuEntry[] getMenuEntries() @@ -1549,6 +1547,29 @@ public abstract class RSClientMixin implements RSClient widget.setRenderX(renderX); widget.setRenderY(renderY); + if (widget.getContentType() == WidgetType.VIEWPORT) + { + viewportColor = 0; + } + else if (widget.getType() == WidgetType.RECTANGLE) + { + if (renderX == client.getViewportXOffset() && renderY == client.getViewportYOffset() + && widget.getWidth() == client.getViewportWidth() && widget.getHeight() == client.getViewportHeight() + && widget.getOpacity() > 0 && widget.isFilled() && client.isGpu()) + { + int tc = widget.getTextColor(); + int alpha = widget.getOpacity() & 0xFF; + int inverseAlpha = 256 - alpha; + int vpc = viewportColor; + int c1 = (alpha * (tc & 0xff00ff) >> 8 & 0xFF00FF) + (alpha * (tc & 0x00FF00) >> 8 & 0x00FF00); + int c2 = (inverseAlpha * (vpc & 0xff00ff) >> 8 & 0xFF00FF) + (inverseAlpha * (vpc & 0x00FF00) >> 8 & 0x00FF00); + int outAlpha = alpha + ((vpc >>> 24) * (255 - alpha) * 0x8081 >>> 23); + viewportColor = outAlpha << 24 | c1 + c2; + widget.setHidden(true); + hiddenWidgets.add(widget); + continue; + } + } WidgetNode childNode = componentTable.get(widget.getId()); if (childNode != null) @@ -1565,10 +1586,6 @@ public abstract class RSClientMixin implements RSClient } } } - else - { - - } } } @@ -1649,6 +1666,15 @@ public abstract class RSClientMixin implements RSClient callbacks.drawInterface(group, widgetItems); widgetItems.clear(); + for (int i = hiddenWidgets.size() - 1; i >= 0; i--) + { + Widget widget = hiddenWidgets.get(i); + if (WidgetInfo.TO_GROUP(widget.getId()) == group) + { + widget.setHidden(false); + hiddenWidgets.remove(i); + } + } } } @@ -2037,14 +2063,118 @@ public abstract class RSClientMixin implements RSClient public void setOutdatedScript(String outdatedScript) { if (!outdatedScripts.contains(outdatedScript)) + { outdatedScripts.add(outdatedScript); + } } - + @Inject @Override public List getOutdatedScripts() { return this.outdatedScripts; } + + @Inject + @MethodHook(value = "changeWorld", end = true) + public static void postChangeWorld(RSWorld world) + { + client.getCallbacks().post(new WorldChanged()); + } + + @Inject + @Override + public void queueChangedVarp(int varp) + { + assert client.isClientThread() : "queueChangedVarp must be called on client thread"; + + int[] changedVarps = client.getChangedVarps(); + int changedVarpCount = client.getChangedVarpCount(); + changedVarps[changedVarpCount & 31] = varp; + client.setChangedVarpCount(changedVarpCount + 1); + } + + @Inject + @Override + public ScriptEvent createScriptEvent(Object... args) + { + return createRSScriptEvent(args); + } + + @Inject + @Override + public RSScriptEvent createRSScriptEvent(Object... args) + { + RSScriptEvent event = createScriptEvent(); + event.setArguments(args); + return event; + } + + @Inject + @Override + public NodeCache getStructCompositionCache() + { + assert client.isClientThread() : "getStructCompositionCache must be called on client thread"; + + return getRSStructCompositionCache(); + } + + @Inject + @Override + public StructComposition getStructComposition(int structID) + { + assert client.isClientThread() : "getStructComposition must be called on client thread"; + + return getRSStructComposition(structID); + } + + @Copy("StructDefinition_getStructDefinition") + @Replace("StructDefinition_getStructDefinition") + @SuppressWarnings("InfiniteRecursion") + static RSStructComposition copy$getStructComposition(int id) + { + RSStructComposition comp = copy$getStructComposition(id); + + if (comp.getId() == -1) + { + comp.setId(id); + PostStructComposition event = new PostStructComposition(); + event.setStructComposition(comp); + client.getCallbacks().post(event); + } + + return comp; + } + + @Inject + @Override + public int getMusicVolume() + { + return client.getPreferences().getMusicVolume(); + } + + @Inject + @Override + public void setMusicVolume(int volume) + { + if (volume > 0 && client.getPreferences().getMusicVolume() <= 0 && client.getCurrentTrackGroupId() != -1) + { + client.playMusicTrack(1000, client.getMusicTracks(), client.getCurrentTrackGroupId(), 0, volume, false); + } + + client.getPreferences().setMusicVolume(volume); + client.setMusicTrackVolume(volume); + if (client.getMidiPcmStream() != null) + { + client.getMidiPcmStream().setPcmStreamVolume(volume); + } + } + + @Inject + @MethodHook("closeInterface") + public static void preCloseInterface(RSInterfaceParent iface, boolean willUnload) + { + client.getCallbacks().post(new WidgetClosed(iface.getId(), iface.getModalMode(), willUnload)); + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientPreferencesMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientPreferencesMixin.java deleted file mode 100644 index bada618176..0000000000 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientPreferencesMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.runelite.mixins; - -import net.runelite.api.mixins.Inject; -import net.runelite.api.mixins.Mixin; -import net.runelite.api.mixins.Shadow; -import net.runelite.rs.api.RSClient; -import net.runelite.rs.api.RSClientPreferences; - -@Mixin(RSClientPreferences.class) -public abstract class RSClientPreferencesMixin implements RSClientPreferences -{ - @Shadow("client") - private static RSClient client; - - @Inject - @Override - public void setClientMusicVolume(int volume) - { - if (volume > 0 && client.getPreferences().getMusicVolume() <= 0 && client.getCurrentTrackGroupId() != -1) - { - client.playMusicTrack(1000, client.getMusicTracks(), client.getCurrentTrackGroupId(), 0, volume, false); - } - - client.getPreferences().setMusicVolume(volume); - client.setMusicTrackVolume(volume); - if (client.getMidiPcmStream() != null) - { - client.getMidiPcmStream().setPcmStreamVolume(volume); - } - } -} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java index 06e7325fae..3d0e13f268 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSFriendSystemMixin.java @@ -19,7 +19,7 @@ public abstract class RSFriendSystemMixin implements RSFriendSystem @Inject public void rl$removeFriend(String friendName) { - RemovedFriend removedFriend = new RemovedFriend(friendName); + RemovedFriend removedFriend = new RemovedFriend(client.getFriendManager().getFriendContainer().findByName(friendName)); client.getCallbacks().post(removedFriend); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java index 93f389345a..221063ce75 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java @@ -27,6 +27,7 @@ package net.runelite.mixins; import net.runelite.api.events.FocusChanged; import net.runelite.api.hooks.DrawCallbacks; import java.awt.event.FocusEvent; +import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; @@ -42,6 +43,9 @@ public abstract class RSGameShellMixin implements RSGameShell @Shadow("client") private static RSClient client; + @Shadow("viewportColor") + private static int viewportColor; + @Inject private Thread thread; @@ -83,7 +87,7 @@ public abstract class RSGameShellMixin implements RSGameShell DrawCallbacks drawCallbacks = client.getDrawCallbacks(); if (drawCallbacks != null) { - drawCallbacks.draw(); + drawCallbacks.draw(viewportColor); } } @@ -105,4 +109,18 @@ public abstract class RSGameShellMixin implements RSGameShell //Always allow host. return true; } + + @Copy("replaceCanvas") + @Replace("replaceCanvas") + @SuppressWarnings("InfiniteRecursion") + public void copy$replaceCanvas() + { + if (client != null && client.isGpu()) + { + setFullRedraw(false); + return; + } + + copy$replaceCanvas(); + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java index 143b4dbcbd..36a55fcdd4 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSModelDataMixin.java @@ -92,7 +92,6 @@ public abstract class RSModelDataMixin implements RSModelData final short[] texTriangleZ = getTexTriangleZ(); final byte[] textureCoords = getTextureCoords(); - final byte[] textureRenderTypes = getTextureRenderTypes(); int faceCount = getTriangleFaceCount(); this.faceTextureUCoordinates = new float[faceCount][]; @@ -100,15 +99,10 @@ public abstract class RSModelDataMixin implements RSModelData for (int i = 0; i < faceCount; i++) { - int textureCoordinate; - if (textureCoords == null) - { - textureCoordinate = -1; - } - else - { - textureCoordinate = textureCoords[i]; - } + int trianglePointX = trianglePointsX[i]; + int trianglePointY = trianglePointsY[i]; + int trianglePointZ = trianglePointsZ[i]; + int textureCoordinate = textureCoords != null && textureCoords[i] != -1 ? textureCoords[i] & 255 : -1; short textureIdx; textureIdx = faceTextures[i]; @@ -118,83 +112,67 @@ public abstract class RSModelDataMixin implements RSModelData float[] u = new float[3]; float[] v = new float[3]; + int triangleVertexIdx1; + int triangleVertexIdx2; + int triangleVertexIdx3; + if (textureCoordinate == -1) { - u[0] = 0.0F; - v[0] = 1.0F; - - u[1] = 1.0F; - v[1] = 1.0F; - - u[2] = 0.0F; - v[2] = 0.0F; + triangleVertexIdx1 = trianglePointX; + triangleVertexIdx2 = trianglePointY; + triangleVertexIdx3 = trianglePointZ; } else { - textureCoordinate &= 0xFF; - - byte textureRenderType = 0; - if (textureRenderTypes != null) - { - textureRenderType = textureRenderTypes[textureCoordinate]; - } - - if (textureRenderType == 0) - { - int faceVertexIdx1 = trianglePointsX[i]; - int faceVertexIdx2 = trianglePointsY[i]; - int faceVertexIdx3 = trianglePointsZ[i]; - - int triangleVertexIdx1 = texTriangleX[textureCoordinate]; - int triangleVertexIdx2 = texTriangleY[textureCoordinate]; - int triangleVertexIdx3 = texTriangleZ[textureCoordinate]; - - float triangleX = (float) vertexPositionsX[triangleVertexIdx1]; - float triangleY = (float) vertexPositionsY[triangleVertexIdx1]; - float triangleZ = (float) vertexPositionsZ[triangleVertexIdx1]; - - float f_882_ = (float) vertexPositionsX[triangleVertexIdx2] - triangleX; - float f_883_ = (float) vertexPositionsY[triangleVertexIdx2] - triangleY; - float f_884_ = (float) vertexPositionsZ[triangleVertexIdx2] - triangleZ; - float f_885_ = (float) vertexPositionsX[triangleVertexIdx3] - triangleX; - float f_886_ = (float) vertexPositionsY[triangleVertexIdx3] - triangleY; - float f_887_ = (float) vertexPositionsZ[triangleVertexIdx3] - triangleZ; - float f_888_ = (float) vertexPositionsX[faceVertexIdx1] - triangleX; - float f_889_ = (float) vertexPositionsY[faceVertexIdx1] - triangleY; - float f_890_ = (float) vertexPositionsZ[faceVertexIdx1] - triangleZ; - float f_891_ = (float) vertexPositionsX[faceVertexIdx2] - triangleX; - float f_892_ = (float) vertexPositionsY[faceVertexIdx2] - triangleY; - float f_893_ = (float) vertexPositionsZ[faceVertexIdx2] - triangleZ; - float f_894_ = (float) vertexPositionsX[faceVertexIdx3] - triangleX; - float f_895_ = (float) vertexPositionsY[faceVertexIdx3] - triangleY; - float f_896_ = (float) vertexPositionsZ[faceVertexIdx3] - triangleZ; - - float f_897_ = f_883_ * f_887_ - f_884_ * f_886_; - float f_898_ = f_884_ * f_885_ - f_882_ * f_887_; - float f_899_ = f_882_ * f_886_ - f_883_ * f_885_; - float f_900_ = f_886_ * f_899_ - f_887_ * f_898_; - float f_901_ = f_887_ * f_897_ - f_885_ * f_899_; - float f_902_ = f_885_ * f_898_ - f_886_ * f_897_; - float f_903_ = 1.0F / (f_900_ * f_882_ + f_901_ * f_883_ + f_902_ * f_884_); - - u[0] = (f_900_ * f_888_ + f_901_ * f_889_ + f_902_ * f_890_) * f_903_; - u[1] = (f_900_ * f_891_ + f_901_ * f_892_ + f_902_ * f_893_) * f_903_; - u[2] = (f_900_ * f_894_ + f_901_ * f_895_ + f_902_ * f_896_) * f_903_; - - f_900_ = f_883_ * f_899_ - f_884_ * f_898_; - f_901_ = f_884_ * f_897_ - f_882_ * f_899_; - f_902_ = f_882_ * f_898_ - f_883_ * f_897_; - f_903_ = 1.0F / (f_900_ * f_885_ + f_901_ * f_886_ + f_902_ * f_887_); - - v[0] = (f_900_ * f_888_ + f_901_ * f_889_ + f_902_ * f_890_) * f_903_; - v[1] = (f_900_ * f_891_ + f_901_ * f_892_ + f_902_ * f_893_) * f_903_; - v[2] = (f_900_ * f_894_ + f_901_ * f_895_ + f_902_ * f_896_) * f_903_; - } + triangleVertexIdx1 = texTriangleX[textureCoordinate]; + triangleVertexIdx2 = texTriangleY[textureCoordinate]; + triangleVertexIdx3 = texTriangleZ[textureCoordinate]; } + float triangleX = (float) vertexPositionsX[triangleVertexIdx1]; + float triangleY = (float) vertexPositionsY[triangleVertexIdx1]; + float triangleZ = (float) vertexPositionsZ[triangleVertexIdx1]; + + float f_882_ = (float) vertexPositionsX[triangleVertexIdx2] - triangleX; + float f_883_ = (float) vertexPositionsY[triangleVertexIdx2] - triangleY; + float f_884_ = (float) vertexPositionsZ[triangleVertexIdx2] - triangleZ; + float f_885_ = (float) vertexPositionsX[triangleVertexIdx3] - triangleX; + float f_886_ = (float) vertexPositionsY[triangleVertexIdx3] - triangleY; + float f_887_ = (float) vertexPositionsZ[triangleVertexIdx3] - triangleZ; + float f_888_ = (float) vertexPositionsX[trianglePointX] - triangleX; + float f_889_ = (float) vertexPositionsY[trianglePointX] - triangleY; + float f_890_ = (float) vertexPositionsZ[trianglePointX] - triangleZ; + float f_891_ = (float) vertexPositionsX[trianglePointY] - triangleX; + float f_892_ = (float) vertexPositionsY[trianglePointY] - triangleY; + float f_893_ = (float) vertexPositionsZ[trianglePointY] - triangleZ; + float f_894_ = (float) vertexPositionsX[trianglePointZ] - triangleX; + float f_895_ = (float) vertexPositionsY[trianglePointZ] - triangleY; + float f_896_ = (float) vertexPositionsZ[trianglePointZ] - triangleZ; + + float f_897_ = f_883_ * f_887_ - f_884_ * f_886_; + float f_898_ = f_884_ * f_885_ - f_882_ * f_887_; + float f_899_ = f_882_ * f_886_ - f_883_ * f_885_; + float f_900_ = f_886_ * f_899_ - f_887_ * f_898_; + float f_901_ = f_887_ * f_897_ - f_885_ * f_899_; + float f_902_ = f_885_ * f_898_ - f_886_ * f_897_; + float f_903_ = 1.0F / (f_900_ * f_882_ + f_901_ * f_883_ + f_902_ * f_884_); + + u[0] = (f_900_ * f_888_ + f_901_ * f_889_ + f_902_ * f_890_) * f_903_; + u[1] = (f_900_ * f_891_ + f_901_ * f_892_ + f_902_ * f_893_) * f_903_; + u[2] = (f_900_ * f_894_ + f_901_ * f_895_ + f_902_ * f_896_) * f_903_; + + f_900_ = f_883_ * f_899_ - f_884_ * f_898_; + f_901_ = f_884_ * f_897_ - f_882_ * f_899_; + f_902_ = f_882_ * f_898_ - f_883_ * f_897_; + f_903_ = 1.0F / (f_900_ * f_885_ + f_901_ * f_886_ + f_902_ * f_887_); + + v[0] = (f_900_ * f_888_ + f_901_ * f_889_ + f_902_ * f_890_) * f_903_; + v[1] = (f_900_ * f_891_ + f_901_ * f_892_ + f_902_ * f_893_) * f_903_; + v[2] = (f_900_ * f_894_ + f_901_ * f_895_ + f_902_ * f_896_) * f_903_; + this.faceTextureUCoordinates[i] = u; this.faceTextureVCoordinates[i] = v; } } } -} +} \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSParamCompositionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSParamCompositionMixin.java new file mode 100644 index 0000000000..d5d3a90f60 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSParamCompositionMixin.java @@ -0,0 +1,16 @@ +package net.runelite.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSParamComposition; + +@Mixin(RSParamComposition.class) +public abstract class RSParamCompositionMixin implements RSParamComposition +{ + @Inject + @Override + public boolean isString() + { + return getType() == 's'; + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java index bcabacb785..2200710ada 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java @@ -288,18 +288,10 @@ public abstract class RSPlayerMixin implements RSPlayer friended = client.getFriendManager().isFriended(getRsName(), false); } - @Copy("read") - @Replace("read") - @SuppressWarnings("InfiniteRecursion") - public void copy$read(RSBuffer buffer) + @Inject + @MethodHook(value = "read", end = true) + void postRead(RSBuffer var1) { - final long appearanceHash = getPlayerComposition() == null ? 0 : getPlayerComposition().getHash(); - - this.copy$read(buffer); - - if (client.isComparingAppearance() && getPlayerComposition().getHash() != appearanceHash) - { - client.getCallbacks().post(new PlayerChanged(this)); - } + client.getCallbacks().post(new PlayerChanged(this)); } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java index eb8e61faea..7f8c5d53ad 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -313,13 +313,19 @@ public abstract class RSSceneMixin implements RSScene client.setViewportWalking(false); } client.getCallbacks().drawScene(); + + if (client.getDrawCallbacks() != null) + { + client.getDrawCallbacks().postDrawScene(); + } + return; } } } } } - + outer: for (int z = minLevel; z < maxY; ++z) { RSTile[][] planeTiles = tiles[z]; @@ -378,17 +384,8 @@ public abstract class RSSceneMixin implements RSScene if (client.getTileUpdateCount() == 0) { - if (!isGpu && (client.getOculusOrbState() != 0 && !client.getComplianceValue("orbInteraction"))) - { - client.setEntitiesAtMouseCount(0); - } - client.setCheckClick(false); - if (!checkClick) - { - client.setViewportWalking(false); - } - client.getCallbacks().drawScene(); - return; + // exit the loop early and go straight to "if (!isGpu && (client..." + break outer; } } } @@ -407,6 +404,10 @@ public abstract class RSSceneMixin implements RSScene client.setViewportWalking(false); } client.getCallbacks().drawScene(); + if (client.getDrawCallbacks() != null) + { + client.getDrawCallbacks().postDrawScene(); + } } @Copy("newWallDecoration") @@ -799,9 +800,9 @@ public abstract class RSSceneMixin implements RSScene @MethodHook(value = "addTile", end = true) @Inject public void rl$addTile(int z, int x, int y, int shape, int rotation, int texture, int heightSw, int heightNw, - int heightNe, int heightSe, int underlaySwColor, int underlayNwColor, int underlayNeColor, - int underlaySeColor, int overlaySwColor, int overlayNwColor, int overlayNeColor, - int overlaySeColor, int underlayRgb, int overlayRgb) + int heightNe, int heightSe, int underlaySwColor, int underlayNwColor, int underlayNeColor, + int underlaySeColor, int overlaySwColor, int overlayNwColor, int overlayNeColor, + int overlaySeColor, int underlayRgb, int overlayRgb) { if (shape != 0 && shape != 1) { @@ -938,28 +939,28 @@ public abstract class RSSceneMixin implements RSScene { int lig = 0xFF - ((seLightness >> 1) * (seLightness >> 1) >> 8); pixels[pixelOffset] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) + - ((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8; + ((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8; } if (points[indices[shapeOffset++]] != 0) { int lig = 0xFF - ((seLightness * 3 + neLightness >> 3) * - (seLightness * 3 + neLightness >> 3) >> 8); + (seLightness * 3 + neLightness >> 3) >> 8); pixels[pixelOffset + 1] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) + - ((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8; + ((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8; } if (points[indices[shapeOffset++]] != 0) { int lig = 0xFF - ((seLightness + neLightness >> 2) * - (seLightness + neLightness >> 2) >> 8); + (seLightness + neLightness >> 2) >> 8); pixels[pixelOffset + 2] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) + - ((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8; + ((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8; } if (points[indices[shapeOffset++]] != 0) { int lig = 0xFF - ((seLightness + neLightness * 3 >> 3) * - (seLightness + neLightness * 3 >> 3) >> 8); + (seLightness + neLightness * 3 >> 3) >> 8); pixels[pixelOffset + 3] = ((overlayRgb & 0xFF00FF) * lig & ~0xFF00FF) + - ((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8; + ((overlayRgb & 0xFF00) * lig & 0xFF0000) >> 8; } } seLightness += southDeltaLightness; @@ -1009,11 +1010,11 @@ public abstract class RSSceneMixin implements RSScene { pixels[pixelOffset] = points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; pixels[pixelOffset + 1] = - points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; + points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; pixels[pixelOffset + 2] = - points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; + points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; pixels[pixelOffset + 3] = - points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; + points[indices[shapeOffset++]] != 0 ? overlayRgb : underlayRgb; pixelOffset += width; } } @@ -1042,4 +1043,4 @@ public abstract class RSSceneMixin implements RSScene } } } -} +} \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSScriptEventMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSScriptEventMixin.java new file mode 100644 index 0000000000..33a30fa81a --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSScriptEventMixin.java @@ -0,0 +1,21 @@ +package net.runelite.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSScriptEvent; + +@Mixin(RSScriptEvent.class) +public abstract class RSScriptEventMixin implements RSScriptEvent +{ + @Shadow("client") + private static RSClient client; + + @Inject + @Override + public void run() + { + client.runScriptEvent(this); + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSStructCompositionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSStructCompositionMixin.java new file mode 100644 index 0000000000..63a0690439 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSStructCompositionMixin.java @@ -0,0 +1,26 @@ +package net.runelite.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSStructComposition; + +@Mixin(RSStructComposition.class) +public abstract class RSStructCompositionMixin implements RSStructComposition +{ + @Inject + private int id = -1; + + @Inject + @Override + public int getId() + { + return id; + } + + @Inject + @Override + public void setId(int id) + { + this.id = id; + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java index dbcd39e347..c940376ba4 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java @@ -28,7 +28,6 @@ import net.runelite.api.HashTable; import net.runelite.api.Node; import net.runelite.api.Point; import net.runelite.api.WidgetNode; -import net.runelite.api.events.WidgetHiddenChanged; import net.runelite.api.events.WidgetPositioned; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.FieldHook; @@ -410,78 +409,6 @@ public abstract class RSWidgetMixin implements RSWidget return bounds != null && bounds.contains(new java.awt.Point(point.getX(), point.getY())); } - @Inject - @Override - public void broadcastHidden(boolean hidden) - { - WidgetHiddenChanged event = new WidgetHiddenChanged(); - event.setWidget(this); - event.setHidden(hidden); - - client.getCallbacks().post(event); - - RSWidget[] children = getChildren(); - - if (children != null) - { - // recursive through children - for (RSWidget child : children) - { - // if the widget is hidden it will not magically unhide from its parent changing - if (child == null || child.isSelfHidden()) - { - continue; - } - - child.broadcastHidden(hidden); - } - } - - // make sure we iterate nested children as well - // cannot be null - Widget[] nestedChildren = getNestedChildren(); - - for (Widget nestedChild : nestedChildren) - { - if (nestedChild == null || nestedChild.isSelfHidden()) - { - continue; - } - - ((RSWidget) nestedChild).broadcastHidden(hidden); - } - } - - @FieldHook("isHidden") - @Inject - public void onHiddenChanged(int idx) - { - int id = getId(); - - if (id == -1) - { - return; - } - - Widget parent = getParent(); - - // if the parent is hidden then changes in this widget don't have any visual effect - // so ignore them - if (parent != null) - { - if (parent.isHidden()) - { - return; - } - } - else if (TO_GROUP(id) != client.getWidgetRoot()) - { - return; - } - - broadcastHidden(isSelfHidden()); - } - @FieldHook("y") @Inject public void onPositionChanged(int idx) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java index 6f8af59204..c6c50846f6 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java @@ -27,7 +27,7 @@ package net.runelite.mixins; import java.util.regex.Matcher; import java.util.regex.Pattern; -import net.runelite.api.Client; +import static net.runelite.api.Opcodes.*; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.ScriptPostFired; import net.runelite.api.events.ScriptPreFired; @@ -40,13 +40,12 @@ import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSScript; import net.runelite.rs.api.RSScriptEvent; -import static net.runelite.api.Opcodes.*; @Mixin(RSClient.class) public abstract class ScriptVMMixin implements RSClient { @Shadow("client") - private static Client client; + private static RSClient client; @Inject private static RSScript currentScript; @@ -172,11 +171,44 @@ public abstract class ScriptVMMixin implements RSClient @Override public void runScript(Object... args) { - assert isClientThread(); - assert currentScript == null; - assert args[0] instanceof Integer || args[0] instanceof JavaScriptCallback : "The first argument should always be a ScriptID!"; - RSScriptEvent se = createScriptEvent(); - se.setArguments(args); - runScript(se, 5000000); + runScriptEvent(createRSScriptEvent(args)); + } + + @Inject + @Override + public void runScriptEvent(RSScriptEvent event) + { + assert isClientThread() : "runScriptEvent must be called on client thread"; + assert currentScript == null : "scripts are not reentrant"; + runScript(event, 5000000); + boolean assertionsEnabled = false; + assert assertionsEnabled = true; + + Object[] args = event.getArguments(); + if (assertionsEnabled && args[0] instanceof Integer) + { + int scriptId = (int) args[0]; + RSScript script = (RSScript) client.getScriptCache().get(scriptId); + + if (script != null) + { + int intCount = 0, stringCount = 0; + for (int i = 1; i < args.length; i++) + { + if (args[i] instanceof Integer) + { + intCount++; + } + else + { + stringCount++; + } + } + + assert script.getIntArgumentCount() == intCount && script.getStringArgumentCount() == stringCount : + "Script " + scriptId + " was called with the incorrect number of arguments; takes " + + script.getIntArgumentCount() + "+" + script.getStringArgumentCount() + ", got " + intCount + "+" + stringCount; + } + } } } \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java index accd766fc6..26fc556f90 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java @@ -2,6 +2,7 @@ package net.runelite.mixins; import net.runelite.api.VarClientInt; import net.runelite.api.VarClientStr; +import net.runelite.api.VarbitComposition; import net.runelite.api.Varbits; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -55,30 +56,21 @@ public abstract class VarbitMixin implements RSClient @Inject @Override - public RSVarbitComposition getVarbitDefinition(int id) + public RSVarbitComposition getVarbitComposition(int id) { - assert isClientThread(); + assert client.isClientThread() : "getVarbitDefinition must be called on client thread"; - RSVarbitComposition varbit; - varbit = varbitCache.getIfPresent(id); - if (varbit != null) + RSVarbitComposition varbit = varbitCache.getIfPresent(id); + + if (varbit == null) { - return varbit; - } - varbit = (RSVarbitComposition) getVarbitCache().get(id); - if (varbit != null && !(varbit.getIndex() == 0 && varbit.getMostSignificantBit() == 0 && varbit.getLeastSignificantBit() == 0)) - { - return varbit; + client.getLogger().trace("Cache miss for varbit {}", id); + client.rs$getVarbit(id); // preload varbit + varbit = (RSVarbitComposition) getVarbitCache().get(id); + varbitCache.put(id, varbit); } - byte[] fileData = getIndexConfig().getConfigData(VARBITS_GROUP, id); - if (fileData == null) - { - return null; - } - varbit = newVarbitDefinition(); - varbit.decode(newBuffer(fileData)); - return varbit; + return varbit.getIndex() == 0 && varbit.getLeastSignificantBit() == 0 && varbit.getMostSignificantBit() == 0 ? null : varbit; } @Inject @@ -87,10 +79,10 @@ public abstract class VarbitMixin implements RSClient { assert client.isClientThread(); - RSVarbitComposition v = getVarbitDefinition(varbitId); + RSVarbitComposition v = getVarbitComposition(varbitId); if (v == null) { - throw new IndexOutOfBoundsException(String.format("Varbit %d does not exist!", varbitId)); // oob for "backwards compatibility lol" + throw new IndexOutOfBoundsException("Varbit " + varbitId + " does not exist!"); // oob for "backwards compatibility lol" } int value = varps[v.getIndex()]; @@ -104,7 +96,7 @@ public abstract class VarbitMixin implements RSClient @Override public void setVarbitValue(int[] varps, int varbitId, int value) { - RSVarbitComposition v = getVarbitDefinition(varbitId); + RSVarbitComposition v = getVarbitComposition(varbitId); if (v == null) { throw new IndexOutOfBoundsException(String.format("Varbit %d does not exist!", varbitId)); // oob for "backwards compatibility lol" @@ -170,4 +162,11 @@ public abstract class VarbitMixin implements RSClient { return getVarcs().getVarcMap(); } + + @Inject + @Override + public VarbitComposition getVarbit(int id) + { + return getVarbitComposition(id); + } } 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 e798354db7..90d9cb0779 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 @@ -686,7 +686,7 @@ public interface RSClient extends RSGameShell, Client RSUsername createName(String name, RSLoginType type); @Import("getVarbit") - int getVarbit(int varbitId); + int rs$getVarbit(int varbitId); @Import("VarbitDefinition_cached") RSEvictingDualNodeHashTable getVarbitCache(); @@ -1308,4 +1308,46 @@ public interface RSClient extends RSGameShell, Client @Import("pcmSampleLength") void setPcmSampleLength(int var0); + + @Import("changedVarps") + int[] getChangedVarps(); + + @Import("changedVarpCount") + int getChangedVarpCount(); + + @Import("changedVarpCount") + void setChangedVarpCount(int changedVarpCount); + + @Import("scriptActiveWidget") + RSWidget getScriptActiveWidget(); + + @Import("scriptDotWidget") + RSWidget getScriptDotWidget(); + + RSScriptEvent createRSScriptEvent(Object... args); + + void runScriptEvent(RSScriptEvent event); + + @Import("Script_cached") + RSEvictingDualNodeHashTable getScriptCache(); + + @Import("StructDefinition_cached") + RSEvictingDualNodeHashTable getRSStructCompositionCache(); + + @Import("StructDefinition_getStructDefinition") + RSStructComposition getRSStructComposition(int id); + + @Import("getParamDefinition") + RSParamComposition getRSParamComposition(int id); + + @Construct + RSIntegerNode newIntegerNode(int contents); + + @Construct + RSObjectNode newObjectNode(Object contents); + + @Construct + RSIterableNodeHashTable newIterableNodeHashTable(int size); + + RSVarbitComposition getVarbitComposition(int id); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java index edb36c8e72..9eaecdee24 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java @@ -30,7 +30,6 @@ public interface RSClientPreferences extends Preferences void setAreaSoundEffectVolume(int i); @Import("musicVolume") - @Override int getMusicVolume(); @Import("musicVolume") diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSGameShell.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGameShell.java index 969e4f4cb3..fe27edcd9a 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSGameShell.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGameShell.java @@ -57,4 +57,7 @@ public interface RSGameShell extends GameShell @Import("maxCanvasHeight") void setMaxCanvasHeight(int height); + + @Import("fullRedraw") + void setFullRedraw(boolean fullRedraw); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSInterfaceParent.java b/runescape-api/src/main/java/net/runelite/rs/api/RSInterfaceParent.java index f89d359baf..76d7909db2 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSInterfaceParent.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSInterfaceParent.java @@ -8,4 +8,8 @@ public interface RSInterfaceParent extends RSNode, WidgetNode @Import("group") @Override int getId(); + + @Import("type") + @Override + int getModalMode(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSItemComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSItemComposition.java index 4575fc6299..90c8b3bc89 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSItemComposition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSItemComposition.java @@ -84,4 +84,10 @@ public interface RSItemComposition extends ItemComposition @Import("retextureTo") short[] getTextureToReplaceWith(); + + @Import("params") + RSIterableNodeHashTable getParams(); + + @Import("params") + void setParams(RSIterableNodeHashTable params); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java index 3d8c5efab0..352dfebf03 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java @@ -1,6 +1,7 @@ package net.runelite.rs.api; import net.runelite.api.IterableHashTable; +import net.runelite.api.Node; import net.runelite.mapping.Import; public interface RSIterableNodeHashTable extends IterableHashTable @@ -8,4 +9,8 @@ public interface RSIterableNodeHashTable extends IterableHashTable @Import("get") @Override RSNode get(long hash); + + @Import("put") + @Override + void put(Node node, long hash); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSNPCComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNPCComposition.java index 41e9a15942..adeb25cab7 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSNPCComposition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNPCComposition.java @@ -59,4 +59,10 @@ public interface RSNPCComposition extends NPCComposition @Import("headIconPrayer") int getRsOverheadIcon(); + + @Import("params") + RSIterableNodeHashTable getParams(); + + @Import("params") + void setParams(RSIterableNodeHashTable params); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java index 254af94bc4..5b9dd8ae19 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java @@ -32,4 +32,10 @@ public interface RSObjectComposition extends ObjectComposition @Import("transform") @Override RSObjectComposition getImpostor(); + + @Import("params") + RSIterableNodeHashTable getParams(); + + @Import("params") + void setParams(RSIterableNodeHashTable params); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectNode.java b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectNode.java index feba04d142..4883bc0db9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectNode.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectNode.java @@ -1,3 +1,9 @@ package net.runelite.rs.api; -public interface RSObjectNode {} +import net.runelite.mapping.Import; + +public interface RSObjectNode extends RSNode +{ + @Import("obj") + Object getValue(); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSParamComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSParamComposition.java new file mode 100644 index 0000000000..bb340d575f --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSParamComposition.java @@ -0,0 +1,17 @@ +package net.runelite.rs.api; + +import net.runelite.mapping.Import; + +public interface RSParamComposition +{ + boolean isString(); + + @Import("type") + char getType(); + + @Import("defaultInt") + int getDefaultInt(); + + @Import("defaultStr") + String getDefaultStr(); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSParamDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSParamDefinition.java deleted file mode 100644 index e01e7f14e3..0000000000 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSParamDefinition.java +++ /dev/null @@ -1,3 +0,0 @@ -package net.runelite.rs.api; - -public interface RSParamDefinition {} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java index 7a1c730f5a..7a7551a5b9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java @@ -12,4 +12,10 @@ public interface RSScript extends Script, RSDualNode @Import("opcodes") @Override int[] getInstructions(); + + @Import("intArgumentCount") + int getIntArgumentCount(); + + @Import("stringArgumentCount") + int getStringArgumentCount(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java index 63d9b5f23a..7c2dfc8e00 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java @@ -43,6 +43,9 @@ public interface RSScriptEvent extends ScriptEvent @Import("widget") Widget getSource(); + @Import("widget") + RSScriptEvent setSource(Widget widget); + @Import("opIndex") int getOp(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSStructComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSStructComposition.java new file mode 100644 index 0000000000..4016e536f6 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSStructComposition.java @@ -0,0 +1,16 @@ +package net.runelite.rs.api; + +import net.runelite.api.StructComposition; +import net.runelite.mapping.Import; + +public interface RSStructComposition extends StructComposition +{ + int getId(); + void setId(int id); + + @Import("params") + RSIterableNodeHashTable getParams(); + + @Import("params") + void setParams(RSIterableNodeHashTable params); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSStructDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSStructDefinition.java deleted file mode 100644 index 157caf32f4..0000000000 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSStructDefinition.java +++ /dev/null @@ -1,3 +0,0 @@ -package net.runelite.rs.api; - -public interface RSStructDefinition {} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java index 7f08e6cdbd..ace10f8461 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java @@ -345,8 +345,6 @@ public interface RSWidget extends Widget @Import("paddingY") int getYPitch(); - void broadcastHidden(boolean hidden); - @Import("onOp") @Override void setOnOpListener(Object... args); @@ -570,4 +568,24 @@ public interface RSWidget extends Widget @Import("onClick") @Override void setOnClickListener(Object[] o); + + @Import("onDragComplete") + @Override + void setOnDragCompleteListener(Object[] o); + + @Import("onDrag") + @Override + void setOnDragListener(Object[] o); + + @Import("parent") + @Override + RSWidget getDragParent(); + + @Import("parent") + @Override + void setDragParent(Widget dragParent); + + @Import("onVarTransmit") + @Override + void setOnVarTransmitListener(Object[] o); } \ No newline at end of file diff --git a/runescape-client/src/main/java/AbstractWorldMapIcon.java b/runescape-client/src/main/java/AbstractWorldMapIcon.java index d8a8054a5d..c3ab085c59 100644 --- a/runescape-client/src/main/java/AbstractWorldMapIcon.java +++ b/runescape-client/src/main/java/AbstractWorldMapIcon.java @@ -178,19 +178,19 @@ public abstract class AbstractWorldMapIcon { garbageValue = "5" ) @Export("StructDefinition_getStructDefinition") - public static StructDefinition StructDefinition_getStructDefinition(int var0) { - StructDefinition var1 = (StructDefinition)StructDefinition.StructDefinition_cached.get((long)var0); // L: 23 + public static StructComposition StructDefinition_getStructDefinition(int var0) { + StructComposition var1 = (StructComposition) StructComposition.StructDefinition_cached.get((long)var0); // L: 23 if (var1 != null) { // L: 24 return var1; } else { - byte[] var2 = StructDefinition.StructDefinition_archive.takeFile(34, var0); // L: 25 - var1 = new StructDefinition(); // L: 26 + byte[] var2 = StructComposition.StructDefinition_archive.takeFile(34, var0); // L: 25 + var1 = new StructComposition(); // L: 26 if (var2 != null) { // L: 27 var1.decode(new Buffer(var2)); } var1.postDecode(); // L: 28 - StructDefinition.StructDefinition_cached.put(var1, (long)var0); // L: 29 + StructComposition.StructDefinition_cached.put(var1, (long)var0); // L: 29 return var1; // L: 30 } } diff --git a/runescape-client/src/main/java/Canvas.java b/runescape-client/src/main/java/Canvas.java index 6598a0ec55..5d60bc2c12 100644 --- a/runescape-client/src/main/java/Canvas.java +++ b/runescape-client/src/main/java/Canvas.java @@ -274,7 +274,7 @@ public final class Canvas extends java.awt.Canvas { ObjectComposition.ObjectDefinition_modelsArchive = var4; // L: 1917 ObjectComposition.ObjectDefinition_isLowDetail = var17; // L: 1918 World.method1849(DynamicObject.archive2, BuddyRankComparator.archive7); // L: 1920 - ParamDefinition.method4526(DynamicObject.archive2); // L: 1921 + ParamComposition.method4526(DynamicObject.archive2); // L: 1921 Actor.method1821(DynamicObject.archive2, BuddyRankComparator.archive7, Client.isMembersWorld, class297.fontPlain11); // L: 1922 PcmPlayer.method2538(DynamicObject.archive2, SceneTilePaint.archive0, WorldMapSprite.archive1); // L: 1923 ModelData0.method3331(DynamicObject.archive2, BuddyRankComparator.archive7); // L: 1924 @@ -294,7 +294,7 @@ public final class Canvas extends java.awt.Canvas { class195.Widget_loadedInterfaces = new boolean[class58.Widget_archive.getGroupCount()]; // L: 1941 Archive var11 = DynamicObject.archive2; // L: 1943 InvDefinition.InvDefinition_archive = var11; // L: 1945 - StructDefinition.method4545(DynamicObject.archive2); // L: 1947 + StructComposition.method4545(DynamicObject.archive2); // L: 1947 ModelData0.method3330(DynamicObject.archive2); // L: 1948 class13.method129(DynamicObject.archive2); // L: 1949 Varcs.varcs = new Varcs(); // L: 1950 diff --git a/runescape-client/src/main/java/ChatChannel.java b/runescape-client/src/main/java/ChatChannel.java index 08574b23de..6120a77d72 100644 --- a/runescape-client/src/main/java/ChatChannel.java +++ b/runescape-client/src/main/java/ChatChannel.java @@ -109,19 +109,19 @@ public class ChatChannel { garbageValue = "1207819240" ) @Export("getParamDefinition") - public static ParamDefinition getParamDefinition(int var0) { - ParamDefinition var1 = (ParamDefinition)ParamDefinition.ParamDefinition_cached.get((long)var0); // L: 25 + public static ParamComposition getParamDefinition(int var0) { + ParamComposition var1 = (ParamComposition) ParamComposition.ParamDefinition_cached.get((long)var0); // L: 25 if (var1 != null) { // L: 26 return var1; } else { - byte[] var2 = ParamDefinition.ParamDefinition_archive.takeFile(11, var0); // L: 27 - var1 = new ParamDefinition(); // L: 28 + byte[] var2 = ParamComposition.ParamDefinition_archive.takeFile(11, var0); // L: 27 + var1 = new ParamComposition(); // L: 28 if (var2 != null) { // L: 29 var1.decode(new Buffer(var2)); } var1.postDecode(); // L: 30 - ParamDefinition.ParamDefinition_cached.put(var1, (long)var0); // L: 31 + ParamComposition.ParamDefinition_cached.put(var1, (long)var0); // L: 31 return var1; // L: 32 } } diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index b8f9c3639e..69fafe983f 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -175,7 +175,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1311691811 ) - static int field835; + @Export("changedVarpCount") + static int changedVarpCount; @ObfuscatedName("tc") static int[] field920; @ObfuscatedName("tr") @@ -390,7 +391,8 @@ public final class Client extends GameShell implements Usernamed { @Export("viewportHeight") static int viewportHeight; @ObfuscatedName("nq") - static int[] field834; + @Export("changedVarps") + static int[] changedVarps; @ObfuscatedName("rh") @ObfuscatedGetter( intValue = -1202571805 @@ -1470,8 +1472,8 @@ public final class Client extends GameShell implements Usernamed { field862 = -1; // L: 509 isDraggingWidget = false; // L: 510 cycleCntr = 1; // L: 515 - field834 = new int[32]; // L: 518 - field835 = 0; // L: 519 + changedVarps = new int[32]; // L: 518 + changedVarpCount = 0; // L: 519 changedItemContainers = new int[32]; // L: 520 field837 = 0; // L: 521 changedSkills = new int[32]; // L: 522 @@ -4416,7 +4418,7 @@ public final class Client extends GameShell implements Usernamed { } class195.method3681(); // L: 5700 - field835 += 32; // L: 5701 + changedVarpCount += 32; // L: 5701 var1.serverPacket = null; // L: 5702 return true; // L: 5703 } @@ -4982,7 +4984,7 @@ public final class Client extends GameShell implements Usernamed { } Script.changeGameOptions(var5); // L: 6129 - field834[++field835 - 1 & 31] = var5; // L: 6130 + changedVarps[++changedVarpCount - 1 & 31] = var5; // L: 6130 var1.serverPacket = null; // L: 6131 return true; // L: 6132 } @@ -5007,7 +5009,7 @@ public final class Client extends GameShell implements Usernamed { if (Varps.Varps_main[var16] != Varps.Varps_temp[var16]) { // L: 6144 Varps.Varps_main[var16] = Varps.Varps_temp[var16]; // L: 6145 Script.changeGameOptions(var16); // L: 6146 - field834[++field835 - 1 & 31] = var16; // L: 6147 + changedVarps[++changedVarpCount - 1 & 31] = var16; // L: 6147 } } @@ -5096,9 +5098,9 @@ public final class Client extends GameShell implements Usernamed { field707 = (field707 + 1) % 100; // L: 6209 String var34 = AbstractFont.escapeBrackets(ServerPacket.method3663(AttackOption.method2135(var3))); // L: 6210 if (var60.modIcon != -1) { // L: 6211 - UserComparator10.addChatMessage(9, class25.method248(var60.modIcon) + var38, var34, ParamDefinition.base37DecodeLong(var22)); + UserComparator10.addChatMessage(9, class25.method248(var60.modIcon) + var38, var34, ParamComposition.base37DecodeLong(var22)); } else { - UserComparator10.addChatMessage(9, var38, var34, ParamDefinition.base37DecodeLong(var22)); // L: 6212 + UserComparator10.addChatMessage(9, var38, var34, ParamComposition.base37DecodeLong(var22)); // L: 6212 } } @@ -5206,7 +5208,7 @@ public final class Client extends GameShell implements Usernamed { } Script.changeGameOptions(var5); // L: 6297 - field834[++field835 - 1 & 31] = var5; // L: 6298 + changedVarps[++changedVarpCount - 1 & 31] = var5; // L: 6298 var1.serverPacket = null; // L: 6299 return true; // L: 6300 } diff --git a/runescape-client/src/main/java/DynamicObject.java b/runescape-client/src/main/java/DynamicObject.java index 6bef8a7cfa..ff8cf6f652 100644 --- a/runescape-client/src/main/java/DynamicObject.java +++ b/runescape-client/src/main/java/DynamicObject.java @@ -93,7 +93,7 @@ public class DynamicObject extends Renderable this.x = var5; // L: 24 this.y = var6; // L: 25 if (var7 != -1) { // L: 26 - this.sequenceDefinition = ParamDefinition.SequenceDefinition_get(var7); // L: 27 + this.sequenceDefinition = ParamComposition.SequenceDefinition_get(var7); // L: 27 this.frame = 0; // L: 28 this.cycleStart = Client.cycle - 1; // L: 29 if (this.sequenceDefinition.field3548 == 0 && var9 != null && var9 instanceof DynamicObject) { // L: 30 diff --git a/runescape-client/src/main/java/EnumComposition.java b/runescape-client/src/main/java/EnumComposition.java index 814d22e1d6..1eb35168ef 100644 --- a/runescape-client/src/main/java/EnumComposition.java +++ b/runescape-client/src/main/java/EnumComposition.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jx") -@Implements("EnumDefinition") +@Implements("EnumComposition") public class EnumComposition extends DualNode { @ObfuscatedName("rk") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/FontName.java b/runescape-client/src/main/java/FontName.java index d136a76b55..a4562658d8 100644 --- a/runescape-client/src/main/java/FontName.java +++ b/runescape-client/src/main/java/FontName.java @@ -596,7 +596,7 @@ public class FontName { CollisionMap.invalidateWidget(var10); } } else { - SequenceDefinition var47 = ParamDefinition.SequenceDefinition_get(var20); // L: 9272 + SequenceDefinition var47 = ParamComposition.SequenceDefinition_get(var20); // L: 9272 var41 = var10.getModel(var47, var10.modelFrame, var36, PlayerComposition.localPlayer.appearance); // L: 9273 if (var41 == null && Widget.field2603) { // L: 9274 CollisionMap.invalidateWidget(var10); diff --git a/runescape-client/src/main/java/Frames.java b/runescape-client/src/main/java/Frames.java index 7769e3fe0d..5a85512a43 100644 --- a/runescape-client/src/main/java/Frames.java +++ b/runescape-client/src/main/java/Frames.java @@ -96,7 +96,7 @@ public class Frames extends DualNode { if (var0 != ScriptOpcodes.CC_CALLONRESIZE && var0 != ScriptOpcodes.IF_CALLONRESIZE) { // L: 1145 int var4; if (var0 == 1928) { // L: 1162 - var6 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 1163 + var6 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1163 var4 = Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]; // L: 1164 if (var4 >= 1 && var4 <= 10) { // L: 1165 class3.widgetDefaultMenuAction(var4, var6.id, var6.childIndex, var6.itemId, ""); // L: 1168 @@ -124,7 +124,7 @@ public class Frames extends DualNode { if (var0 >= 2000) { // L: 1150 var6 = CollisionMap.getWidget(Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]); // L: 1151 } else { - var6 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 1153 + var6 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1153 } if (var6.onResize == null) { // L: 1154 diff --git a/runescape-client/src/main/java/GameShell.java b/runescape-client/src/main/java/GameShell.java index fea96b4d4a..b61fe0534e 100644 --- a/runescape-client/src/main/java/GameShell.java +++ b/runescape-client/src/main/java/GameShell.java @@ -165,7 +165,8 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @Export("canvas") java.awt.Canvas canvas; @ObfuscatedName("ac") - volatile boolean field470; + @Export("fullRedraw") + volatile boolean fullRedraw; @ObfuscatedName("aq") @Export("resizeCanvasNextFrame") boolean resizeCanvasNextFrame; @@ -210,7 +211,7 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.hasErrored = false; // L: 46 this.canvasX = 0; // L: 59 this.canvasY = 0; // L: 60 - this.field470 = true; // L: 71 + this.fullRedraw = true; // L: 71 this.resizeCanvasNextFrame = false; // L: 74 this.isCanvasInvalid = false; // L: 75 this.field472 = 0L; // L: 76 @@ -351,7 +352,7 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.canvas.setLocation(this.canvasX, this.canvasY); // L: 158 } - this.field470 = true; // L: 159 + this.fullRedraw = true; // L: 159 this.resizeGame(); // L: 160 } } // L: 161 @@ -516,7 +517,7 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.canvas.addFocusListener(this); // L: 268 this.canvas.requestFocus(); // L: 269 - this.field470 = true; // L: 270 + this.fullRedraw = true; // L: 270 if (WorldMapIcon_0.rasterProvider != null && IgnoreList.canvasWidth == WorldMapIcon_0.rasterProvider.width && ModelData0.canvasHeight == WorldMapIcon_0.rasterProvider.height) { // L: 271 ((RasterProvider)WorldMapIcon_0.rasterProvider).setComponent(this.canvas); // L: 272 WorldMapIcon_0.rasterProvider.drawFull(0, 0); // L: 273 @@ -600,7 +601,7 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene if (++field471 - 1 > 50) { // L: 364 field471 -= 50; // L: 365 - this.field470 = true; // L: 366 + this.fullRedraw = true; // L: 366 this.canvas.setSize(IgnoreList.canvasWidth, ModelData0.canvasHeight); // L: 367 this.canvas.setVisible(true); // L: 368 if (var1 == this.frame) { // L: 369 @@ -616,12 +617,12 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } this.method984(); // L: 376 - this.draw(this.field470); // L: 377 - if (this.field470) { // L: 378 + this.draw(this.fullRedraw); // L: 377 + if (this.fullRedraw) { // L: 378 this.clearBackground(); } - this.field470 = false; // L: 379 + this.fullRedraw = false; // L: 379 } // L: 380 @ObfuscatedName("ag") @@ -851,7 +852,7 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene public final synchronized void paint(Graphics var1) { if (this == gameShell && !isKilled) { // L: 449 - this.field470 = true; // L: 450 + this.fullRedraw = true; // L: 450 if (class298.currentTimeMillis() - this.field472 > 1000L) { // L: 451 Rectangle var2 = var1.getClipBounds(); // L: 452 if (var2 == null || var2.width >= IgnoreList.canvasWidth && var2.height >= ModelData0.canvasHeight) { @@ -872,7 +873,7 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene public final void focusGained(FocusEvent var1) { volatileFocus = true; // L: 458 - this.field470 = true; // L: 459 + this.fullRedraw = true; // L: 459 } // L: 460 public final void focusLost(FocusEvent var1) { diff --git a/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java b/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java index 50ecb53876..ceb4604b4e 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java @@ -75,7 +75,7 @@ final class GrandExchangeOfferUnitPriceComparator implements Comparator { garbageValue = "-613147121" ) static int method200(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 1041 + Widget var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1041 if (var0 == ScriptOpcodes.CC_GETSCROLLX) { // L: 1042 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = var3.scrollX; // L: 1043 return 1; // L: 1044 diff --git a/runescape-client/src/main/java/GraphicsObject.java b/runescape-client/src/main/java/GraphicsObject.java index ad2271dea2..39dfdb58ae 100644 --- a/runescape-client/src/main/java/GraphicsObject.java +++ b/runescape-client/src/main/java/GraphicsObject.java @@ -81,7 +81,7 @@ public final class GraphicsObject extends Renderable int var8 = TileItem.SpotAnimationDefinition_get(this.id).sequence; // L: 27 if (var8 != -1) { // L: 28 this.isFinished = false; // L: 29 - this.sequenceDefinition = ParamDefinition.SequenceDefinition_get(var8); // L: 30 + this.sequenceDefinition = ParamComposition.SequenceDefinition_get(var8); // L: 30 } else { this.isFinished = true; // L: 32 } diff --git a/runescape-client/src/main/java/HorizontalAlignment.java b/runescape-client/src/main/java/HorizontalAlignment.java index 7ee117bd51..992a76edc9 100644 --- a/runescape-client/src/main/java/HorizontalAlignment.java +++ b/runescape-client/src/main/java/HorizontalAlignment.java @@ -148,7 +148,7 @@ public enum HorizontalAlignment implements Enumerated { return 1; // L: 3442 } else { int var4; - ParamDefinition var5; + ParamComposition var5; if (var0 == ScriptOpcodes.NC_PARAM) { // L: 3444 VarcInt.Interpreter_intStackSize -= 2; // L: 3445 var3 = Interpreter.Interpreter_intStack[VarcInt.Interpreter_intStackSize]; // L: 3446 diff --git a/runescape-client/src/main/java/ItemComposition.java b/runescape-client/src/main/java/ItemComposition.java index 508edaa1f7..010bbcff13 100644 --- a/runescape-client/src/main/java/ItemComposition.java +++ b/runescape-client/src/main/java/ItemComposition.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jq") -@Implements("ItemDefinition") +@Implements("ItemComposition") public class ItemComposition extends DualNode { @ObfuscatedName("p") @Export("ItemDefinition_inMembersWorld") diff --git a/runescape-client/src/main/java/Messages.java b/runescape-client/src/main/java/Messages.java index a1eb7a49f1..9ef82f2c62 100644 --- a/runescape-client/src/main/java/Messages.java +++ b/runescape-client/src/main/java/Messages.java @@ -63,7 +63,7 @@ public class Messages { garbageValue = "-729014462" ) static int method2283(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 1012 + Widget var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1012 if (var0 == ScriptOpcodes.CC_GETX) { // L: 1013 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = var3.x; // L: 1014 return 1; // L: 1015 diff --git a/runescape-client/src/main/java/ModeWhere.java b/runescape-client/src/main/java/ModeWhere.java index eb93654e50..99c3e2d6b8 100644 --- a/runescape-client/src/main/java/ModeWhere.java +++ b/runescape-client/src/main/java/ModeWhere.java @@ -131,7 +131,7 @@ public enum ModeWhere implements Enumerated { var0 -= 1000; // L: 948 var3 = CollisionMap.getWidget(Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]); // L: 949 } else { - var3 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 951 + var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 951 } String var4 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; // L: 952 diff --git a/runescape-client/src/main/java/NPC.java b/runescape-client/src/main/java/NPC.java index f82a5c4de0..8f30d2b937 100644 --- a/runescape-client/src/main/java/NPC.java +++ b/runescape-client/src/main/java/NPC.java @@ -71,7 +71,7 @@ public final class NPC extends Actor { --var4; // L: 35 } - if (super.sequence != -1 && ParamDefinition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 37 + if (super.sequence != -1 && ParamComposition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 37 super.sequence = -1; } @@ -96,7 +96,7 @@ public final class NPC extends Actor { garbageValue = "-169739231" ) final void method2106(int var1, int var2, boolean var3) { - if (super.sequence != -1 && ParamDefinition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 50 + if (super.sequence != -1 && ParamComposition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 50 super.sequence = -1; } @@ -140,8 +140,8 @@ public final class NPC extends Actor { if (this.definition == null) { // L: 77 return null; } else { - SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? ParamDefinition.SequenceDefinition_get(super.sequence) : null; // L: 78 - SequenceDefinition var2 = super.movementSequence != -1 && (super.idleSequence != super.movementSequence || var1 == null) ? ParamDefinition.SequenceDefinition_get(super.movementSequence) : null; // L: 79 + SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? ParamComposition.SequenceDefinition_get(super.sequence) : null; // L: 78 + SequenceDefinition var2 = super.movementSequence != -1 && (super.idleSequence != super.movementSequence || var1 == null) ? ParamComposition.SequenceDefinition_get(super.movementSequence) : null; // L: 79 Model var3 = this.definition.getModel(var1, super.sequenceFrame, var2, super.movementFrame); // L: 80 if (var3 == null) { return null; diff --git a/runescape-client/src/main/java/NPCComposition.java b/runescape-client/src/main/java/NPCComposition.java index b5f6f85d01..70c8521202 100644 --- a/runescape-client/src/main/java/NPCComposition.java +++ b/runescape-client/src/main/java/NPCComposition.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jd") -@Implements("NPCDefinition") +@Implements("NPCComposition") public class NPCComposition extends DualNode { @ObfuscatedName("h") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/ObjectComposition.java b/runescape-client/src/main/java/ObjectComposition.java index 9171913f44..c4f4028c87 100644 --- a/runescape-client/src/main/java/ObjectComposition.java +++ b/runescape-client/src/main/java/ObjectComposition.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jm") -@Implements("ObjectDefinition") +@Implements("ObjectComposition") public class ObjectComposition extends DualNode { @ObfuscatedName("h") @Export("ObjectDefinition_isLowDetail") diff --git a/runescape-client/src/main/java/ParamDefinition.java b/runescape-client/src/main/java/ParamComposition.java similarity index 96% rename from runescape-client/src/main/java/ParamDefinition.java rename to runescape-client/src/main/java/ParamComposition.java index 9d9e906218..286aa3b34a 100644 --- a/runescape-client/src/main/java/ParamDefinition.java +++ b/runescape-client/src/main/java/ParamComposition.java @@ -5,8 +5,8 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jl") -@Implements("ParamDefinition") -public class ParamDefinition extends DualNode { +@Implements("ParamComposition") +public class ParamComposition extends DualNode { @ObfuscatedName("h") @ObfuscatedSignature( descriptor = "Lib;" @@ -39,7 +39,7 @@ public class ParamDefinition extends DualNode { ParamDefinition_cached = new EvictingDualNodeHashTable(64); // L: 12 } - ParamDefinition() { + ParamComposition() { this.autoDisable = true; // L: 16 } // L: 18 @@ -120,7 +120,7 @@ public class ParamDefinition extends DualNode { garbageValue = "1899658312" ) public static void method4526(AbstractArchive var0) { - StructDefinition.StructDefinition_archive = var0; // L: 19 + StructComposition.StructDefinition_archive = var0; // L: 19 } // L: 20 @ObfuscatedName("v") diff --git a/runescape-client/src/main/java/Player.java b/runescape-client/src/main/java/Player.java index 91290450b8..fd66ee817f 100644 --- a/runescape-client/src/main/java/Player.java +++ b/runescape-client/src/main/java/Player.java @@ -384,8 +384,8 @@ public final class Player extends Actor { if (this.appearance == null) { // L: 149 return null; } else { - SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? ParamDefinition.SequenceDefinition_get(super.sequence) : null; // L: 150 - SequenceDefinition var2 = super.movementSequence == -1 || this.isUnanimated || super.idleSequence == super.movementSequence && var1 != null ? null : ParamDefinition.SequenceDefinition_get(super.movementSequence); // L: 151 + SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? ParamComposition.SequenceDefinition_get(super.sequence) : null; // L: 150 + SequenceDefinition var2 = super.movementSequence == -1 || this.isUnanimated || super.idleSequence == super.movementSequence && var1 != null ? null : ParamComposition.SequenceDefinition_get(super.movementSequence); // L: 151 Model var3 = this.appearance.getModel(var1, super.sequenceFrame, var2, super.movementFrame); // L: 152 if (var3 == null) { // L: 153 return null; @@ -451,7 +451,7 @@ public final class Player extends Actor { garbageValue = "1635620178" ) final void method1313(int var1, int var2, byte var3) { - if (super.sequence != -1 && ParamDefinition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 199 + if (super.sequence != -1 && ParamComposition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 199 super.sequence = -1; } diff --git a/runescape-client/src/main/java/PlayerComposition.java b/runescape-client/src/main/java/PlayerComposition.java index c3c875a7df..76c7f06d42 100644 --- a/runescape-client/src/main/java/PlayerComposition.java +++ b/runescape-client/src/main/java/PlayerComposition.java @@ -37,7 +37,8 @@ public class PlayerComposition @ObfuscatedSignature( descriptor = "Lhe;" ) - static Widget field2561; + @Export("scriptDotWidget") + static Widget scriptDotWidget; @ObfuscatedName("kn") @ObfuscatedSignature( descriptor = "Lbq;" diff --git a/runescape-client/src/main/java/Players.java b/runescape-client/src/main/java/Players.java index cf1c1c56bb..2145eb0fa8 100644 --- a/runescape-client/src/main/java/Players.java +++ b/runescape-client/src/main/java/Players.java @@ -608,11 +608,11 @@ public class Players { ScriptEvent var25; int var35; int var36; - if (var9.onVarTransmit != null && Client.field835 > var9.field2645) { // L: 10208 - if (var9.varTransmitTriggers != null && Client.field835 - var9.field2645 <= 32) { // L: 10209 + if (var9.onVarTransmit != null && Client.changedVarpCount > var9.field2645) { // L: 10208 + if (var9.varTransmitTriggers != null && Client.changedVarpCount - var9.field2645 <= 32) { // L: 10209 label777: - for (var36 = var9.field2645; var36 < Client.field835; ++var36) { // L: 10216 - var23 = Client.field834[var36 & 31]; // L: 10217 + for (var36 = var9.field2645; var36 < Client.changedVarpCount; ++var36) { // L: 10216 + var23 = Client.changedVarps[var36 & 31]; // L: 10217 for (var35 = 0; var35 < var9.varTransmitTriggers.length; ++var35) { // L: 10218 if (var23 == var9.varTransmitTriggers[var35]) { // L: 10219 @@ -631,7 +631,7 @@ public class Players { Client.scriptEvents.addFirst(var22); // L: 10213 } - var9.field2645 = Client.field835; // L: 10229 + var9.field2645 = Client.changedVarpCount; // L: 10229 } if (var9.onInvTransmit != null && Client.field837 > var9.field2721) { // L: 10231 diff --git a/runescape-client/src/main/java/Projectile.java b/runescape-client/src/main/java/Projectile.java index 055ed7e6ab..4a52eab604 100644 --- a/runescape-client/src/main/java/Projectile.java +++ b/runescape-client/src/main/java/Projectile.java @@ -150,7 +150,7 @@ public final class Projectile extends Renderable this.isMoving = false; // L: 47 int var12 = TileItem.SpotAnimationDefinition_get(this.id).sequence; // L: 48 if (var12 != -1) { // L: 49 - this.sequenceDefinition = ParamDefinition.SequenceDefinition_get(var12); + this.sequenceDefinition = ParamComposition.SequenceDefinition_get(var12); } else { this.sequenceDefinition = null; // L: 50 } diff --git a/runescape-client/src/main/java/SceneTilePaint.java b/runescape-client/src/main/java/SceneTilePaint.java index 89f945d96e..f6c6f7ec56 100644 --- a/runescape-client/src/main/java/SceneTilePaint.java +++ b/runescape-client/src/main/java/SceneTilePaint.java @@ -74,7 +74,7 @@ public final class SceneTilePaint var0.isWalking = false; // L: 4080 SequenceDefinition var1; if (var0.movementSequence != -1) { // L: 4081 - var1 = ParamDefinition.SequenceDefinition_get(var0.movementSequence); // L: 4082 + var1 = ParamComposition.SequenceDefinition_get(var0.movementSequence); // L: 4082 if (var1 != null && var1.frameIds != null) { // L: 4083 ++var0.movementFrameCycle; // L: 4084 if (var0.movementFrame < var1.frameIds.length && var0.movementFrameCycle > var1.frameLengths[var0.movementFrame]) { // L: 4085 @@ -100,7 +100,7 @@ public final class SceneTilePaint int var3 = TileItem.SpotAnimationDefinition_get(var0.spotAnimation).sequence; // L: 4100 if (var3 != -1) { // L: 4101 - SequenceDefinition var2 = ParamDefinition.SequenceDefinition_get(var3); // L: 4102 + SequenceDefinition var2 = ParamComposition.SequenceDefinition_get(var3); // L: 4102 if (var2 != null && var2.frameIds != null) { // L: 4103 ++var0.spotAnimationFrameCycle; // L: 4104 if (var0.spotAnimationFrame < var2.frameIds.length && var0.spotAnimationFrameCycle > var2.frameLengths[var0.spotAnimationFrame]) { // L: 4105 @@ -121,7 +121,7 @@ public final class SceneTilePaint } if (var0.sequence != -1 && var0.sequenceDelay <= 1) { // L: 4118 - var1 = ParamDefinition.SequenceDefinition_get(var0.sequence); // L: 4119 + var1 = ParamComposition.SequenceDefinition_get(var0.sequence); // L: 4119 if (var1.field3560 == 1 && var0.field996 > 0 && var0.field984 <= Client.cycle && var0.field973 < Client.cycle) { // L: 4120 4121 var0.sequenceDelay = 1; // L: 4122 return; // L: 4123 @@ -129,7 +129,7 @@ public final class SceneTilePaint } if (var0.sequence != -1 && var0.sequenceDelay == 0) { // L: 4127 - var1 = ParamDefinition.SequenceDefinition_get(var0.sequence); // L: 4128 + var1 = ParamComposition.SequenceDefinition_get(var0.sequence); // L: 4128 if (var1 != null && var1.frameIds != null) { // L: 4129 ++var0.sequenceFrameCycle; // L: 4130 if (var0.sequenceFrame < var1.frameIds.length && var0.sequenceFrameCycle > var1.frameLengths[var0.sequenceFrame]) { // L: 4131 diff --git a/runescape-client/src/main/java/ScriptFrame.java b/runescape-client/src/main/java/ScriptFrame.java index 2c1af04ea9..5b7d46d369 100644 --- a/runescape-client/src/main/java/ScriptFrame.java +++ b/runescape-client/src/main/java/ScriptFrame.java @@ -50,7 +50,7 @@ public class ScriptFrame { var4 = CollisionMap.getWidget(Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]); // L: 778 var3 = false; // L: 779 } else { - var4 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 781 + var4 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 781 } int var11; diff --git a/runescape-client/src/main/java/SecureRandomCallable.java b/runescape-client/src/main/java/SecureRandomCallable.java index 01a6eb62bb..0cfbb60420 100644 --- a/runescape-client/src/main/java/SecureRandomCallable.java +++ b/runescape-client/src/main/java/SecureRandomCallable.java @@ -63,7 +63,7 @@ public class SecureRandomCallable implements Callable { boolean var3 = false; // L: 110 for (Node var4 = var1.params.first(); var4 != null; var4 = var1.params.next()) { // L: 111 - ParamDefinition var5 = ChatChannel.getParamDefinition((int)var4.key); // L: 112 + ParamComposition var5 = ChatChannel.getParamDefinition((int)var4.key); // L: 112 if (var5.autoDisable) { // L: 113 var4.remove(); } else { diff --git a/runescape-client/src/main/java/Skeleton.java b/runescape-client/src/main/java/Skeleton.java index fbb05c8ac4..62201856dd 100644 --- a/runescape-client/src/main/java/Skeleton.java +++ b/runescape-client/src/main/java/Skeleton.java @@ -135,7 +135,7 @@ public class Skeleton extends Node { } if (var5 != -1) { // L: 10614 - SequenceDefinition var6 = ParamDefinition.SequenceDefinition_get(var5); // L: 10615 + SequenceDefinition var6 = ParamComposition.SequenceDefinition_get(var5); // L: 10615 for (var3.modelFrameCycle += Client.field850; var3.modelFrameCycle > var6.frameLengths[var3.modelFrame]; CollisionMap.invalidateWidget(var3)) { // L: 10616 10617 10624 var3.modelFrameCycle -= var6.frameLengths[var3.modelFrame]; // L: 10618 diff --git a/runescape-client/src/main/java/SpotAnimationDefinition.java b/runescape-client/src/main/java/SpotAnimationDefinition.java index 7ebe5b2386..16ad8b213c 100644 --- a/runescape-client/src/main/java/SpotAnimationDefinition.java +++ b/runescape-client/src/main/java/SpotAnimationDefinition.java @@ -203,7 +203,7 @@ public class SpotAnimationDefinition extends DualNode { Model var5; if (this.sequence != -1 && var1 != -1) { // L: 103 - var5 = ParamDefinition.SequenceDefinition_get(this.sequence).transformSpotAnimationModel(var2, var1); + var5 = ParamComposition.SequenceDefinition_get(this.sequence).transformSpotAnimationModel(var2, var1); } else { var5 = var2.toSharedSpotAnimationModel(true); // L: 104 } diff --git a/runescape-client/src/main/java/StructDefinition.java b/runescape-client/src/main/java/StructComposition.java similarity index 96% rename from runescape-client/src/main/java/StructDefinition.java rename to runescape-client/src/main/java/StructComposition.java index 6ca0347a2b..a35e9cb579 100644 --- a/runescape-client/src/main/java/StructDefinition.java +++ b/runescape-client/src/main/java/StructComposition.java @@ -4,8 +4,8 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jb") -@Implements("StructDefinition") -public class StructDefinition extends DualNode { +@Implements("StructComposition") +public class StructComposition extends DualNode { @ObfuscatedName("h") @ObfuscatedSignature( descriptor = "Lib;" @@ -29,7 +29,7 @@ public class StructDefinition extends DualNode { StructDefinition_cached = new EvictingDualNodeHashTable(64); // L: 13 } - StructDefinition() { + StructComposition() { } // L: 16 @ObfuscatedName("x") diff --git a/runescape-client/src/main/java/StudioGame.java b/runescape-client/src/main/java/StudioGame.java index 134a352f60..69c0ce51c4 100644 --- a/runescape-client/src/main/java/StudioGame.java +++ b/runescape-client/src/main/java/StudioGame.java @@ -81,7 +81,7 @@ public enum StudioGame implements Enumerated { garbageValue = "1020902177" ) public static void method4185() { - ParamDefinition.ParamDefinition_cached.clear(); // L: 72 + ParamComposition.ParamDefinition_cached.clear(); // L: 72 } // L: 73 @ObfuscatedName("ak") diff --git a/runescape-client/src/main/java/Tiles.java b/runescape-client/src/main/java/Tiles.java index 784185c34d..7f12c265ab 100644 --- a/runescape-client/src/main/java/Tiles.java +++ b/runescape-client/src/main/java/Tiles.java @@ -166,7 +166,7 @@ public final class Tiles { @Export("performPlayerAnimation") static void performPlayerAnimation(Player var0, int var1, int var2) { if (var0.sequence == var1 && var1 != -1) { // L: 4151 - int var3 = ParamDefinition.SequenceDefinition_get(var1).field3548; // L: 4152 + int var3 = ParamComposition.SequenceDefinition_get(var1).field3548; // L: 4152 if (var3 == 1) { // L: 4153 var0.sequenceFrame = 0; // L: 4154 var0.sequenceFrameCycle = 0; // L: 4155 @@ -177,7 +177,7 @@ public final class Tiles { if (var3 == 2) { // L: 4159 var0.field974 = 0; // L: 4160 } - } else if (var1 == -1 || var0.sequence == -1 || ParamDefinition.SequenceDefinition_get(var1).field3557 >= ParamDefinition.SequenceDefinition_get(var0.sequence).field3557) { // L: 4163 + } else if (var1 == -1 || var0.sequence == -1 || ParamComposition.SequenceDefinition_get(var1).field3557 >= ParamComposition.SequenceDefinition_get(var0.sequence).field3557) { // L: 4163 var0.sequence = var1; // L: 4164 var0.sequenceFrame = 0; // L: 4165 var0.sequenceFrameCycle = 0; // L: 4166 diff --git a/runescape-client/src/main/java/UserComparator9.java b/runescape-client/src/main/java/UserComparator9.java index 515e7b890d..f6a43035e5 100644 --- a/runescape-client/src/main/java/UserComparator9.java +++ b/runescape-client/src/main/java/UserComparator9.java @@ -64,7 +64,7 @@ public class UserComparator9 extends AbstractUserComparator { var0 -= 1000; // L: 735 var3 = CollisionMap.getWidget(Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]); // L: 736 } else { - var3 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 738 + var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 738 } CollisionMap.invalidateWidget(var3); // L: 739 diff --git a/runescape-client/src/main/java/VarcInt.java b/runescape-client/src/main/java/VarcInt.java index 25b150a9c8..2fb2b7b191 100644 --- a/runescape-client/src/main/java/VarcInt.java +++ b/runescape-client/src/main/java/VarcInt.java @@ -29,7 +29,8 @@ public class VarcInt extends DualNode { @ObfuscatedSignature( descriptor = "Lhe;" ) - static Widget field3264; + @Export("scriptActiveWidget") + static Widget scriptActiveWidget; @ObfuscatedName("x") @Export("persist") public boolean persist; diff --git a/runescape-client/src/main/java/WorldMapData_0.java b/runescape-client/src/main/java/WorldMapData_0.java index 35e9cab7c1..96e1b3bbf1 100644 --- a/runescape-client/src/main/java/WorldMapData_0.java +++ b/runescape-client/src/main/java/WorldMapData_0.java @@ -461,7 +461,7 @@ public class WorldMapData_0 extends AbstractWorldMapData { var7 = var1.readUnsignedByte(); // L: 7166 if (var6 == var15.sequence && var6 != -1) { // L: 7167 - var8 = ParamDefinition.SequenceDefinition_get(var6).field3548; // L: 7168 + var8 = ParamComposition.SequenceDefinition_get(var6).field3548; // L: 7168 if (var8 == 1) { // L: 7169 var15.sequenceFrame = 0; // L: 7170 var15.sequenceFrameCycle = 0; // L: 7171 @@ -472,7 +472,7 @@ public class WorldMapData_0 extends AbstractWorldMapData { if (var8 == 2) { // L: 7175 var15.field974 = 0; // L: 7176 } - } else if (var6 == -1 || var15.sequence == -1 || ParamDefinition.SequenceDefinition_get(var6).field3557 >= ParamDefinition.SequenceDefinition_get(var15.sequence).field3557) { // L: 7179 + } else if (var6 == -1 || var15.sequence == -1 || ParamComposition.SequenceDefinition_get(var6).field3557 >= ParamComposition.SequenceDefinition_get(var15.sequence).field3557) { // L: 7179 var15.sequence = var6; // L: 7180 var15.sequenceFrame = 0; // L: 7181 var15.sequenceFrameCycle = 0; // L: 7182 diff --git a/runescape-client/src/main/java/WorldMapData_1.java b/runescape-client/src/main/java/WorldMapData_1.java index ae07be96f8..40ccbef1e6 100644 --- a/runescape-client/src/main/java/WorldMapData_1.java +++ b/runescape-client/src/main/java/WorldMapData_1.java @@ -188,7 +188,7 @@ public class WorldMapData_1 extends AbstractWorldMapData { var4 = Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]; // L: 553 var3 = CollisionMap.getWidget(var4); // L: 554 } else { - var3 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 556 + var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 556 } if (var0 == ScriptOpcodes.CC_SETSCROLLPOS) { // L: 557 diff --git a/runescape-client/src/main/java/WorldMapID.java b/runescape-client/src/main/java/WorldMapID.java index 9bc6c18c7f..ad95f758af 100644 --- a/runescape-client/src/main/java/WorldMapID.java +++ b/runescape-client/src/main/java/WorldMapID.java @@ -119,7 +119,7 @@ public class WorldMapID { VarcInt.Interpreter_intStackSize -= 2; // L: 1387 var10 = Interpreter.Interpreter_intStack[VarcInt.Interpreter_intStackSize]; // L: 1388 var16 = Interpreter.Interpreter_intStack[VarcInt.Interpreter_intStackSize + 1]; // L: 1389 - Widget var13 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 1390 + Widget var13 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1390 class13.clickWidget(var13, var10, var16); // L: 1391 return 1; // L: 1392 } else if (var0 == ScriptOpcodes.MOUSECAM) { @@ -256,7 +256,7 @@ public class WorldMapID { return 1; // L: 1534 } else if (var0 == 3140) { Client.field810 = 3; // L: 1537 - Client.field811 = var2 ? PlayerComposition.field2561.id * -437932207 * 653064625 : VarcInt.field3264.id * -437932207 * 653064625; // L: 1538 + Client.field811 = var2 ? PlayerComposition.scriptDotWidget.id * -437932207 * 653064625 : VarcInt.scriptActiveWidget.id * -437932207 * 653064625; // L: 1538 return 1; // L: 1539 } else { boolean var11; @@ -528,7 +528,7 @@ public class WorldMapID { if (var0.field984 >= Client.cycle) { // L: 3878 WorldMapManager.method672(var0); } else if (var0.field973 >= Client.cycle) { // L: 3879 - if (var0.field973 == Client.cycle || var0.sequence == -1 || var0.sequenceDelay != 0 || var0.sequenceFrameCycle + 1 > ParamDefinition.SequenceDefinition_get(var0.sequence).frameLengths[var0.sequenceFrame]) { // L: 3880 + if (var0.field973 == Client.cycle || var0.sequence == -1 || var0.sequenceDelay != 0 || var0.sequenceFrameCycle + 1 > ParamComposition.SequenceDefinition_get(var0.sequence).frameLengths[var0.sequenceFrame]) { // L: 3880 var2 = var0.field973 - var0.field984; // L: 3881 var3 = Client.cycle - var0.field984; // L: 3882 var4 = var0.field941 * 64 + var0.field981 * 128; // L: 3883 diff --git a/runescape-client/src/main/java/WorldMapRectangle.java b/runescape-client/src/main/java/WorldMapRectangle.java index 18f8232d43..2a05e24647 100644 --- a/runescape-client/src/main/java/WorldMapRectangle.java +++ b/runescape-client/src/main/java/WorldMapRectangle.java @@ -57,7 +57,7 @@ public final class WorldMapRectangle { garbageValue = "470419605" ) static int method331(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 1124 + Widget var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1124 if (var0 == ScriptOpcodes.CC_GETTARGETMASK) { // L: 1125 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = ServerPacket.Widget_unpackTargetMask(FaceNormal.getWidgetFlags(var3)); // L: 1126 return 1; // L: 1127 @@ -126,7 +126,7 @@ public final class WorldMapRectangle { WorldMapID.method601(); // L: 2883 HealthBarDefinition.method4509(); // L: 2884 VarcInt.method4426(); // L: 2885 - StructDefinition.StructDefinition_cached.clear(); // L: 2887 + StructComposition.StructDefinition_cached.clear(); // L: 2887 StudioGame.method4185(); // L: 2889 WorldMapElement.WorldMapElement_cachedSprites.clear(); // L: 2891 PlayerComposition.PlayerAppearance_cachedModels.clear(); // L: 2894 diff --git a/runescape-client/src/main/java/class13.java b/runescape-client/src/main/java/class13.java index b3699bdbe3..e9b1d55d42 100644 --- a/runescape-client/src/main/java/class13.java +++ b/runescape-client/src/main/java/class13.java @@ -13,7 +13,7 @@ public final class class13 { garbageValue = "2" ) public static void method129(AbstractArchive var0) { - ParamDefinition.ParamDefinition_archive = var0; // L: 21 + ParamComposition.ParamDefinition_archive = var0; // L: 21 } // L: 22 @ObfuscatedName("x") diff --git a/runescape-client/src/main/java/class200.java b/runescape-client/src/main/java/class200.java index 6f9923374f..1fd2e14d6b 100644 --- a/runescape-client/src/main/java/class200.java +++ b/runescape-client/src/main/java/class200.java @@ -56,7 +56,7 @@ public class class200 { var3 = Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]; // L: 503 var4 = CollisionMap.getWidget(var3); // L: 504 } else { - var4 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 506 + var4 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 506 } if (var0 == ScriptOpcodes.CC_SETPOSITION) { // L: 507 diff --git a/runescape-client/src/main/java/class231.java b/runescape-client/src/main/java/class231.java index 9bf827ac16..09d2134947 100644 --- a/runescape-client/src/main/java/class231.java +++ b/runescape-client/src/main/java/class231.java @@ -157,9 +157,9 @@ public class class231 { var12.isIf3 = true; // L: 452 var6.children[var11] = var12; // L: 453 if (var2) { // L: 454 - PlayerComposition.field2561 = var12; + PlayerComposition.scriptDotWidget = var12; } else { - VarcInt.field3264 = var12; // L: 455 + VarcInt.scriptActiveWidget = var12; // L: 455 } CollisionMap.invalidateWidget(var6); // L: 456 @@ -169,7 +169,7 @@ public class class231 { } else { Widget var3; if (var0 == ScriptOpcodes.CC_DELETE) { // L: 459 - var3 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 460 + var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 460 Widget var10 = CollisionMap.getWidget(var3.id); // L: 461 var10.children[var3.childIndex] = null; // L: 462 CollisionMap.invalidateWidget(var10); // L: 463 @@ -185,9 +185,9 @@ public class class231 { if (var3 != null) { // L: 487 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = 1; // L: 488 if (var2) { // L: 489 - PlayerComposition.field2561 = var3; + PlayerComposition.scriptDotWidget = var3; } else { - VarcInt.field3264 = var3; // L: 490 + VarcInt.scriptActiveWidget = var3; // L: 490 } } else { Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = 0; // L: 492 @@ -205,9 +205,9 @@ public class class231 { if (var5 != null && var4 != -1) { // L: 477 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = 1; // L: 478 if (var2) { // L: 479 - PlayerComposition.field2561 = var5; + PlayerComposition.scriptDotWidget = var5; } else { - VarcInt.field3264 = var5; // L: 480 + VarcInt.scriptActiveWidget = var5; // L: 480 } } else { Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = 0; // L: 482 diff --git a/runescape-client/src/main/java/class238.java b/runescape-client/src/main/java/class238.java index 20382e130c..f3ad65c1a4 100644 --- a/runescape-client/src/main/java/class238.java +++ b/runescape-client/src/main/java/class238.java @@ -41,7 +41,7 @@ public class class238 { garbageValue = "1585982662" ) public static String method4166(CharSequence var0) { - String var1 = ParamDefinition.base37DecodeLong(Renderable.method3340(var0)); // L: 75 + String var1 = ParamComposition.base37DecodeLong(Renderable.method3340(var0)); // L: 75 if (var1 == null) { // L: 76 var1 = ""; } diff --git a/runescape-client/src/main/java/class277.java b/runescape-client/src/main/java/class277.java index 9db0c39626..358fba78e8 100644 --- a/runescape-client/src/main/java/class277.java +++ b/runescape-client/src/main/java/class277.java @@ -10,7 +10,7 @@ public class class277 { garbageValue = "-1829984749" ) static int method5005(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? PlayerComposition.field2561 : VarcInt.field3264; // L: 1106 + Widget var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1106 if (var0 == ScriptOpcodes.CC_GETINVOBJECT) { // L: 1107 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = var3.itemId; // L: 1108 return 1; // L: 1109 diff --git a/runescape-client/src/main/java/class51.java b/runescape-client/src/main/java/class51.java index 4c0bfe4bff..2be0dd5edb 100644 --- a/runescape-client/src/main/java/class51.java +++ b/runescape-client/src/main/java/class51.java @@ -213,7 +213,7 @@ public class class51 implements WorldMapSection { var0.field963 = 0; // L: 3987 } else { if (var0.sequence != -1 && var0.sequenceDelay == 0) { // L: 3990 - SequenceDefinition var1 = ParamDefinition.SequenceDefinition_get(var0.sequence); // L: 3991 + SequenceDefinition var1 = ParamComposition.SequenceDefinition_get(var0.sequence); // L: 3991 if (var0.field996 > 0 && var1.field3560 == 0) { // L: 3992 ++var0.field963; // L: 3993 return; // L: 3994