diff --git a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/AALoad.java b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/AALoad.java index 469cfe50dc..287c85ba1a 100644 --- a/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/AALoad.java +++ b/deobfuscator/src/main/java/net/runelite/asm/attributes/code/instructions/AALoad.java @@ -42,6 +42,11 @@ public class AALoad extends Instruction implements ArrayLoad super(instructions, type); } + public AALoad(Instructions instructions) + { + super(instructions, InstructionType.AALOAD); + } + @Override public InstructionContext execute(Frame frame) { diff --git a/deobfuscator/src/main/java/net/runelite/deob/Deob.java b/deobfuscator/src/main/java/net/runelite/deob/Deob.java index e46bdfbe20..d0be2f21d2 100644 --- a/deobfuscator/src/main/java/net/runelite/deob/Deob.java +++ b/deobfuscator/src/main/java/net/runelite/deob/Deob.java @@ -154,7 +154,7 @@ public class Deob public static boolean isObfuscated(String name) { - return name.length() <= OBFUSCATED_NAME_MAX_LEN || name.startsWith("method") || name.startsWith("vmethod") || name.startsWith("field") || name.startsWith("class"); + return name.length() <= OBFUSCATED_NAME_MAX_LEN || name.startsWith("method") || name.startsWith("vmethod") || name.startsWith("field") || name.startsWith("class") || name.startsWith("__"); } private static void runMath(ClassGroup group) diff --git a/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java new file mode 100644 index 0000000000..fe137ec096 --- /dev/null +++ b/deobfuscator/src/test/java/net/runelite/deob/updater/AnnotationCleaner.java @@ -0,0 +1,75 @@ +package net.runelite.deob.updater; + +import java.io.File; +import net.runelite.asm.ClassFile; +import net.runelite.asm.ClassGroup; +import net.runelite.asm.Field; +import net.runelite.asm.Method; +import net.runelite.asm.attributes.Annotations; +import net.runelite.deob.Deob; +import net.runelite.deob.DeobAnnotations; +import net.runelite.deob.DeobTestProperties; +import net.runelite.deob.util.JarUtil; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Rule; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AnnotationCleaner +{ + private final Logger log = LoggerFactory.getLogger(AnnotationCleaner.class); + + @Rule + public DeobTestProperties properties = new DeobTestProperties(); + + @Test + public void checkMappings() throws Exception + { + File client = new File(properties.getRsClient()); + ClassGroup group = JarUtil.loadJar(client); + + for (ClassFile c : group.getClasses()) + { + if (c.getName().contains("runelite")) + { + continue; + } + + log.debug("Checking {}", c.toString()); + + for (Field f : c.getFields()) + { + Annotations an = f.getAnnotations(); + + String fieldName = f.getName(); + String exportedName = DeobAnnotations.getExportedName(an); + + if (exportedName == null) + { + assertTrue("Field " + fieldName + " isn't obfuscated but doesn't have @Export.", Deob.isObfuscated(fieldName) || fieldName.contains("$")); + continue; + } + + assertEquals("Field " + fieldName + " has " + exportedName + " in @Export", fieldName, exportedName); + } + + for (Method m : c.getMethods()) + { + Annotations an = m.getAnnotations(); + + String fieldName = m.getName(); + String exportedName = DeobAnnotations.getExportedName(an); + + if (exportedName == null) + { + assertTrue("Method " + fieldName + " isn't obfuscated but doesn't have @Export.", Deob.isObfuscated(fieldName) || fieldName.endsWith("init>") || fieldName.equals("values") || fieldName.equals("valueOf") || fieldName.startsWith("compareTo") || fieldName.equals("equals") || fieldName.equals("hashCode") || fieldName.equals("compare")); + continue; + } + + assertEquals("Method " + fieldName + " has " + exportedName + " in @Export", fieldName, exportedName); + } + } + } +} diff --git a/deobfuscator/src/test/resources/deob-test.properties b/deobfuscator/src/test/resources/deob-test.properties index e26a22a2b9..9d858d1a0b 100644 --- a/deobfuscator/src/test/resources/deob-test.properties +++ b/deobfuscator/src/test/resources/deob-test.properties @@ -1,3 +1,3 @@ rs.client=${net.runelite.rs:rs-client:jar} -rs.version=180 +rs.version=${rs.version} vanilla.client=${net.runelite.rs:vanilla:jar} \ No newline at end of file diff --git a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java index 62b0a6676d..7d256096b6 100644 --- a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java +++ b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java @@ -268,7 +268,15 @@ public class RuneLiteAPI { try { - String jsonData = new String(downloadUrl(new URL(GITHUB_API))); + byte[] commits = downloadUrl(new URL(GITHUB_API)); + + if (commits == null) + { + return null; + } + + String jsonData = new String(commits); + for (String s : jsonData.split("\n")) { if (s.startsWith("\"sha\":")) diff --git a/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java b/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java index d9680d1fed..e00b76428a 100644 --- a/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java +++ b/injector-plugin/src/main/java/net/runelite/injector/InjectUtil.java @@ -99,6 +99,11 @@ public class InjectUtil if (hint != null) { ClassFile c = inject.getDeobfuscated().findClass(hint); + if (c == null) + { + throw new InjectionException("Class " + hint + " doesn't exist. (check capitalization)"); + } + for (Field f : c.getFields()) { if (!f.getName().equals(name)) diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java index 37e87d4e99..8ff7fcd3cc 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -157,7 +157,7 @@ public final class AnimationID public static final int HOME_MAKE_TABLET = 4067; public static final int THIEVING_STALL = 832; public static final int PICKPOCKET_SUCCESS = 881; - + //block animations for players and perhaps npcs as well? public static final int BLOCK_DEFENDER = 4177; public static final int BLOCK_NO_SHIELD = 420; @@ -252,7 +252,7 @@ public final class AnimationID public static final int HYDRA_RANGED_4 = 8255; public static final int HYDRA_4_1 = 8257; public static final int HYDRA_4_2 = 8258; - + // INFERNO animations public static final int JAL_NIB = 7574; public static final int JAL_MEJRAH = 7578; @@ -278,4 +278,31 @@ public final class AnimationID public static final int GENERAL_AUTO1 = 7018; public static final int GENERAL_AUTO2 = 7020; public static final int GENERAL_AUTO3 = 7021; -} + + //Zammy-poo + public static final int ZAMMY_GENERIC_AUTO = 64; + public static final int KRIL_AUTO = 6948; + public static final int KRIL_SPEC = 6950; + public static final int ZAKL_AUTO = 7077; + public static final int BALFRUG_AUTO = 4630; + + //Sara-Poo + public static final int ZILYANA_MELEE_AUTO = 6964; + public static final int ZILYANA_AUTO = 6967; + public static final int ZILYANA_SPEC = 6970; + public static final int STARLIGHT_AUTO = 6376; + public static final int BREE_AUTO = 7026; + public static final int GROWLER_AUTO = 7037; + + //Arma-Poo + public static final int KREE_RANGED = 6978; + public static final int SKREE_AUTO = 6955; + public static final int GEERIN_AUTO = 6956; + public static final int GEERIN_FLINCH = 6958; + public static final int KILISA_AUTO = 6957; + + //Dag Kings + public static final int DAG_REX = 2853; + public static final int DAG_PRIME = 2854; + public static final int DAG_SUPREME = 2855; +} \ No newline at end of file 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 fee8165680..604478d6f3 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -249,13 +249,11 @@ public interface Client extends GameShell /** * Gets the canvas height - * @return */ int getCanvasHeight(); /** * Gets the canvas width - * @return */ int getCanvasWidth(); @@ -413,23 +411,6 @@ public interface Client extends GameShell */ int getMouseCurrentButton(); - /** - * Schedules checking of current region tile for next frame, so ${@link Client#getSelectedSceneTile()} ()} will - * return actual value. - * - * @param checkClick when true next frame selected region tile will be updated - */ - void setCheckClick(boolean checkClick); - - /** - * Sets current mouse hover position. This value is automatically updated only when right-clicking in game. - * Setting this value together with ${@link Client#setCheckClick(boolean)} will update ${@link Client#getSelectedSceneTile()} ()} - * for next frame. - * - * @param position current mouse hover position - */ - void setMouseCanvasHoverPosition(Point position); - /** * Gets the currently selected tile (ie. last right clicked tile). * @@ -724,7 +705,7 @@ public interface Client extends GameShell * @param varps passed varbits * @param varbitId the variable ID * @return the value - * @see Varbits#id + * @see Varbits */ int getVarbitValue(int[] varps, int varbitId); @@ -754,7 +735,7 @@ public interface Client extends GameShell * @param varps passed varbits * @param varbit the variable * @param value the value - * @see Varbits#id + * @see Varbits */ void setVarbitValue(int[] varps, int varbit, int value); @@ -798,8 +779,6 @@ public interface Client extends GameShell /** * Get the total experience of the player - * - * @return */ long getOverallExperience(); @@ -977,6 +956,28 @@ public interface Client extends GameShell */ void playSoundEffect(int id, int x, int y, int range); + /** + * Play a sound effect from some point in the world. + * + * @param id the ID of the sound to play. Any int is allowed, but see + * {@link SoundEffectID} for some common ones + * @param x the ground coordinate on the x axis + * @param y the ground coordinate on the y axis + * @param range the number of tiles away that the sound can be heard + * from + * @param delay the amount of frames before the sound starts playing + */ + void playSoundEffect(int id, int x, int y, int range, int delay); + + /** + * Plays a sound effect, even if the player's sound effect volume is muted. + * + * @param id the ID of the sound effect - {@link SoundEffectID} + * @param volume the volume to play the sound effect at, see {@link SoundEffectVolume} for values used + * in the settings interface. if the sound effect volume is not muted, uses the set volume + */ + void playSoundEffect(int id, int volume); + /** * Gets the clients graphic buffer provider. * @@ -1078,15 +1079,11 @@ public interface Client extends GameShell /** * Gets the clan owner of the currently joined clan chat - * - * @return */ String getClanOwner(); /** * Gets the clan chat name of the currently joined clan chat - * - * @return */ String getClanChatName(); @@ -1099,22 +1096,16 @@ public interface Client extends GameShell /** * Gets the number of friends on the friends list. - * - * @return */ int getFriendsCount(); /** * Gets an array of players on the ignore list. - * - * @return */ Ignore[] getIgnores(); /** * Gets the number of ignored players on the ignore list. - * - * @return */ int getIgnoreCount(); @@ -1618,14 +1609,11 @@ public interface Client extends GameShell /** * Get the if1 widget whose item is being dragged - * - * @return */ Widget getIf1DraggedWidget(); /** * Get the item index of the item being dragged on an if1 widget - * @return */ int getIf1DraggedItemIndex(); diff --git a/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java b/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java index b6e535b412..03bfc9df44 100644 --- a/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java +++ b/runelite-api/src/main/java/net/runelite/api/DecorativeObject.java @@ -42,4 +42,14 @@ public interface DecorativeObject extends TileObject Renderable getRenderable(); Renderable getRenderable2(); + + Model getModel1(); + + Model getModel2(); + + int getYOffset(); + + int getXOffset(); + + int getOrientation(); } diff --git a/runelite-api/src/main/java/net/runelite/api/GameObject.java b/runelite-api/src/main/java/net/runelite/api/GameObject.java index 4a508f2180..c12744acbb 100644 --- a/runelite-api/src/main/java/net/runelite/api/GameObject.java +++ b/runelite-api/src/main/java/net/runelite/api/GameObject.java @@ -69,4 +69,8 @@ public interface GameObject extends TileObject Angle getOrientation(); Renderable getRenderable(); + + int getRsOrientation(); + + Model getModel(); } diff --git a/runelite-api/src/main/java/net/runelite/api/GroundObject.java b/runelite-api/src/main/java/net/runelite/api/GroundObject.java index 8a974cd752..828f61c8a9 100644 --- a/runelite-api/src/main/java/net/runelite/api/GroundObject.java +++ b/runelite-api/src/main/java/net/runelite/api/GroundObject.java @@ -30,4 +30,6 @@ package net.runelite.api; public interface GroundObject extends TileObject { Renderable getRenderable(); + + Model getModel(); } diff --git a/runelite-api/src/main/java/net/runelite/api/ItemLayer.java b/runelite-api/src/main/java/net/runelite/api/ItemLayer.java index 7be0b4b20b..b4317d8d8e 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemLayer.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemLayer.java @@ -56,4 +56,8 @@ public interface ItemLayer extends TileObject * @return the top item */ Renderable getTop(); + + Model getModelBottom(); + Model getModelMiddle(); + Model getModelTop(); } diff --git a/runelite-api/src/main/java/net/runelite/api/MenuEntry.java b/runelite-api/src/main/java/net/runelite/api/MenuEntry.java index cda2997a21..d554f91043 100644 --- a/runelite-api/src/main/java/net/runelite/api/MenuEntry.java +++ b/runelite-api/src/main/java/net/runelite/api/MenuEntry.java @@ -70,4 +70,17 @@ public class MenuEntry * This is used for shift click */ private boolean forceLeftClick; + + public static MenuEntry copy(MenuEntry src) + { + return new MenuEntry( + src.getOption(), + src.getTarget(), + src.getIdentifier(), + src.getType(), + src.getParam0(), + src.getParam1(), + src.isForceLeftClick() + ); + } } diff --git a/runelite-api/src/main/java/net/runelite/api/Prayer.java b/runelite-api/src/main/java/net/runelite/api/Prayer.java index 69d835a7c7..6b4ea06e2b 100644 --- a/runelite-api/src/main/java/net/runelite/api/Prayer.java +++ b/runelite-api/src/main/java/net/runelite/api/Prayer.java @@ -24,155 +24,147 @@ */ package net.runelite.api; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.widgets.WidgetInfo; + /** * An enumeration of different prayer spells. */ +@Getter +@AllArgsConstructor public enum Prayer { /** * Thick Skin (Level 1, Defence). */ - THICK_SKIN(Varbits.PRAYER_THICK_SKIN, 5.0), + THICK_SKIN(Varbits.PRAYER_THICK_SKIN, 5.0, WidgetInfo.PRAYER_THICK_SKIN), /** * Burst of Strength (Level 4, Strength). */ - BURST_OF_STRENGTH(Varbits.PRAYER_BURST_OF_STRENGTH, 5.0), + BURST_OF_STRENGTH(Varbits.PRAYER_BURST_OF_STRENGTH, 5.0, WidgetInfo.PRAYER_BURST_OF_STRENGTH), /** * Clarity of Thought (Level 7, Attack). */ - CLARITY_OF_THOUGHT(Varbits.PRAYER_CLARITY_OF_THOUGHT, 5.0), + CLARITY_OF_THOUGHT(Varbits.PRAYER_CLARITY_OF_THOUGHT, 5.0, WidgetInfo.PRAYER_CLARITY_OF_THOUGHT), /** * Sharp Eye (Level 8, Ranging). */ - SHARP_EYE(Varbits.PRAYER_SHARP_EYE, 5.0), + SHARP_EYE(Varbits.PRAYER_SHARP_EYE, 5.0, WidgetInfo.PRAYER_SHARP_EYE), /** * Mystic Will (Level 9, Magic). */ - MYSTIC_WILL(Varbits.PRAYER_MYSTIC_WILL, 5.0), + MYSTIC_WILL(Varbits.PRAYER_MYSTIC_WILL, 5.0, WidgetInfo.PRAYER_MYSTIC_WILL), /** * Rock Skin (Level 10, Defence). */ - ROCK_SKIN(Varbits.PRAYER_ROCK_SKIN, 10.0), + ROCK_SKIN(Varbits.PRAYER_ROCK_SKIN, 10.0, WidgetInfo.PRAYER_ROCK_SKIN), /** * Superhuman Strength (Level 13, Strength). */ - SUPERHUMAN_STRENGTH(Varbits.PRAYER_SUPERHUMAN_STRENGTH, 10.0), + SUPERHUMAN_STRENGTH(Varbits.PRAYER_SUPERHUMAN_STRENGTH, 10.0, WidgetInfo.PRAYER_SUPERHUMAN_STRENGTH), /** * Improved Reflexes (Level 16, Attack). */ - IMPROVED_REFLEXES(Varbits.PRAYER_IMPROVED_REFLEXES, 10.0), + IMPROVED_REFLEXES(Varbits.PRAYER_IMPROVED_REFLEXES, 10.0, WidgetInfo.PRAYER_IMPROVED_REFLEXES), /** * Rapid Restore (Level 19, Stats). */ - RAPID_RESTORE(Varbits.PRAYER_RAPID_RESTORE, 60.0 / 36.0), + RAPID_RESTORE(Varbits.PRAYER_RAPID_RESTORE, 60.0 / 36.0, WidgetInfo.PRAYER_RAPID_RESTORE), /** * Rapid Heal (Level 22, Hitpoints). */ - RAPID_HEAL(Varbits.PRAYER_RAPID_HEAL, 60.0 / 18), + RAPID_HEAL(Varbits.PRAYER_RAPID_HEAL, 60.0 / 18, WidgetInfo.PRAYER_RAPID_HEAL), /** * Protect Item (Level 25). */ - PROTECT_ITEM(Varbits.PRAYER_PROTECT_ITEM, 60.0 / 18), + PROTECT_ITEM(Varbits.PRAYER_PROTECT_ITEM, 60.0 / 18, WidgetInfo.PRAYER_PROTECT_ITEM), /** * Hawk Eye (Level 26, Ranging). */ - HAWK_EYE(Varbits.PRAYER_HAWK_EYE, 10.0), + HAWK_EYE(Varbits.PRAYER_HAWK_EYE, 10.0, WidgetInfo.PRAYER_HAWK_EYE), /** * Mystic Lore (Level 27, Magic). */ - MYSTIC_LORE(Varbits.PRAYER_MYSTIC_LORE, 10.0), + MYSTIC_LORE(Varbits.PRAYER_MYSTIC_LORE, 10.0, WidgetInfo.PRAYER_MYSTIC_LORE), /** * Steel Skin (Level 28, Defence). */ - STEEL_SKIN(Varbits.PRAYER_STEEL_SKIN, 20.0), + STEEL_SKIN(Varbits.PRAYER_STEEL_SKIN, 20.0, WidgetInfo.PRAYER_STEEL_SKIN), /** * Ultimate Strength (Level 31, Strength). */ - ULTIMATE_STRENGTH(Varbits.PRAYER_ULTIMATE_STRENGTH, 20.0), + ULTIMATE_STRENGTH(Varbits.PRAYER_ULTIMATE_STRENGTH, 20.0, WidgetInfo.PRAYER_ULTIMATE_STRENGTH), /** * Incredible Reflexes (Level 34, Attack). */ - INCREDIBLE_REFLEXES(Varbits.PRAYER_INCREDIBLE_REFLEXES, 20.0), + INCREDIBLE_REFLEXES(Varbits.PRAYER_INCREDIBLE_REFLEXES, 20.0, WidgetInfo.PRAYER_INCREDIBLE_REFLEXES), /** * Protect from Magic (Level 37). */ - PROTECT_FROM_MAGIC(Varbits.PRAYER_PROTECT_FROM_MAGIC, 20.0), + PROTECT_FROM_MAGIC(Varbits.PRAYER_PROTECT_FROM_MAGIC, 20.0, WidgetInfo.PRAYER_PROTECT_FROM_MAGIC), /** * Protect from Missiles (Level 40). */ - PROTECT_FROM_MISSILES(Varbits.PRAYER_PROTECT_FROM_MISSILES, 20.0), + PROTECT_FROM_MISSILES(Varbits.PRAYER_PROTECT_FROM_MISSILES, 20.0, WidgetInfo.PRAYER_PROTECT_FROM_MISSILES), /** * Protect from Melee (Level 43). */ - PROTECT_FROM_MELEE(Varbits.PRAYER_PROTECT_FROM_MELEE, 20.0), + PROTECT_FROM_MELEE(Varbits.PRAYER_PROTECT_FROM_MELEE, 20.0, WidgetInfo.PRAYER_PROTECT_FROM_MELEE), /** * Eagle Eye (Level 44, Ranging). */ - EAGLE_EYE(Varbits.PRAYER_EAGLE_EYE, 20.0), + EAGLE_EYE(Varbits.PRAYER_EAGLE_EYE, 20.0, WidgetInfo.PRAYER_EAGLE_EYE), /** * Mystic Might (Level 45, Magic). */ - MYSTIC_MIGHT(Varbits.PRAYER_MYSTIC_MIGHT, 20.0), + MYSTIC_MIGHT(Varbits.PRAYER_MYSTIC_MIGHT, 20.0, WidgetInfo.PRAYER_MYSTIC_MIGHT), /** * Retribution (Level 46). */ - RETRIBUTION(Varbits.PRAYER_RETRIBUTION, 5.0), + RETRIBUTION(Varbits.PRAYER_RETRIBUTION, 5.0, WidgetInfo.PRAYER_RETRIBUTION), /** * Redemption (Level 49). */ - REDEMPTION(Varbits.PRAYER_REDEMPTION, 10.0), + REDEMPTION(Varbits.PRAYER_REDEMPTION, 10.0, WidgetInfo.PRAYER_REDEMPTION), /** * Smite (Level 52). */ - SMITE(Varbits.PRAYER_SMITE, 30.0), + SMITE(Varbits.PRAYER_SMITE, 30.0, WidgetInfo.PRAYER_SMITE), /** * Chivalry (Level 60, Defence/Strength/Attack). */ - CHIVALRY(Varbits.PRAYER_CHIVALRY, 40.0), + CHIVALRY(Varbits.PRAYER_CHIVALRY, 40.0, WidgetInfo.PRAYER_CHIVALRY), /** * Piety (Level 70, Defence/Strength/Attack). */ - PIETY(Varbits.PRAYER_PIETY, 40.0), + PIETY(Varbits.PRAYER_PIETY, 40.0, WidgetInfo.PRAYER_PIETY), /** * Preserve (Level 55). */ - PRESERVE(Varbits.PRAYER_PRESERVE, 60.0 / 18), + PRESERVE(Varbits.PRAYER_PRESERVE, 60.0 / 18, WidgetInfo.PRAYER_PRESERVE), /** * Rigour (Level 74, Ranging/Damage/Defence). */ - RIGOUR(Varbits.PRAYER_RIGOUR, 40.0), + RIGOUR(Varbits.PRAYER_RIGOUR, 40.0, WidgetInfo.PRAYER_RIGOUR), /** * Augury (Level 77, Magic/Magic Def./Defence). */ - AUGURY(Varbits.PRAYER_AUGURY, 40.0); - - private final Varbits varbit; - - private final double drainRate; - - Prayer(Varbits varbit, double drainRate) - { - this.varbit = varbit; - this.drainRate = drainRate; - } + AUGURY(Varbits.PRAYER_AUGURY, 40.0, WidgetInfo.PRAYER_AUGURY); /** * Gets the varbit that stores whether the prayer is active or not. - * - * @return the prayer active varbit */ - public Varbits getVarbit() - { - return varbit; - } + private final Varbits varbit; /** * Gets the prayer drain rate (measured in pray points/minute) - * - * @return the prayer drain rate */ - public double getDrainRate() - { - return drainRate; - } -} + private final double drainRate; + + /** + * Gets the widget info for prayer + */ + private final WidgetInfo widgetInfo; + +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/SoundEffectVolume.java b/runelite-api/src/main/java/net/runelite/api/SoundEffectVolume.java new file mode 100644 index 0000000000..dee7d7c9c1 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/SoundEffectVolume.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018, trimbe + * 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; + +/** + * Volume values for each of the stops on the volume interface + */ +public final class SoundEffectVolume +{ + public static final int MUTED = 0; + public static final int LOW = 32; + public static final int MEDIUM_LOW = 64; + public static final int MEDIUM_HIGH = 96; + public static final int HIGH = 127; +} diff --git a/runelite-api/src/main/java/net/runelite/api/WallObject.java b/runelite-api/src/main/java/net/runelite/api/WallObject.java index 9a7156b654..67bd09fbb5 100644 --- a/runelite-api/src/main/java/net/runelite/api/WallObject.java +++ b/runelite-api/src/main/java/net/runelite/api/WallObject.java @@ -52,4 +52,7 @@ public interface WallObject extends TileObject Renderable getRenderable1(); Renderable getRenderable2(); + + Model getModelA(); + Model getModelB(); } diff --git a/runelite-api/src/main/java/net/runelite/api/WorldType.java b/runelite-api/src/main/java/net/runelite/api/WorldType.java index 167fd83f39..ec44fedd09 100644 --- a/runelite-api/src/main/java/net/runelite/api/WorldType.java +++ b/runelite-api/src/main/java/net/runelite/api/WorldType.java @@ -72,6 +72,30 @@ public enum WorldType private static final EnumSet HIGHRISK_WORLD_TYPES = EnumSet.of( HIGH_RISK ); + + private static final EnumSet ALL_HIGHRISK_WORLD_TYPES = EnumSet.of( + HIGH_RISK, + DEADMAN, + DEADMAN_TOURNAMENT, + SEASONAL_DEADMAN + ); + + private static final EnumSet ALL_PVP_WORLD_TYPES = EnumSet.of( + HIGH_RISK, + DEADMAN, + DEADMAN_TOURNAMENT, + PVP, + SEASONAL_DEADMAN + ); + + private static final EnumSet ALL_PK_WORLD_TYPES = EnumSet.of( + HIGH_RISK, + DEADMAN, + DEADMAN_TOURNAMENT, + PVP, + SEASONAL_DEADMAN, + BOUNTY + ); /** * Create enum set of world types from mask. @@ -133,4 +157,19 @@ public enum WorldType { return worldTypes.stream().anyMatch(HIGHRISK_WORLD_TYPES::contains); } + + public static boolean isAllHighRiskWorld(final Collection worldTypes) + { + return worldTypes.stream().anyMatch(ALL_HIGHRISK_WORLD_TYPES::contains); + } + + public static boolean isAllPvpWorld(final Collection worldTypes) + { + return worldTypes.stream().anyMatch(ALL_PVP_WORLD_TYPES::contains); + } + + public static boolean isAllPKWorld(final Collection worldTypes) + { + return worldTypes.stream().anyMatch(ALL_PK_WORLD_TYPES::contains); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/HealerTeam.java b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java similarity index 68% rename from runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/HealerTeam.java rename to runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java index 909dea212b..488bff8264 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/HealerTeam.java +++ b/runelite-api/src/main/java/net/runelite/api/events/AreaSoundEffectPlayed.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, whartd + * Copyright (c) 2018, WooxSolo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,23 +22,16 @@ * (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.barbarianassault; +package net.runelite.api.events; -import lombok.AllArgsConstructor; -import lombok.Getter; -import net.runelite.api.Point; -import net.runelite.api.widgets.WidgetInfo; +import lombok.Data; -@Getter -@AllArgsConstructor -enum HealerTeam +@Data +public class AreaSoundEffectPlayed { - TEAMMATE1(WidgetInfo.BA_HEAL_TEAMMATE1, new Point(28, 2), 115), - TEAMMATE2(WidgetInfo.BA_HEAL_TEAMMATE2, new Point(26, 2), 115), - TEAMMATE3(WidgetInfo.BA_HEAL_TEAMMATE3, new Point(26, 2), 115), - TEAMMATE4(WidgetInfo.BA_HEAL_TEAMMATE4, new Point(25, 2), 115); - - private WidgetInfo teammate; - private Point offset; - private int width; + private int soundId; + private int sceneX; + private int sceneY; + private int range; + private int delay; } diff --git a/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java b/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java index e186ca0bf1..2180458228 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java @@ -42,10 +42,15 @@ import net.runelite.api.MenuEntry; @Data public class MenuOptionClicked { + public MenuOptionClicked(MenuEntry entry) + { + menuEntry = entry; + } + /** * The actual MenuEntry object representing what was clicked */ - private final MenuEntry menuEntry; + private MenuEntry menuEntry; /** * The option text added to the menu. diff --git a/runelite-api/src/main/java/net/runelite/api/events/ProjectileSpawned.java b/runelite-api/src/main/java/net/runelite/api/events/ProjectileSpawned.java new file mode 100644 index 0000000000..f5ba810a5f --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/ProjectileSpawned.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * 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.Projectile; +import lombok.Data; + +/** + * An event called whenever a {@link Projectile} has spawned. + */ +@Data +public class ProjectileSpawned +{ + /** + * The spawned projectile. + */ + private Projectile projectile; +} diff --git a/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java b/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java new file mode 100644 index 0000000000..127a9a2646 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/SoundEffectPlayed.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, WooxSolo + * 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 lombok.Data; + +@Data +public class SoundEffectPlayed +{ + private int soundId; + private int delay; +} 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 672dc24324..931004b869 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 @@ -57,7 +57,7 @@ public class WidgetID public static final int PEST_CONTROL_BOAT_GROUP_ID = 407; public static final int PEST_CONTROL_GROUP_ID = 408; public static final int PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID = 243; - public static final int PEST_CONTROL_DIALOG_GROUP_ID = 229; + public static final int DIALOG_MINIGAME_GROUP_ID = 229; public static final int CLAN_CHAT_GROUP_ID = 7; public static final int MINIMAP_GROUP_ID = 160; public static final int LOGIN_CLICK_TO_PLAY_GROUP_ID = 378; @@ -84,6 +84,7 @@ public class WidgetID public static final int BA_DEFENDER_GROUP_ID = 487; public static final int BA_HEALER_GROUP_ID = 488; public static final int BA_REWARD_GROUP_ID = 497; + public static final int BA_HORN_OF_GLORY = 484; public static final int LEVEL_UP_GROUP_ID = 233; public static final int DIALOG_SPRITE_GROUP_ID = 193; public static final int QUEST_COMPLETED_GROUP_ID = 277; @@ -197,7 +198,7 @@ public class WidgetID static final int CONFIRM_BUTTON = 6; } - static class PestControlDialog + static class MinigameDialog { static final int TEXT = 1; static final int CONTINUE = 2; @@ -594,7 +595,8 @@ public class WidgetID { static class ATK { - static final int LISTEN = 8; + static final int LISTEN_TOP = 7; + static final int LISTEN_BOTTOM = 8; static final int TO_CALL_WIDGET = 9; static final int TO_CALL = 10; static final int ROLE_SPRITE = 11; @@ -607,6 +609,13 @@ public class WidgetID static final int TEAMMATE3 = 26; static final int TEAMMATE4 = 30; } + static class HORN_GLORY + { + static final int ATTACKER = 5; + static final int DEFENDER = 6; + static final int COLLECTOR = 7; + static final int HEALER = 8; + } static class REWARD_VALUES { static final int RUNNERS_PASSED = 14; 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 4a99733ec3..99fa691985 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 @@ -85,8 +85,8 @@ public enum WidgetInfo DIARY_QUEST_WIDGET_TITLE(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TITLE), DIARY_QUEST_WIDGET_TEXT(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TEXT), - PEST_CONTROL_DIALOG(WidgetID.PEST_CONTROL_DIALOG_GROUP_ID, 0), - PEST_CONTROL_DIALOG_TEXT(WidgetID.PEST_CONTROL_DIALOG_GROUP_ID, WidgetID.PestControlDialog.TEXT), + MINIGAME_DIALOG(WidgetID.DIALOG_MINIGAME_GROUP_ID, 0), + MINIGAME_DIALOG_TEXT(WidgetID.DIALOG_MINIGAME_GROUP_ID, WidgetID.MinigameDialog.TEXT), PEST_CONTROL_EXCHANGE_WINDOW(WidgetID.PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID, 0), PEST_CONTROL_EXCHANGE_WINDOW_POINTS(WidgetID.PEST_CONTROL_EXCHANGE_WINDOW_GROUP_ID, WidgetID.PestControlExchangeWindow.POINTS), PEST_CONTROL_BOAT_INFO(WidgetID.PEST_CONTROL_BOAT_GROUP_ID, WidgetID.PestControlBoat.INFO), @@ -310,6 +310,7 @@ public enum WidgetInfo QUICK_PRAYER_PRAYERS(WidgetID.QUICK_PRAYERS_GROUP_ID, WidgetID.QuickPrayer.PRAYERS), COMBAT_LEVEL(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.LEVEL), + COMBAT_WEAPON(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.WEAPON_NAME), COMBAT_STYLE_ONE(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_ONE), COMBAT_STYLE_TWO(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_TWO), COMBAT_STYLE_THREE(WidgetID.COMBAT_GROUP_ID, WidgetID.Combat.STYLE_THREE), @@ -364,6 +365,7 @@ public enum WidgetInfo BA_HEAL_WAVE_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_HEAL_CALL_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.TO_CALL), BA_HEAL_LISTEN_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.LISTEN), + BA_HEAL_HORN_LISTEN_TEXT(WidgetID.BA_HORN_OF_GLORY, WidgetID.BarbarianAssault.HORN_GLORY.HEALER), BA_HEAL_ROLE_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE), BA_HEAL_ROLE_SPRITE(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), @@ -375,18 +377,22 @@ public enum WidgetInfo BA_COLL_WAVE_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_COLL_CALL_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.TO_CALL), BA_COLL_LISTEN_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.LISTEN), + BA_COLL_HORN_LISTEN_TEXT(WidgetID.BA_HORN_OF_GLORY, WidgetID.BarbarianAssault.HORN_GLORY.COLLECTOR), BA_COLL_ROLE_TEXT(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.ROLE), BA_COLL_ROLE_SPRITE(WidgetID.BA_COLLECTOR_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), BA_ATK_WAVE_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_ATK_CALL_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.TO_CALL), - BA_ATK_LISTEN_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.LISTEN), + BA_ATK_LISTEN_TOP_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.LISTEN_TOP), + BA_ATK_LISTEN_BOTTOM_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.LISTEN_BOTTOM), + BA_ATK_HORN_LISTEN_TEXT(WidgetID.BA_HORN_OF_GLORY, WidgetID.BarbarianAssault.HORN_GLORY.ATTACKER), BA_ATK_ROLE_TEXT(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.ROLE), BA_ATK_ROLE_SPRITE(WidgetID.BA_ATTACKER_GROUP_ID, WidgetID.BarbarianAssault.ATK.ROLE_SPRITE), BA_DEF_WAVE_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_DEF_CALL_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.TO_CALL), BA_DEF_LISTEN_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.LISTEN), + BA_DEF_HORN_LISTEN_TEXT(WidgetID.BA_HORN_OF_GLORY, WidgetID.BarbarianAssault.HORN_GLORY.DEFENDER), BA_DEF_ROLE_TEXT(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.ROLE), BA_DEF_ROLE_SPRITE(WidgetID.BA_DEFENDER_GROUP_ID, WidgetID.BarbarianAssault.ROLE_SPRITE), diff --git a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index 519adacadb..ca25fa84a8 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -45,7 +45,6 @@ import net.runelite.api.Client; import net.runelite.api.Constants; import net.runelite.api.MainBufferProvider; import net.runelite.api.NullItemID; -import net.runelite.api.Point; import net.runelite.api.RenderOverview; import net.runelite.api.Renderable; import net.runelite.api.WorldMapManager; @@ -375,9 +374,6 @@ public class Hooks implements Callbacks /** * Copy an image - * - * @param src - * @return */ private static Image copy(Image src) { @@ -397,18 +393,6 @@ public class Hooks implements Callbacks BufferedImage image = (BufferedImage) bufferProvider.getImage(); Graphics2D graphics2d = image.createGraphics(); - // Update selected scene tile - if (!client.isMenuOpen()) - { - Point p = client.getMouseCanvasPosition(); - p = new Point( - p.getX() - client.getViewportXOffset(), - p.getY() - client.getViewportYOffset()); - - client.setCheckClick(true); - client.setMouseCanvasHoverPosition(p); - } - try { renderer.render(graphics2d, OverlayLayer.ABOVE_SCENE); diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java index bac268c761..031fd1fd34 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java @@ -51,16 +51,24 @@ public @interface ConfigItem String unhide() default ""; + String unhideValue() default ""; + String hide() default ""; + String hideValue() default ""; + String parent() default ""; String enabledBy() default ""; + String enabledByValue() default ""; + String disabledBy() default ""; + String disabledByValue() default ""; + boolean parse() default false; Class clazz() default void.class; String method() default ""; -} +} \ 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 d7d2c52f47..8bb63b5a4f 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 @@ -432,7 +432,10 @@ public class ConfigManager String current = getConfiguration(group.value(), item.keyName()); String valueString = objectToString(defaultValue); - if (Objects.equals(current, valueString)) + // null and the empty string are treated identically in sendConfig and treated as an unset + // If a config value defaults to "" and the current value is null, it will cause an extra + // unset to be sent, so treat them as equal + if (Objects.equals(current, valueString) || (Strings.isNullOrEmpty(current) && Strings.isNullOrEmpty(valueString))) { continue; // already set to the default value } diff --git a/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java index 49b908992b..96a55f3e86 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java +++ b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java @@ -325,7 +325,7 @@ public enum AgilityShortcut TROLLHEIM_MEDIUM_CLIFF_SCRAMBLE_NORTH(43, "Rocks", new WorldPoint(2886, 3684, 0), ROCKS_3803, ROCKS_3804, ROCKS_16522), TROLLHEIM_MEDIUM_CLIFF_SCRAMBLE_SOUTH(43, "Rocks", new WorldPoint(2876, 3666, 0), ROCKS_3803, ROCKS_3804, ROCKS_16522), TROLLHEIM_ADVANCED_CLIFF_SCRAMBLE(44, "Rocks", new WorldPoint(2907, 3686, 0), ROCKS_16523, ROCKS_3748), - KOUREND_RIVER_STEPPING_STONES(45, "Stepping Stones", new WorldPoint(1721, 3509, 0), STEPPING_STONE_29728), + KOUREND_RIVER_STEPPING_STONES(45, "Stepping Stones", new WorldPoint(1720, 3551, 0), STEPPING_STONE_29728), TIRANNWN_LOG_BALANCE(45, "Log Balance", null, LOG_BALANCE_3933, LOG_BALANCE_3931, LOG_BALANCE_3930, LOG_BALANCE_3929, LOG_BALANCE_3932), COSMIC_ALTAR_MEDIUM_WALKWAY(46, "Narrow Walkway", new WorldPoint(2399, 4403, 0), JUTTING_WALL_17002), DEEP_WILDERNESS_DUNGEON_CREVICE_NORTH(46, "Narrow Crevice", new WorldPoint(3047, 10335, 0), CREVICE_19043), diff --git a/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java b/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java index 03cc5af7eb..71255a4a63 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/NPCManager.java @@ -59,6 +59,7 @@ public class NPCManager /** * Returns the {@link NPCStats} for target NPC id + * * @param npcId NPC id * @return the {@link NPCStats} or null if unknown */ @@ -70,23 +71,41 @@ public class NPCManager /** * Returns health for target NPC ID + * * @param npcId NPC id * @return health or null if unknown */ - @Nullable - public Integer getHealth(final int npcId) + public int getHealth(final int npcId) { final NPCStats s = statsMap.get(npcId); if (s == null || s.getHitpoints() == -1) { - return null; + return -1; } return s.getHitpoints(); } + /** + * Returns the attack speed for target NPC ID. + * + * @param npcId NPC id + * @return attack speed in game ticks for NPC ID. + */ + public int getAttackSpeed(final int npcId) + { + final NPCStats s = statsMap.get(npcId); + if (s == null || s.getAttackSpeed() == -1) + { + return -1; + } + + return s.getAttackSpeed(); + } + /** * Returns the exp modifier for target NPC ID based on its stats. + * * @param npcId NPC id * @return npcs exp modifier. Assumes default xp rate if npc stats are unknown (returns 1) */ diff --git a/runelite-client/src/main/java/net/runelite/client/game/NPCStats.java b/runelite-client/src/main/java/net/runelite/client/game/NPCStats.java index e976f938ec..d324098226 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/NPCStats.java +++ b/runelite-client/src/main/java/net/runelite/client/game/NPCStats.java @@ -34,6 +34,7 @@ public class NPCStats private final int hitpoints; private final int combatLevel; private final int slayerLevel; + private final int attackSpeed; private final int attackLevel; private final int strengthLevel; diff --git a/runelite-client/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java b/runelite-client/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java index 48276115af..203f16fdab 100644 --- a/runelite-client/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/graphics/ModelOutlineRenderer.java @@ -34,12 +34,18 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; import net.runelite.api.Client; +import net.runelite.api.DecorativeObject; +import net.runelite.api.GameObject; +import net.runelite.api.GroundObject; +import net.runelite.api.ItemLayer; import net.runelite.api.MainBufferProvider; import net.runelite.api.Model; import net.runelite.api.NPC; import net.runelite.api.NPCDefinition; import net.runelite.api.Perspective; import net.runelite.api.Player; +import net.runelite.api.TileObject; +import net.runelite.api.WallObject; import net.runelite.api.coords.LocalPoint; import net.runelite.client.task.Schedule; @@ -278,8 +284,7 @@ public class ModelOutlineRenderer * @param x1 The starting x position * @param x2 The ending x position */ - private void simulateHorizontalLineRasterizationForOutline( - int pixelPos, int x1, int x2) + private void simulateHorizontalLineRasterizationForOutline(int pixelPos, int x1, int x2) { if (x2 > clipX2) { @@ -337,8 +342,7 @@ public class ModelOutlineRenderer * @param x3 The starting x position of the second line * @param x4 The ending x position of the second line */ - private void outlineAroundHorizontalLine( - int pixelPos, int x1, int x2, int x3, int x4) + private void outlineAroundHorizontalLine(int pixelPos, int x1, int x2, int x3, int x4) { if (x1 < clipX1) { @@ -420,8 +424,7 @@ public class ModelOutlineRenderer * @param x3 The x position of the third vertex in the triangle * @param y3 The y position of the third vertex in the triangle */ - private void simulateTriangleRasterizationForOutline( - int x1, int y1, int x2, int y2, int x3, int y3) + private void simulateTriangleRasterizationForOutline(int x1, int y1, int x2, int y2, int x3, int y3) { // Swap vertices so y1 <= y2 <= y3 using bubble sort if (y1 > y2) @@ -615,8 +618,7 @@ public class ModelOutlineRenderer * @param vertexOrientation The orientation of the vertices * @return Returns true if any of them are inside the clip area, otherwise false */ - private boolean projectVertices(Model model, - final int localX, final int localY, final int localZ, final int vertexOrientation) + private boolean projectVertices(Model model, final int localX, final int localY, final int localZ, final int vertexOrientation) { final int cameraX = client.getCameraX(); final int cameraY = client.getCameraY(); @@ -742,8 +744,7 @@ public class ModelOutlineRenderer * @param innerColor The color of the pixels of the outline closest to the model * @param outerColor The color of the pixels of the outline furthest away from the model */ - private void renderOutline(BufferedImage image, int outlineWidth, - Color innerColor, Color outerColor) + private void renderOutline(BufferedImage image, int outlineWidth, Color innerColor, Color outerColor) { int[] imageData = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); List ps = getPriorityList(outlineWidth); @@ -886,9 +887,7 @@ public class ModelOutlineRenderer * @param innerColor The color of the pixels of the outline closest to the model * @param outerColor The color of the pixels of the outline furthest away from the model */ - private void drawModelOutline(Model model, - int localX, int localY, int localZ, int orientation, - int outlineWidth, Color innerColor, Color outerColor) + private void drawModelOutline(Model model, int localX, int localY, int localZ, int orientation, int outlineWidth, Color innerColor, Color outerColor) { if (outlineWidth <= 0) { @@ -930,8 +929,7 @@ public class ModelOutlineRenderer drawOutline(npc, outlineWidth, color, color); } - public void drawOutline(NPC npc, int outlineWidth, - Color innerColor, Color outerColor) + public void drawOutline(NPC npc, int outlineWidth, Color innerColor, Color outerColor) { int size = 1; NPCDefinition composition = npc.getTransformedDefinition(); @@ -959,8 +957,7 @@ public class ModelOutlineRenderer drawOutline(player, outlineWidth, color, color); } - public void drawOutline(Player player, int outlineWidth, - Color innerColor, Color outerColor) + public void drawOutline(Player player, int outlineWidth, Color innerColor, Color outerColor) { LocalPoint lp = player.getLocalLocation(); if (lp != null) @@ -970,4 +967,136 @@ public class ModelOutlineRenderer player.getOrientation(), outlineWidth, innerColor, outerColor); } } + + private void drawOutline(GameObject gameObject, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = gameObject.getLocalLocation(); + if (lp != null) + { + drawModelOutline(gameObject.getModel(), lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, gameObject.getPlane()), + gameObject.getRsOrientation(), outlineWidth, innerColor, outerColor); + } + } + + private void drawOutline(GroundObject groundObject, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = groundObject.getLocalLocation(); + if (lp != null) + { + drawModelOutline(groundObject.getModel(), lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, client.getPlane()), + 0, outlineWidth, innerColor, outerColor); + } + } + + private void drawOutline(ItemLayer itemLayer, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = itemLayer.getLocalLocation(); + if (lp != null) + { + Model model = itemLayer.getModelBottom(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, itemLayer.getPlane()), + 0, outlineWidth, innerColor, outerColor); + } + + model = itemLayer.getModelMiddle(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, itemLayer.getPlane()), + 0, outlineWidth, innerColor, outerColor); + } + + model = itemLayer.getModelTop(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, itemLayer.getPlane()), + 0, outlineWidth, innerColor, outerColor); + } + } + } + + private void drawOutline(DecorativeObject decorativeObject, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = decorativeObject.getLocalLocation(); + if (lp != null) + { + Model model = decorativeObject.getModel1(); + if (model != null) + { + drawModelOutline(model, + lp.getX() + decorativeObject.getXOffset(), + lp.getY() + decorativeObject.getYOffset(), + Perspective.getTileHeight(client, lp, decorativeObject.getPlane()), + decorativeObject.getOrientation(), outlineWidth, innerColor, outerColor); + } + + model = decorativeObject.getModel2(); + if (model != null) + { + // Offset is not used for the second model + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, decorativeObject.getPlane()), + decorativeObject.getOrientation(), outlineWidth, innerColor, outerColor); + } + } + } + + private void drawOutline(WallObject wallObject, int outlineWidth, Color innerColor, Color outerColor) + { + LocalPoint lp = wallObject.getLocalLocation(); + if (lp != null) + { + Model model = wallObject.getModelA(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, wallObject.getPlane()), + wallObject.getOrientationA(), outlineWidth, innerColor, outerColor); + } + + model = wallObject.getModelB(); + if (model != null) + { + drawModelOutline(model, lp.getX(), lp.getY(), + Perspective.getTileHeight(client, lp, wallObject.getPlane()), + wallObject.getOrientationB(), outlineWidth, innerColor, outerColor); + } + } + } + + public void drawOutline(TileObject tileObject, int outlineWidth, Color color) + { + drawOutline(tileObject, outlineWidth, color, color); + } + + public void drawOutline(TileObject tileObject, + int outlineWidth, Color innerColor, Color outerColor) + { + if (tileObject instanceof GameObject) + { + drawOutline((GameObject) tileObject, outlineWidth, innerColor, outerColor); + } + else if (tileObject instanceof GroundObject) + { + drawOutline((GroundObject) tileObject, outlineWidth, innerColor, outerColor); + } + else if (tileObject instanceof ItemLayer) + { + drawOutline((ItemLayer) tileObject, outlineWidth, innerColor, outerColor); + } + else if (tileObject instanceof DecorativeObject) + { + drawOutline((DecorativeObject) tileObject, outlineWidth, innerColor, outerColor); + } + else if (tileObject instanceof WallObject) + { + drawOutline((WallObject) tileObject, outlineWidth, innerColor, outerColor); + } + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/menus/ComparableEntry.java b/runelite-client/src/main/java/net/runelite/client/menus/ComparableEntry.java index 29efd58742..e7525c901c 100644 --- a/runelite-client/src/main/java/net/runelite/client/menus/ComparableEntry.java +++ b/runelite-client/src/main/java/net/runelite/client/menus/ComparableEntry.java @@ -72,6 +72,16 @@ public class ComparableEntry this.strictTarget = strictTarget; } + // This is only used for type checking, which is why it has everything but target + // target sometimes changes to option. + public ComparableEntry(MenuEntry e) + { + this.option = e.getOption(); + this.id = e.getIdentifier(); + this.type = e.getType(); + this.strictOption = true; + } + boolean matches(MenuEntry entry) { String opt = Text.standardize(entry.getOption()); diff --git a/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java b/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java index 82f76b877d..13ae8adcd8 100644 --- a/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java +++ b/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java @@ -39,6 +39,7 @@ import java.util.Set; import java.util.regex.Pattern; import javax.inject.Inject; import javax.inject.Singleton; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.MenuAction; @@ -96,7 +97,7 @@ public class MenuManager private final Set hiddenEntries = new HashSet<>(); private final Map swaps = new HashMap<>(); - private final Map originalTypes = new HashMap<>(); + private EntryTypeMapping originalType; @Inject private MenuManager(Client client, EventBus eventBus) @@ -227,7 +228,7 @@ public class MenuManager @Subscribe private void onClientTick(ClientTick event) { - originalTypes.clear(); + originalType = null; client.sortMenuEntries(); final MenuEntry[] oldentries = client.getMenuEntries(); @@ -273,8 +274,9 @@ public class MenuManager int newType = getLeftClickType(type); if (newType != -1 && newType != type) { + MenuEntry original = MenuEntry.copy(e); e.setType(newType); - originalTypes.put(e, type); + originalType = new EntryTypeMapping(new ComparableEntry(e), original); } } @@ -409,18 +411,18 @@ public class MenuManager @Subscribe public void onMenuOptionClicked(MenuOptionClicked event) { - if (originalTypes.containsKey(event.getMenuEntry()) && - !event.getTarget().equals("do not edit")) + // Type is changed in check + if (originalType != null && originalType.check(event)) { event.consume(); client.invokeMenuAction( event.getActionParam0(), event.getActionParam1(), - originalTypes.get(event.getMenuEntry()), + event.getType(), event.getIdentifier(), - event.getOption(), "do not edit", + event.getTarget(), client.getMouseCanvasPosition().getX(), client.getMouseCanvasPosition().getY() ); @@ -749,4 +751,24 @@ public class MenuManager { hiddenEntries.remove(entry); } + + @AllArgsConstructor + private class EntryTypeMapping + { + private final ComparableEntry comparable; + private final MenuEntry target; + + private boolean check(MenuOptionClicked event) + { + MenuEntry entry = event.getMenuEntry(); + + if (!entry.getTarget().equals(entry.getOption()) && !comparable.matches(entry)) + { + return false; + } + + event.setMenuEntry(target); + return true; + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveSceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveSceneOverlay.java new file mode 100644 index 0000000000..ecfb8251ce --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveSceneOverlay.java @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2018, Jacob M + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * 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.barbarianassault; + +import com.google.common.collect.ImmutableMap; +import net.runelite.api.Client; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.widgets.Widget; +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.OverlayUtil; + +import javax.inject.Inject; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Stroke; +import java.awt.BasicStroke; +import java.util.Map; + + +class AboveSceneOverlay extends Overlay +{ + private static final int HEALTH_BAR_HEIGHT = 20; + private static final int HEALTH_BAR_WIDTH = 115; + private static final int CENTER_OFFSET = Perspective.LOCAL_HALF_TILE_SIZE / 8; + private static final int EGG_DIAMETER = Perspective.LOCAL_HALF_TILE_SIZE / 4; + private static final Color HEALTH_BAR_COLOR = new Color(225, 35, 0, 125); + private static final ImmutableMap TEAMMATES = ImmutableMap.of( + WidgetInfo.BA_HEAL_TEAMMATE1, new Point(28, 2), + WidgetInfo.BA_HEAL_TEAMMATE2, new Point(26, 2), + WidgetInfo.BA_HEAL_TEAMMATE3, new Point(26, 2), + WidgetInfo.BA_HEAL_TEAMMATE4, new Point(25, 2)); + + private final Client client; + private final BarbarianAssaultPlugin game; + private final BarbarianAssaultConfig config; + + + @Inject + private AboveSceneOverlay(Client client, BarbarianAssaultPlugin game, BarbarianAssaultConfig config) + { + super(game); + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_SCENE); + this.client = client; + this.game = game; + this.config = config; + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!game.isInGame() || game.getRole() == null || game.isUsingGloryHorn()) + { + return null; + } + + switch (game.getRole()) + { + + case HEALER: + if (config.showTeammateHealthbars()) + { + renderHealthBars(graphics); + } + if (config.healerCodes()) + { + renderHealerCodes(graphics); + } + break; + + + case COLLECTOR: + if (config.highlightCollectorEggs()) + { + renderEggs(graphics); + } + break; + } + return null; + } + + //TODO add poison color change or low health color change + private void renderHealthBars(Graphics2D graphics) + { + for (Map.Entry teammate : TEAMMATES.entrySet()) + { + Widget widget = client.getWidget(teammate.getKey()); + if (widget == null) + { + continue; + } + + // This will give us two elements, the first will be current health, and the second will be max health + String[] teammateHealth = widget.getText().split(" / "); + + graphics.setColor(HEALTH_BAR_COLOR); + graphics.fillRect((widget.getCanvasLocation().getX() - teammate.getValue().getX()), + (widget.getCanvasLocation().getY() - teammate.getValue().getY()), + getBarWidth(Integer.parseInt(teammateHealth[1]), Integer.parseInt(teammateHealth[0])), + HEALTH_BAR_HEIGHT); + } + } + + private int getBarWidth(int base, int current) + { + final double ratio = (double) current / base; + + if (ratio >= 1) + { + return HEALTH_BAR_WIDTH; + } + + return (int) Math.round(ratio * HEALTH_BAR_WIDTH); + } + + private void renderHealerCodes(Graphics2D graphics) + { + for (Healer healer : game.getHealers().values()) + { + Color color = Color.GREEN; + int timeLeft = 0; + + if (game.getWave() != null) + { + timeLeft = healer.getLastFoodTime() - (int) game.getWave().getWaveTimer().getElapsedTime(); + } + + timeLeft = timeLeft < 1 ? 0 : timeLeft; + + if (timeLeft > 0) + { + color = Color.RED; + } + + String text = String.format("%d %d", healer.getFoodRemaining(), timeLeft); + + OverlayUtil.renderActorOverlay(graphics, healer.getNpc(), text, color); + } + } + + private void renderEggs(Graphics2D graphics) + { + final Color color = graphics.getColor(); + final Stroke originalStroke = graphics.getStroke(); + String listen = game.getLastListenText(); + if (listen != null && !listen.equals("- - -")) + { + graphics.setStroke(new BasicStroke(2)); + //TODO Render quantity text as well + //TODO add config options for overlay colors + switch (listen) + { + case "Red eggs": + graphics.setColor(new Color(Color.RED.getRed(), Color.RED.getGreen(), Color.RED.getBlue(), 150)); + game.getRedEggs().forEach((point, quantity) -> drawCircle(graphics, LocalPoint.fromWorld(client, point))); + break; + case "Green eggs": + graphics.setColor(new Color(Color.GREEN.getRed(), Color.GREEN.getGreen(), Color.GREEN.getBlue(), 150)); + game.getGreenEggs().forEach((point, quantity) -> drawCircle(graphics, LocalPoint.fromWorld(client, point))); + break; + case "Blue eggs": + graphics.setColor(new Color(Color.BLUE.getRed(), Color.BLUE.getGreen(), Color.BLUE.getBlue(), 150)); + game.getBlueEggs().forEach((point, quantity) -> drawCircle(graphics, LocalPoint.fromWorld(client, point))); + break; + } + } + graphics.setColor(new Color(Color.YELLOW.getRed(), Color.YELLOW.getGreen(), Color.YELLOW.getBlue(), 150)); + game.getYellowEggs().forEach((point, quantity) -> drawCircle(graphics, LocalPoint.fromWorld(client, point))); + graphics.setColor(color); + graphics.setStroke(originalStroke); + } + + private void drawCircle(Graphics2D graphics, LocalPoint point) + { + if (point == null) + { + return; + } + + Point canvasPoint = Perspective.localToCanvas(client, point, 0); + if (canvasPoint == null) + { + return; + } + + //TODO rendering a model would be better / more accurate + graphics.fillOval(canvasPoint.getX() - CENTER_OFFSET, canvasPoint.getY() - CENTER_OFFSET, EGG_DIAMETER, EGG_DIAMETER); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveWidgetsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveWidgetsOverlay.java new file mode 100644 index 0000000000..6c140ef4b3 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/AboveWidgetsOverlay.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * 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.barbarianassault; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import javax.inject.Inject; + +import net.runelite.api.Client; +import net.runelite.api.Point; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +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.ImageUtil; + + +class AboveWidgetsOverlay extends Overlay +{ + private static final int OFFSET_X_TEXT_QUANTITY = 0; + private static final int OFFSET_Y_TEXT_QUANTITY = 10; + + private final Client client; + private final BarbarianAssaultPlugin game; + private final BarbarianAssaultConfig config; + + + @Inject + private AboveWidgetsOverlay(Client client, BarbarianAssaultPlugin game, BarbarianAssaultConfig config) + { + super(game); + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_WIDGETS); + this.client = client; + this.game = game; + this.config = config; + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!game.isInGame() || game.getRole() == null || game.isUsingGloryHorn()) + { + return null; + } + + Role role = game.getRole(); + + if (config.showTimer()) + { + renderTimer(graphics, role); + } + + switch (role) + { + case ATTACKER: + if (config.highlightArrows()) + { + renderInventoryHighlights(graphics, game.getRole().getListenItem(game.getLastListenText()), config.highlightArrowColor()); + } + break; + + case DEFENDER: + if (config.highlightBait()) + { + renderInventoryHighlights(graphics, game.getRole().getListenItem(game.getLastListenText()), config.highlightBaitColor()); + } + break; + + case HEALER: + if (config.highlightPoison()) + { + renderInventoryHighlights(graphics, game.getRole().getListenItem(game.getLastListenText()), config.highlightPoisonColor()); + } + } + return null; + } + + private void renderTimer(Graphics2D graphics, Role role) + { + Widget roleText = client.getWidget(role.getRoleText()); + Widget roleSprite = client.getWidget(role.getRoleSprite()); + + if (roleText == null || roleSprite == null) + { + return; + } + + if (role == Role.COLLECTOR && config.showEggCountOverlay() && game.getWave() != null) + { + roleText.setText("(" + game.getWave().getCollectedEggCount() + ") " + formatClock()); + } + else if (role == Role.HEALER && config.showHpCountOverlay() && game.getWave() != null) + { + roleText.setText("(" + game.getWave().getHpHealed() + ") " + formatClock()); + } + else + { + roleText.setText(formatClock()); + } + + Rectangle spriteBounds = roleSprite.getBounds(); + graphics.drawImage(game.getClockImage(), spriteBounds.x, spriteBounds.y, null); + roleSprite.setHidden(true); + } + + private void renderInventoryHighlights(Graphics2D graphics, int itemID, Color color) + { + Widget inventory = client.getWidget(WidgetInfo.INVENTORY); + + if (inventory == null || inventory.isHidden() || itemID == -1) + { + return; + } + + Color highlight = new Color(color.getRed(), color.getGreen(), color.getBlue(), 150); + BufferedImage image = ImageUtil.fillImage(client.createItemSprite(itemID, 300, 2, 0, 0, true, 710).toBufferedImage(), highlight); + for (WidgetItem item : inventory.getWidgetItems()) + { + if (item.getId() == itemID) + { + OverlayUtil.renderImageLocation(graphics, item.getCanvasLocation(), image); + //The item's text quantity is rendered after the sprite's image is rendered so that the text appears on top + if (item.getQuantity() > 1) + { + OverlayUtil.renderTextLocation(graphics, + new Point(item.getCanvasLocation().getX() + OFFSET_X_TEXT_QUANTITY, item.getCanvasLocation().getY() + OFFSET_Y_TEXT_QUANTITY), + String.valueOf(item.getQuantity()), Color.YELLOW); + } + } + } + } + + private String formatClock() + { + if (game.getCallTimer() == null) + { + return "- - -"; + } + else + { + long timeLeft = game.getTimeToChange(); + if (timeLeft < 0) + { + return "00:00"; + } + else + { + return String.format("00:%02d", timeLeft); + } + } + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java index f2d1269bb7..9c439eb966 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultConfig.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,26 +29,112 @@ import java.awt.Color; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Range; @ConfigGroup("barbarianAssault") public interface BarbarianAssaultConfig extends Config { + @ConfigItem( + keyName = "swapLadder", + name = "Swap quick-start", + description = "Enables swapping of 'Climb-down' and 'Quick-start' in the wave lobby", + position = 0 + ) + default boolean swapLadder() + { + return true; + } @ConfigItem( keyName = "showTimer", name = "Show call change timer", - description = "Show time to next call change", - position = 0 + description = "Shows time to next call change", + position = 1 ) default boolean showTimer() { return true; } + @ConfigItem( + keyName = "removeIncorrectCalls", + name = "Remove incorrect calls", + description = "Removes incorrect 'Tell' menu options from horn", + position = 2 + ) + default boolean removeIncorrectCalls() + { + return true; + } + + @ConfigItem( + keyName = "removeUnusedMenus", + name = "Remove unused menus", + description = "Removes unnecessary menu options" + + "
Example: Attack options are removed when not attacker", + position = 3 + ) + default boolean removeUnusedMenus() + { + return true; + } + + @ConfigItem( + keyName = "prayerMetronome", + name = "Enable prayer metronome", + description = "Turns on a metronome sync'd to the game's tick rate when any prayer is active", + position = 4 + ) + default boolean prayerMetronome() + { + return false; + } + + @Range( + min = 1, + max = 50 + ) + @ConfigItem( + keyName = "prayerMetronomeVolume", + name = "Metronome volume", + description = "Adjusts the metronome's volume", + position = 5, + hidden = true, + unhide = "prayerMetronome" + ) + default int prayerMetronomeVolume() + { + return 10; + } + + @ConfigItem( + keyName = "showDeathTimes", + name = "Show death times", + description = "Shows the time all penance monsters of a certain type are killed in the chat box, an info box, or both", + position = 6 + ) + default boolean showDeathTimes() + { + return true; + } + + @ConfigItem( + keyName = "showDeathTimesMode", + name = "Mode", + description = "", + position = 7, + hidden = true, + unhide = "showDeathTimes" + ) + default DeathTimesMode showDeathTimesMode() + { + return DeathTimesMode.BOTH; + } + @ConfigItem( keyName = "waveTimes", name = "Show wave and game duration", - description = "Displays wave and game duration", - position = 1 + description = "Displays wave duration after each wave and total game time after wave 10", + position = 8 ) default boolean waveTimes() { @@ -55,112 +142,329 @@ public interface BarbarianAssaultConfig extends Config } @ConfigItem( - keyName = "showEggCountMessage", - name = "Show count of eggs collected as collector.", - description = "Display egg count as collector after each wave", - position = 2 + keyName = "showTotalRewards", + name = "Summarize total reward points", + description = "Gives summary of advanced points breakdown in chat log", + position = 9 ) - default boolean showEggCount() + default boolean showTotalRewards() + { + return true; + } + + + /*///************///*/ + /*/// Attacker ///*/ + /*///************///*/ + + @ConfigItem( + keyName = "highlightArrows", + name = "Highlight called arrows", + description = "Highlights arrows called by your teammate", + position = 0, + group = "Attacker" + ) + default boolean highlightArrows() + { + return true; + } + + @ConfigItem( + keyName = "highlightArrowColor", + name = "Arrow color", + description = "Configures the color to highlight the called arrows", + position = 1, + group = "Attacker", + hidden = true, + unhide = "highlightArrows" + ) + default Color highlightArrowColor() + { + return Color.GREEN; + } + + @ConfigItem( + keyName = "removeIncorrectAttackStyles", + name = "Remove incorrect attack styles", + description = "Hides wrong attack styles for dragon claws and crystal halberd", + position = 2, + group = "Attacker" + ) + default boolean removeIncorrectAttackStyles() { return false; } @ConfigItem( - keyName = "showEggCountOverlay", - name = "Overlay of eggs counted", - description = "Display current egg count as collector", - position = 3 + keyName = "tagging", + name = "Enable tagging", + description = "Highlights the menu entry of an attacker/ranger that has not been tagged.", + position = 3, + group = "Attacker" ) - default boolean showEggCountOverlay() + default boolean tagging() { return false; } + + /*///************///*/ + /*/// Defender ///*/ + /*///************///*/ + @ConfigItem( - keyName = "showHpCountMessage", - name = "Show count of Hp healed as healer.", - description = "Display healed count as healer after each wave", - position = 4 + keyName = "highlightBait", + name = "Highlight called bait", + description = "Highlights bait called by your teammate", + position = 0, + group = "Defender" ) - default boolean showHpCount() + default boolean highlightBait() { - return false; + return true; + } + + @ConfigItem( + keyName = "highlightBaitColor", + name = "Bait color", + description = "Configures the color to highlight the called bait", + position = 1, + group = "Defender", + hidden = true, + unhide = "highlightBait" + ) + default Color highlightBaitColor() + { + return Color.GREEN; + } + + @ConfigItem( + keyName = "showDefTimer", + name = "Show defender tick timer", + description = "Shows the current cycle tick of runners", + position = 2, + group = "Defender" + ) + default boolean showDefTimer() + { + return true; + } + + @ConfigItem( + keyName = "deprioritizeBait", + name = "Deprioritize bait", + description = "Moves 'Take' menu option for all bait below 'Walk Here'", + position = 3, + group = "Defender" + ) + default boolean deprioritizeBait() + { + return true; + } + + @ConfigItem( + keyName = "removePenanceCave", + name = "Remove penance cave", + description = "Removes 'Block' menu option from penance cave", + position = 4, + group = "Defender" + ) + default boolean removePenanceCave() + { + return true; + } + + + /*///**********///*/ + /*/// Healer ///*/ + /*///**********///*/ + + @ConfigItem( + keyName = "highlightPoison", + name = "Highlight called poison", + description = "Highlights poison called by your teammate", + position = 0, + group = "Healer" + ) + default boolean highlightPoison() + { + return true; + } + + @ConfigItem( + keyName = "highlightPoisonColor", + name = "Poison color", + description = "Configures the color to highlight the called poison", + position = 1, + group = "Healer", + hidden = true, + unhide = "highlightPoison" + ) + default Color highlightPoisonColor() + { + return Color.GREEN; + } + + @ConfigItem( + keyName = "highlightNotification", + name = "Highlight incorrect notification", + description = "Highlights incorrect poison chat notification", + position = 2, + group = "Healer" + ) + default boolean highlightNotification() + { + return true; + } + + @ConfigItem( + keyName = "highlightNotificationColor", + name = "Notification color", + description = "Configures the color to highlight the notification text", + position = 3, + group = "Healer", + hidden = true, + unhide = "highlightNotification" + ) + default Color highlightNotificationColor() + { + return Color.RED; } @ConfigItem( keyName = "showHpCountOverlay", - name = "Overlay of Hp counted", - description = "Display current healed count as healer", - position = 5 + name = "Show number of hitpoints healed", + description = "Displays current number of hitpoints healed", + position = 4, + group = "Healer" ) default boolean showHpCountOverlay() + { + return true; + } + + @ConfigItem( + keyName = "showTeammateHealthbars", + name = "Show health bars", + description = "Displays a health bar where a teammate's remaining health is located", + position = 5, + group = "Healer" + ) + default boolean showTeammateHealthbars() + { + return true; + } + + @ConfigItem( + keyName = "healerCodes", + name = "Show healer codes", + description = "Overlay to show healer codes", + position = 6, + group = "Healer" + ) + default boolean healerCodes() { return false; } + @ConfigItem( + keyName = "healerMenuOption", + name = "Show healer menu options", + description = "Shows tick count in healer menu options", + position = 7, + group = "Healer" + ) + default boolean healerMenuOption() + { + return false; + } + + @ConfigItem( + keyName = "shiftOverstock", + name = "Enable shift overstock", + description = "Enables overstocking by pressing shift", + position = 8, + group = "Healer" + ) + default boolean shiftOverstock() + { + return true; + } + + @ConfigItem( + keyName = "controlHealer", + name = "Control Healer", + description = "Hold ctrl to put last healer clicked on top", + position = 9, + group = "Healer" + ) + default boolean controlHealer() + { + return true; + } + + + /*///*************///*/ + /*/// Collector ///*/ + /*///*************///*/ + + @ConfigItem( + keyName = "swapCollectorBag", + name = "Swap empty", + description = "Enables swapping of 'Look-in' and 'Empty' on the collector's bag", + position = 0, + group = "Collector" + ) + default boolean swapCollectorBag() + { + return true; + } + + @ConfigItem( + keyName = "swapDestroyEggs", + name = "Swap destroy", + description = "Enables swapping of 'Use' and 'Destroy' on collector eggs; this does not affect yellow/omega eggs", + position = 1, + group = "Collector" + ) + default boolean swapDestroyEggs() + { + return true; + } + @ConfigItem( keyName = "highlightCollectorEggs", name = "Highlight collector eggs", description = "Highlight called egg colors", - position = 6 + position = 2, + group = "Collector" ) default boolean highlightCollectorEggs() { - return false; + return true; } @ConfigItem( - keyName = "showTotalRewards", - name = "Summarize total reward points", - description = "Displays total eggs/healed hp and missed attacks/lost runners", - position = 7 + keyName = "deprioritizeIncorrectEggs", + name = "Deprioritize incorrect eggs", + description = "Moves 'Take' menu option for incorrect eggs below 'Walk Here'", + position = 3, + group = "Collector" ) - default boolean showTotalRewards() + default boolean deprioritizeIncorrectEggs() { - return false; + return true; } @ConfigItem( - keyName = "showSummaryOfPoints", - name = "Display summary of advanced points", - description = "Gives summary of advanced points breakdown in chat log", - position = 8 + keyName = "showEggCountOverlay", + name = "Show number of eggs collected", + description = "Displays current number of eggs collected", + position = 4, + group = "Collector" ) - default boolean showSummaryOfPoints() + default boolean showEggCountOverlay() { - return false; + return true; } - - @ConfigItem( - keyName = "wrongPoisonFoodTextColor", - name = "Change healer wrong poison pack color", - description = "Change healer wrong poison pack color", - position = 9 - ) - default Color wrongPoisonFoodTextColor() - { - return Color.BLACK; - } - - @ConfigItem( - keyName = "highlightItems", - name = "Highlight called poison/bait", - description = "Highlights the poison or bait that was called by your teammate", - position = 10 - ) - default boolean highlightItems() - { - return false; - } - - @ConfigItem( - keyName = "highlightColor", - name = "Highlight color", - description = "Configures the color to highlight the called poison/bait", - position = 11 - ) - default Color highlightColor() - { - return Color.GREEN; - } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultMenu.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultMenu.java new file mode 100644 index 0000000000..8f852846e4 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultMenu.java @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * 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.barbarianassault; + +import com.google.common.collect.Sets; +import lombok.Getter; +import lombok.Setter; +import net.runelite.client.menus.ComparableEntry; +import net.runelite.client.menus.MenuManager; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; + +class BarbarianAssaultMenu +{ + private final MenuManager menuManager; + private final BarbarianAssaultPlugin game; + private final BarbarianAssaultConfig config; + private final ArrayList tracker = new ArrayList<>(); + @Getter @Setter + private boolean hornUpdated = false; + @Getter @Setter + private boolean rebuildForced = false; + + @Inject + BarbarianAssaultMenu(MenuManager menuManager, BarbarianAssaultPlugin game, BarbarianAssaultConfig config) + { + this.menuManager = menuManager; + this.game = game; + this.config = config; + } + + private boolean isHornOptionHidden(String option) + { + if (game.isInGame() && game.getRole() != null && game.getRole().getTell(game.getLastCallText()).toLowerCase().equals(option)) + { + // This will force the menu to be rebuilt after the correct tell is found + // medic will be added to the menu if it wasn't there before + if (!hornUpdated) + { + rebuildForced = true; + } + hornUpdated = true; + return false; + } + return true; + } + + void clearHiddenMenus() + { + // Clears menus from MenuManager and tracker + for (Iterator iterator = tracker.iterator(); iterator.hasNext();) + { + menuManager.removeHiddenEntry(iterator.next()); + iterator.remove(); + } + } + + //TODO add omega egg use on? + void validateHiddenMenus(Role role) + { + clearHiddenMenus(); + + HashSet hiddenMenus = Sets.newHashSet(Menus.getMenus()); + HashSet conditionalMenus = Sets.newHashSet(Menus.getMenus()); + + // Any option left in this set will not be hidden + // Checking each option for the correct role prevents MenuManager from + // iterating over off role menu entry options that are not possible + conditionalMenus.removeIf(entry -> + { + switch (entry) + { + // Attacker role options + case TELL_BLUE_ATTACKER_HORN: + case TELL_GREEN_ATTACKER_HORN: + case TELL_RED_ATTACKER_HORN: + return ((role == Role.ATTACKER && isHornOptionHidden(entry.getOption())) || role == null) && config.removeIncorrectCalls(); + + case ATTACK_PENANCE_FIGHTER: + case ATTACK_PENANCE_RANGER: + case GET_SPIKES_PETRIFIED_MUSHROOM: + case TAKE_ATTACKER_ITEM_MACHINE: + return (role != Role.ATTACKER && role != null) && config.removeUnusedMenus(); + + + // Defender role Options + case TELL_MEAT_DEFENDER_HORN: + case TELL_TOFU_DEFENDER_HORN: + case TELL_WORMS_DEFENDER_HORN: + return ((role == Role.DEFENDER && isHornOptionHidden(entry.getOption())) || role == null) && config.removeIncorrectCalls(); + + case BLOCK_PENANCE_CAVE: + return ((role != Role.DEFENDER && role != null) && config.removeUnusedMenus()) + || (role == Role.DEFENDER && config.removePenanceCave()); + + case DUNK_LAVA_CRATER: + case FIX: + case STOCK_UP_DEFENDER_ITEM_MACHINE: + case TAKE_DEFENDER_ITEM_MACHINE: + case TAKE_HAMMER: + case TAKE_LOGS: + return (role != Role.DEFENDER && role != null) && config.removeUnusedMenus(); + + + // Collector role options + case TELL_ACCURATE_COLLECTOR_HORN: + case TELL_AGGRESSIVE_COLLECTOR_HORN: + case TELL_CONTROLLED_COLLECTOR_HORN: + case TELL_DEFENSIVE_COLLECTOR_HORN: + return ((role == Role.COLLECTOR && isHornOptionHidden(entry.getOption())) || role == null) && config.removeIncorrectCalls(); + + case CONVERT_COLLECTOR_CONVERTER: + case LOAD_EGG_HOPPER: + case TAKE_BLUE_EGG: + case TAKE_GREEN_EGG: + case TAKE_RED_EGG: + case TAKE_YELLOW_EGG: + return (role != Role.COLLECTOR && role != null) && config.removeUnusedMenus(); + + + // Healer role options + case TELL_CRACKERS_HEALER_HORN: + case TELL_TOFU_HEALER_HORN: + case TELL_WORMS_HEALER_HORN: + return ((role == Role.HEALER && isHornOptionHidden(entry.getOption())) || role == null) && config.removeIncorrectCalls(); + + case DUNK_POISON_CRATER: + case STOCK_UP_HEALER_ITEM_MACHINE: + case TAKE_HEALER_ITEM_MACHINE: + case TAKE_FROM_HEALER_SPRING: + case DRINK_FROM_HEALER_SPRING: + return (role != Role.HEALER && role != null) && config.removeUnusedMenus(); + + case USE_VIAL_GROUND: + case USE_VIAL_ITEM: + case USE_VIAL_NPC: + case USE_VIAL_WIDGET: + return role == Role.HEALER && config.removeUnusedMenus(); + + + // Any role options + case DROP_HORN: + case EXAMINE_HORN: + case USE_HORN: + return config.removeIncorrectCalls(); + + case MEDIC_HORN: + return config.removeIncorrectCalls() && !hornUpdated; + + default: + return config.removeUnusedMenus(); + } + }); + + hiddenMenus.removeAll(conditionalMenus); + + for (Menus entry : hiddenMenus) + { + menuManager.addHiddenEntry(entry.getEntry()); + tracker.add(entry.getEntry()); + } + } + + void enableSwaps() + { + if (config.swapLadder()) + { + menuManager.addSwap("climb-down", "ladder", "quick-start", "ladder"); + } + if (config.swapCollectorBag()) + { + menuManager.addSwap("look-in", "collection bag", "empty", "collection bag"); + } + if (config.swapDestroyEggs()) + { + menuManager.addSwap("use", "blue egg", "destroy", "blue egg"); + menuManager.addSwap("use", "green egg", "destroy", "green egg"); + menuManager.addSwap("use", "red egg", "destroy", "red egg"); + } + } + + void disableSwaps(boolean force) + { + if (!config.swapLadder() || force) + { + menuManager.removeSwap("climb-down", "ladder", "quick-start", "ladder"); + } + + if (!config.swapCollectorBag() || force) + { + menuManager.removeSwap("look-in", "collection bag", "empty", "collection bag"); + } + + if (!config.swapDestroyEggs() || force) + { + menuManager.removeSwap("use", "blue egg", "destroy", "blue egg"); + menuManager.removeSwap("use", "green egg", "destroy", "green egg"); + menuManager.removeSwap("use", "red egg", "destroy", "red egg"); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultOverlay.java deleted file mode 100644 index 98ab9da951..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultOverlay.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * 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.barbarianassault; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Polygon; -import java.awt.Rectangle; -import java.awt.Stroke; -import java.awt.image.BufferedImage; -import java.util.Map; -import javax.inject.Inject; -import lombok.Getter; -import lombok.Setter; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import net.runelite.api.Perspective; -import net.runelite.api.Player; -import net.runelite.api.Point; -import net.runelite.api.coords.LocalPoint; -import net.runelite.api.coords.WorldPoint; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetInfo; -import net.runelite.api.widgets.WidgetItem; -import net.runelite.client.game.ItemManager; -import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayLayer; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; -import net.runelite.client.ui.overlay.OverlayMenuEntry; -import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.OverlayUtil; -import net.runelite.client.util.ImageUtil; - - -class BarbarianAssaultOverlay extends Overlay -{ - private static final int MAX_EGG_DISTANCE = 2500; - private static final int HEALTH_BAR_HEIGHT = 20; - private final Color HEALTH_BAR_COLOR = new Color(225, 35, 0, 125); - private static final Color BACKGROUND = new Color(0, 0, 0, 150); - private static final int OFFSET_Z = 20; - - private final Client client; - private final ItemManager itemManager; - private final BarbarianAssaultPlugin plugin; - private final BarbarianAssaultConfig config; - - @Getter - @Setter - private Round currentRound; - - - @Inject - private BarbarianAssaultOverlay(Client client, ItemManager itemManager, BarbarianAssaultPlugin plugin, BarbarianAssaultConfig config) - { - super(plugin); - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_WIDGETS); - this.client = client; - this.itemManager = itemManager; - this.plugin = plugin; - this.config = config; - getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "B.A. overlay")); - } - - @Override - public Dimension render(Graphics2D graphics) - { - if (client.getGameState() != GameState.LOGGED_IN || currentRound == null) - { - return null; - } - - Role role = currentRound.getRoundRole(); - if (role == null) - { - return null; - } - - Widget roleText = client.getWidget(role.getRoleText()); - Widget roleSprite = client.getWidget(role.getRoleSprite()); - - if (config.showTimer() && roleText != null && roleSprite != null) - { - if (config.showEggCountOverlay() && role.equals(Role.COLLECTOR)) - { - roleText.setText(String.format("(%d) 00:%02d", plugin.getCollectedEggCount(), currentRound.getTimeToChange())); - } - else if (config.showHpCountOverlay() && role.equals(Role.HEALER)) - { - roleText.setText(String.format("(%d) 00:%02d", plugin.getHpHealed(), currentRound.getTimeToChange())); - } - else - { - roleText.setText(String.format("00:%02d", currentRound.getTimeToChange())); - } - Rectangle spriteBounds = roleSprite.getBounds(); - roleSprite.setHidden(true); - graphics.drawImage(plugin.getClockImage(), spriteBounds.x, spriteBounds.y, null); - } - - if (role == Role.COLLECTOR && config.highlightCollectorEggs()) - { - String heardCall = plugin.getCollectorHeardCall(); - Color highlightColor = BarbarianAssaultPlugin.getEggColor(heardCall); - Map calledEggMap = plugin.getCalledEggMap(); - Map yellowEggMap = plugin.getYellowEggs(); - - if (calledEggMap != null) - { - renderEggLocations(graphics, calledEggMap, highlightColor); - } - - // Always show yellow eggs - renderEggLocations(graphics, yellowEggMap, Color.YELLOW); - } - Widget inventory = client.getWidget(WidgetInfo.INVENTORY); - - if (config.highlightItems() && inventory != null && !inventory.isHidden() && ((role == Role.DEFENDER || role == Role.HEALER))) - { - int listenItemId = plugin.getListenItemId(role.getListen()); - - if (listenItemId != -1) - { - Color color = config.highlightColor(); - BufferedImage highlight = ImageUtil.fillImage(itemManager.getImage(listenItemId), new Color(color.getRed(), color.getGreen(), color.getBlue(), 150)); - - for (WidgetItem item : inventory.getWidgetItems()) - { - if (item.getId() == listenItemId) - { - OverlayUtil.renderImageLocation(graphics, item.getCanvasLocation(), highlight); - } - } - } - } - - if (role == Role.HEALER) - { - for (HealerTeam teammate : HealerTeam.values()) - { - Widget widget = client.getWidget(teammate.getTeammate()); - if (widget == null) - { - continue; - } - - String[] teammateHealth = widget.getText().split(" / "); - final int curHealth = Integer.parseInt(teammateHealth[0]); - final int maxHealth = Integer.parseInt(teammateHealth[1]); - - int width = teammate.getWidth(); - final int filledWidth = getBarWidth(maxHealth, curHealth, width); - - int offsetX = teammate.getOffset().getX(); - int offsetY = teammate.getOffset().getY(); - int x = widget.getCanvasLocation().getX() - offsetX; - int y = widget.getCanvasLocation().getY() - offsetY; - - graphics.setColor(HEALTH_BAR_COLOR); - graphics.fillRect(x, y, filledWidth, HEALTH_BAR_HEIGHT); - } - } - - return null; - } - - private static int getBarWidth(int base, int current, int size) - { - final double ratio = (double) current / base; - - if (ratio >= 1) - { - return size; - } - - return (int) Math.round(ratio * size); - } - - private void renderEggLocations(Graphics2D graphics, Map eggMap, Color color) - { - Player player = client.getLocalPlayer(); - - if (player == null) - { - return; - } - - final Stroke originalStroke = graphics.getStroke(); - - for (WorldPoint worldPoint : eggMap.keySet()) - { - LocalPoint groundPoint = LocalPoint.fromWorld(client, worldPoint); - - if (groundPoint == null) - { - continue; - } - if (player.getLocalLocation().distanceTo(groundPoint) > MAX_EGG_DISTANCE) - { - continue; - } - - Polygon poly = Perspective.getCanvasTilePoly(client, groundPoint); - - if (poly == null) - { - continue; - } - - int quantity = eggMap.get(worldPoint); - String quantityText = "x" + quantity; - Point textPoint = Perspective.getCanvasTextLocation(client, graphics, groundPoint, quantityText, OFFSET_Z); - graphics.setColor(color); - graphics.setStroke(new BasicStroke(2)); - graphics.drawPolygon(poly); - OverlayUtil.renderTextLocation(graphics, textPoint, quantityText, Color.WHITE); - } - - graphics.setStroke(originalStroke); - } -} \ No newline at end of file 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 bf2eb52807..3b05a96f77 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 @@ -1,5 +1,8 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, Cameron + * Copyright (c) 2018, Jacob M + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,108 +27,107 @@ */ package net.runelite.client.plugins.barbarianassault; +import com.google.common.collect.ImmutableList; import com.google.inject.Provides; -import java.awt.Color; + import java.awt.Font; -import java.awt.Image; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.time.Instant; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Objects; import javax.inject.Inject; -import lombok.AccessLevel; + import lombok.Getter; import lombok.extern.slf4j.Slf4j; + +import net.runelite.api.Actor; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.ItemID; import net.runelite.api.MenuEntry; import net.runelite.api.MessageNode; +import net.runelite.api.NPC; import net.runelite.api.Player; -import net.runelite.api.Tile; +import net.runelite.api.Prayer; +import net.runelite.api.Projectile; +import net.runelite.api.SoundEffectID; import net.runelite.api.Varbits; import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.BeforeRender; import net.runelite.api.events.ChatMessage; -import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.InteractingChanged; import net.runelite.api.events.ItemDespawned; import net.runelite.api.events.ItemSpawned; import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; +import net.runelite.api.events.ProjectileSpawned; import net.runelite.api.events.VarbitChanged; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.QueuedMessage; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.ItemManager; +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 net.runelite.client.plugins.PluginType; +import net.runelite.client.plugins.attackstyles.AttackStyle; +import net.runelite.client.plugins.attackstyles.WeaponType; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.ui.overlay.infobox.InfoBox; +import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; +import org.apache.commons.lang3.StringUtils; + @Slf4j - - @PluginDescriptor( - name = "Barbarian Assault+", + name = "Barbarian Assault", description = "Custom barbarian assault plugin, use along with BA Tools", tags = {"minigame", "overlay", "timer"}, type = PluginType.PVM // don't remove this, added this because our barbarian assault plugin is big time modified ) -public class BarbarianAssaultPlugin extends Plugin +public class BarbarianAssaultPlugin extends Plugin implements KeyListener { - private static final int BA_WAVE_NUM_INDEX = 2; - private static final String START_WAVE = "1"; private static final String ENDGAME_REWARD_NEEDLE_TEXT = "
5"; - @Getter - private int collectedEggCount = 0; + private static final int COLOR_CALL_UPDATED = 16316664; - @Getter - private int positiveEggCount = 0; + private static final int COLOR_CALL_CALLED = 16291864; - @Getter - private int wrongEggs = 0; + private static final int BA_WAVE_NUM_INDEX = 2; - @Getter - private int HpHealed = 0; - - @Getter - private int totalCollectedEggCount = 0; - - @Getter - private int totalHpHealed = 0; - - private boolean hasAnnounced; - private Font font; - private final Image clockImage = ImageUtil.getResourceStreamFromClass(getClass(), "clock.png"); - private int inGameBit = 0; - private String currentWave = START_WAVE; - private GameTimer gameTime; - - @Getter(AccessLevel.PACKAGE) - private final HashMap redEggs = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private final HashMap greenEggs = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private final HashMap blueEggs = new HashMap<>(); - - @Getter(AccessLevel.PACKAGE) - private final HashMap yellowEggs = new HashMap<>(); + private static final ImmutableList attackStyles = ImmutableList.of(WidgetInfo.COMBAT_STYLE_ONE, + WidgetInfo.COMBAT_STYLE_TWO, WidgetInfo.COMBAT_STYLE_THREE, WidgetInfo.COMBAT_STYLE_FOUR); @Inject - @Getter private Client client; + @Inject + private ClientThread clientThread; + @Inject private ChatMessageManager chatMessageManager; @@ -136,7 +138,110 @@ public class BarbarianAssaultPlugin extends Plugin private BarbarianAssaultConfig config; @Inject - private BarbarianAssaultOverlay overlay; + private AboveWidgetsOverlay widgetsOverlay; + + @Inject + private AboveSceneOverlay sceneOverlay; + + @Inject + private BarbarianAssaultMenu menu; + + @Inject + private ItemManager itemManager; + + @Inject + private InfoBoxManager infoBoxManager; + + @Inject + private KeyManager keyManager; + + @Getter + private boolean inGame = false; + + @Getter + private Wave wave = null; + + @Getter + private Role role = null; + + @Getter + private Scorecard scorecard = null; + + @Getter + private Timer gameTimer = null; + + @Getter + private Timer callTimer = null; + + @Getter + private int stage = -1; + + @Getter + private BufferedImage clockImage; + + @Getter + private Font font = null; + + @Getter + private final HashMap redEggs = new HashMap<>(); + + @Getter + private final HashMap greenEggs = new HashMap<>(); + + @Getter + private final HashMap blueEggs = new HashMap<>(); + + @Getter + private final HashMap yellowEggs = new HashMap<>(); + + @Getter + private final Map healers = new HashMap<>(); + + @Getter + private String lastCallText = null; + + @Getter + private String lastListenText = null; + + private String lastClickedTell = null; + + private int lastCallColor = -1; + + private int lastInteracted = -1; + + private int lastHealerPoisoned = -1; + + private int tickNum = 0; + + private int gameTick = -1; + + private int inGameBit = 0; + + private boolean syncd = true; + + private boolean tickReset = false; + + private boolean hornCalled = false; + + private boolean hornListened = false; + + @Getter + private boolean usingGloryHorn = false; + + private boolean shiftDown = false; + + private boolean controlDown = false; + + private BufferedImage torsoImage, fighterImage, healerImage, rangerImage, runnerImage; + + private ArrayList deathTimes = new ArrayList<>(); + + private HashMap projectiles = new HashMap<>(); + + private TimerBox tickCounter; + + private String poisonUsed = null; + @Provides BarbarianAssaultConfig provideConfig(ConfigManager configManager) @@ -144,37 +249,149 @@ public class BarbarianAssaultPlugin extends Plugin return configManager.getConfig(BarbarianAssaultConfig.class); } - private Game game; - private Wave wave; - @Override protected void startUp() throws Exception { - overlayManager.add(overlay); - font = FontManager.getRunescapeFont() - .deriveFont(Font.BOLD, 24); + font = FontManager.getRunescapeFont().deriveFont(Font.BOLD, 24); + torsoImage = itemManager.getImage(ItemID.FIGHTER_TORSO); + clockImage = ImageUtil.getResourceStreamFromClass(getClass(), "clock.png"); + fighterImage = ImageUtil.getResourceStreamFromClass(getClass(), "fighter.png"); + healerImage = ImageUtil.getResourceStreamFromClass(getClass(), "healer.png"); + rangerImage = ImageUtil.getResourceStreamFromClass(getClass(), "ranger.png"); + runnerImage = ImageUtil.getResourceStreamFromClass(getClass(), "runner.png"); + overlayManager.add(widgetsOverlay); + overlayManager.add(sceneOverlay); + keyManager.registerKeyListener(this); + if (client.getGameState() == GameState.LOGGED_IN) + { + clientThread.invoke(this::validateGame); + } } @Override protected void shutDown() throws Exception { - overlayManager.remove(overlay); - gameTime = null; - currentWave = START_WAVE; - inGameBit = 0; - collectedEggCount = 0; - positiveEggCount = 0; - wrongEggs = 0; - HpHealed = 0; - clearAllEggMaps(); + overlayManager.remove(widgetsOverlay); + overlayManager.remove(sceneOverlay); + keyManager.unregisterKeyListener(this); + showRoleSprite(); + font = null; + torsoImage = null; + clockImage = null; + fighterImage = null; + healerImage = null; + rangerImage = null; + runnerImage = null; + shiftDown = false; + controlDown = false; + resetWave(); + wave = null; + gameTick = client.getTickCount(); + menu.disableSwaps(true); + menu.clearHiddenMenus(); + } + + @Override + public void keyTyped(KeyEvent e) + { + } + + @Override + public void keyPressed(KeyEvent e) + { + if (e.getKeyCode() == KeyEvent.VK_SHIFT) + { + shiftDown = true; + } + + if (e.getKeyCode() == KeyEvent.VK_CONTROL) + { + controlDown = true; + } + } + + @Override + public void keyReleased(KeyEvent e) + { + if (e.getKeyCode() == KeyEvent.VK_SHIFT) + { + shiftDown = false; + } + + if (e.getKeyCode() == KeyEvent.VK_CONTROL) + { + controlDown = false; + } } @Subscribe - public void onGameStateChanged(final GameStateChanged event) + public void onConfigChanged(ConfigChanged configChanged) { - if (event.getGameState() == GameState.LOADING) + //not client thread be careful + if (!configChanged.getGroup().equals("barbarianAssault")) { - clearAllEggMaps(); + return; + } + + switch (configChanged.getKey()) + { + case "showTimer": + if (!config.showTimer()) + { + showRoleSprite(); + } + break; + + case "swapLadder": + case "swapCollectorBag": + case "swapDestroyEggs": + if (Boolean.valueOf(configChanged.getNewValue())) + { + menu.enableSwaps(); + } + else + { + menu.disableSwaps(false); + } + break; + + case "showDefTimer": + if (config.showDefTimer() && getRole() == Role.DEFENDER) + { + addTickTimer(); + } + else + { + removeTickTimer(); + } + break; + + case "showDeathTimes": + case "showDeathTimesMode": + if (config.showDeathTimes() + && (config.showDeathTimesMode() == DeathTimesMode.INFO_BOX + || config.showDeathTimesMode() == DeathTimesMode.BOTH)) + { + addAllDeathTimes(); + } + else + { + removeAllDeathTimes(false); + } + break; + + case "removePenanceCave": + case "removeUnusedMenus": + case "removeWrongPoison": + clientThread.invoke(() -> menu.validateHiddenMenus(getRole())); + break; + + case "removeIncorrectAttackStyles": + if (!config.removeIncorrectAttackStyles()) + { + clientThread.invoke(this::showAllStyles); + } + break; } } @@ -184,175 +401,162 @@ public class BarbarianAssaultPlugin extends Plugin switch (event.getGroupId()) { case WidgetID.BA_REWARD_GROUP_ID: - { + announceWaveTime(); + Widget rewardWidget = client.getWidget(WidgetInfo.BA_REWARD_TEXT); - Widget pointsWidget = client.getWidget(WidgetInfo.BA_RUNNERS_PASSED); - if (!rewardWidget.getText().contains(ENDGAME_REWARD_NEEDLE_TEXT) && pointsWidget != null - && !hasAnnounced && client.getVar(Varbits.IN_GAME_BA) == 0) + if (rewardWidget == null) { - wave = new Wave(client); - wave.setWaveAmounts(); - wave.setWavePoints(); - game.getWaves().add(wave); - if (config.showSummaryOfPoints()) - { - announceSomething(wave.getWaveSummary()); - } - } - if (config.waveTimes() && rewardWidget != null && rewardWidget.getText().contains(ENDGAME_REWARD_NEEDLE_TEXT) && gameTime != null) - { - announceTime("Game finished, duration: ", gameTime.getTime(false)); - gameTime = null; - if (config.showTotalRewards()) - { - announceSomething(game.getGameSummary()); - } + break; } - } - break; + Widget pointsWidget = client.getWidget(WidgetInfo.BA_REWARD_TEXT); + if (!rewardWidget.getText().contains(ENDGAME_REWARD_NEEDLE_TEXT)) + { + if (config.showTotalRewards() && pointsWidget != null) + { + // The wave will be null if the plugin is disabled mid game, but + // the wave points will still be accurate if it is re-enabled + if (wave == null) + { + wave = new Wave(client); + } + + wave.setAmounts(); + wave.setPoints(); + + announce(wave.getSummary()); + + // The scorecard will be null if the client is restart mid game + if (scorecard != null) + { + scorecard.addWave(wave); + } + } + } + else + { + announceGameTime(); + + if (config.showTotalRewards() && scorecard != null && scorecard.getNumberOfWaves() == 9) + { + announce(scorecard.getGameSummary()); + } + } + break; + case WidgetID.BA_ATTACKER_GROUP_ID: - { - setOverlayRound(Role.ATTACKER); + startWave(Role.ATTACKER); + menu.validateHiddenMenus(Role.ATTACKER); break; - } + case WidgetID.BA_DEFENDER_GROUP_ID: - { - setOverlayRound(Role.DEFENDER); + startWave(Role.DEFENDER); + menu.validateHiddenMenus(Role.DEFENDER); break; - } + case WidgetID.BA_HEALER_GROUP_ID: - { - setOverlayRound(Role.HEALER); + startWave(Role.HEALER); + menu.validateHiddenMenus(Role.HEALER); break; - } + case WidgetID.BA_COLLECTOR_GROUP_ID: - { - setOverlayRound(Role.COLLECTOR); + startWave(Role.COLLECTOR); + menu.validateHiddenMenus(Role.COLLECTOR); break; - } } } @Subscribe public void onChatMessage(ChatMessage chatMessage) { - if (chatMessage.getMessage().toLowerCase().contains("testing")) - { - ArrayList waves = new ArrayList<>(); - for (int i = 0; i < 1; i++) - { - Wave wave1 = new Wave(client); - int[] amounts = {4, 0, 30, 10, 1, 38}; - int[] points = {-3, -2, 6, -4, -8, -11}; - int[] otherPoints = {38, 35, 33, 30}; - wave1.setWaveAmounts(amounts); - wave1.setWavePoints(points, otherPoints); - waves.add(wave1); - announceSomething(wave1.getWaveSummary()); - } - Game game1 = new Game(client, waves); - announceSomething(game1.getGameSummary()); - } - if (chatMessage.getMessage().toLowerCase().startsWith("wave points")) - { - hasAnnounced = true; - } if (!chatMessage.getType().equals(ChatMessageType.GAMEMESSAGE)) { return; } - int inGame = client.getVar(Varbits.IN_GAME_BA); - if (inGameBit != inGame) + + final String message = chatMessage.getMessage(); + if (message.startsWith("---- Wave:")) { - return; - } - final String message = chatMessage.getMessage().toLowerCase(); - final MessageNode messageNode = chatMessage.getMessageNode(); - final String nodeValue = Text.removeTags(messageNode.getValue()); - String recolored = null; - if (chatMessage.getMessage().startsWith("---- Wave:")) - { - String[] tempMessage = chatMessage.getMessage().split(" "); - currentWave = tempMessage[BA_WAVE_NUM_INDEX]; - collectedEggCount = 0; - HpHealed = 0; - positiveEggCount = 0; - wrongEggs = 0; - if (currentWave.equals(START_WAVE)) + stage = Integer.parseInt(message.split(" ")[BA_WAVE_NUM_INDEX]); + if (stage == 1) { - gameTime = new GameTimer(); - totalHpHealed = 0; - totalCollectedEggCount = 0; - game = new Game(client); - } - else if (gameTime != null) - { - gameTime.setWaveStartTime(); + scorecard = new Scorecard(this); + gameTimer = new Timer(); } } - if (chatMessage.getMessage().contains("exploded")) + else if (isInGame()) { - wrongEggs++; - positiveEggCount--; - } - if (chatMessage.getMessage().contains("You healed")) - { - String[] tokens = message.split(" "); - if (Integer.parseInt(tokens[2]) > 0) + if (message.contains("exploded") && wave != null) { - int Hp = Integer.parseInt(tokens[2]); - HpHealed += Hp; + wave.setWrongEggs(wave.getWrongEggs() + 1); + wave.setPositiveEggCount(wave.getPositiveEggCount() - 1); } - } - - if (message.contains("the wrong type of poisoned food to use")) - { - recolored = ColorUtil.wrapWithColorTag(nodeValue, config.wrongPoisonFoodTextColor()); - } - if (recolored != null) - { - messageNode.setValue(recolored); - chatMessageManager.update(messageNode); - } - } - - @Subscribe - public void onVarbitChanged(VarbitChanged event) - { - int inGame = client.getVar(Varbits.IN_GAME_BA); - - if (inGameBit != inGame) - { - if (inGameBit == 1) + else if (message.contains("You healed") && wave != null) { - overlay.setCurrentRound(null); - - // Use an instance check to determine if this is exiting a game or a tutorial - // After exiting tutorials there is a small delay before changing IN_GAME_BA back to - // 0 whereas when in a real wave it changes while still in the instance. - if (config.waveTimes() && gameTime != null && client.isInInstancedRegion()) + String[] tokens = message.split(" "); + if (Integer.parseInt(tokens[2]) > 0) { - announceTime("Wave " + currentWave + " duration: ", gameTime.getTime(true)); + int health = Integer.parseInt(tokens[2]); + wave.setHpHealed(wave.getHpHealed() + health); } } - else + else if (message.contains("the wrong type of poisoned food to use") && config.highlightNotification()) { - hasAnnounced = false; + final MessageNode messageNode = chatMessage.getMessageNode(); + final String nodeValue = Text.removeTags(messageNode.getValue()); + messageNode.setValue(ColorUtil.wrapWithColorTag(nodeValue, config.highlightNotificationColor())); + chatMessageManager.update(messageNode); + } + else if (message.startsWith("All of the Penance")) + { + String[] tokens = message.split(" "); + + int time = wave == null ? -1 : (int)wave.getWaveTimer().getElapsedTime(); + + switch (tokens[4]) + { + case "Fighters": + addDeathTimes(new TimerBox(fighterImage, this, time)); + break; + + case "Healers": + addDeathTimes(new TimerBox(healerImage, this, time)); + break; + + case "Rangers": + addDeathTimes(new TimerBox(rangerImage, this, time)); + break; + + case "Runners": + addDeathTimes(new TimerBox(runnerImage, this, time)); + break; + } + + if (config.showDeathTimes() && wave != null + && (config.showDeathTimesMode() == DeathTimesMode.CHAT_BOX + || config.showDeathTimesMode() == DeathTimesMode.BOTH)) + { + final MessageNode node = chatMessage.getMessageNode(); + final String nodeValue = Text.removeTags(node.getValue()); + node.setValue(nodeValue + " (" + wave.getWaveTimer().getElapsedTime() + "s)"); + chatMessageManager.update(node); + } } } - - inGameBit = inGame; } @Subscribe public void onItemSpawned(ItemSpawned itemSpawned) { - int itemId = itemSpawned.getItem().getId(); - WorldPoint worldPoint = itemSpawned.getTile().getWorldLocation(); - HashMap eggMap = getEggMap(itemId); + if (!isInGame()) + { + return; + } + + HashMap eggMap = getEggMap(itemSpawned.getItem().getId()); if (eggMap != null) { + WorldPoint worldPoint = itemSpawned.getTile().getWorldLocation(); Integer existingQuantity = eggMap.putIfAbsent(worldPoint, 1); if (existingQuantity != null) { @@ -364,195 +568,909 @@ public class BarbarianAssaultPlugin extends Plugin @Subscribe public void onItemDespawned(ItemDespawned itemDespawned) { - int itemId = itemDespawned.getItem().getId(); - WorldPoint worldPoint = itemDespawned.getTile().getWorldLocation(); - HashMap eggMap = getEggMap(itemId); - - if (eggMap != null && eggMap.containsKey(worldPoint)) - { - int quantity = eggMap.get(worldPoint); - if (quantity > 1) - { - eggMap.put(worldPoint, quantity - 1); - } - else - { - eggMap.remove(worldPoint); - } - } - if (client.getVar(Varbits.IN_GAME_BA) == 0 || !isEgg(itemDespawned.getItem().getId())) + if (!isInGame()) { return; } - if (isUnderPlayer(itemDespawned.getTile())) + + int itemId = itemDespawned.getItem().getId(); + + if (!isItemEgg(itemId)) { - if (overlay.getCurrentRound().getRoundRole() == Role.COLLECTOR) + return; + } + + // If an egg despawns due to time and the collector is standing over it, + // a point will added as if the player picked it up + HashMap eggMap = getEggMap(itemId); + if (eggMap != null) + { + WorldPoint worldPoint = itemDespawned.getTile().getWorldLocation(); + if (eggMap.containsKey(worldPoint)) { - positiveEggCount++; - if (positiveEggCount > 60) + int quantity = eggMap.get(worldPoint); + + if (quantity > 1) { - positiveEggCount = 60; + eggMap.put(worldPoint, quantity - 1); } - collectedEggCount = positiveEggCount - wrongEggs; //true positive - negative egg count + else + { + eggMap.remove(worldPoint); + } + } + } + + if (getRole() == Role.COLLECTOR + && wave != null + && itemDespawned.getTile().getWorldLocation().equals(client.getLocalPlayer().getWorldLocation())) + { + wave.setPositiveEggCount(wave.getPositiveEggCount() + 1); + + if (wave.getPositiveEggCount() > 60) + { + wave.setPositiveEggCount(60); + } + + wave.setCollectedEggCount(wave.getPositiveEggCount() - wave.getWrongEggs()); + } + } + + @Subscribe + public void onGameTick(GameTick event) + { + // Keep in mind isInGame is delayed by a tick when a wave ends + if (!isInGame() || getRole() == null) + { + return; + } + + tickNum++; + + if (tickNum > 9 || tickReset) + { + tickNum = 0; + tickReset = false; + projectiles.entrySet().removeIf(projectile -> projectile.getValue().getRemainingCycles() < 1); + } + + if (tickCounter != null) + { + tickCounter.setCount(tickNum); + } + + if (config.prayerMetronome() && isAnyPrayerActive()) + { + for (int i = 0; i < config.prayerMetronomeVolume(); i++) + { + client.playSoundEffect(SoundEffectID.GE_INCREMENT_PLOP); } } } @Subscribe - public void onMenuEntryAdded(MenuEntryAdded event) + public void onNpcSpawned(NpcSpawned event) { - if (!config.highlightCollectorEggs()) - { - return; - } - if (overlay.getCurrentRound() == null) - { - return; - } - if (overlay.getCurrentRound().getRoundRole() != Role.COLLECTOR) + if (!isInGame()) { return; } - String calledEgg = getCollectorHeardCall(); - String target = event.getTarget(); - String option = event.getOption(); - String targetClean = target.substring(target.indexOf('>') + 1); - String optionClean = option.substring(option.indexOf('>') + 1); + NPC npc = event.getNpc(); - if ("Take".equals(optionClean)) + if (npc == null) { - Color highlightColor = null; + return; + } - if (calledEgg != null && calledEgg.startsWith(targetClean)) - { - highlightColor = getEggColor(targetClean); - } - else if ("Yellow egg".equals(targetClean)) - { - // Always show yellow egg - highlightColor = Color.YELLOW; - } + String name = event.getNpc().getName(); - if (highlightColor != null) + if (name.equals("Penance Healer")) + { + if (!healers.containsKey(npc.getIndex())) { - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry last = menuEntries[menuEntries.length - 1]; - last.setTarget(ColorUtil.prependColorTag(targetClean, highlightColor)); - client.setMenuEntries(menuEntries); + healers.put(npc.getIndex(), new Healer(npc, healers.size(), stage)); } } } - private void setOverlayRound(Role role) + @Subscribe + public void onNpcDespawned(NpcDespawned event) { - if (overlay.getCurrentRound() != null) + if (!isInGame()) { return; } - overlay.setCurrentRound(new Round(role)); + healers.remove(event.getNpc().getIndex()); } - private void announceSomething(final ChatMessageBuilder chatMessage) + + // So this is a mess, but it works and the horn of glory doesn't mess up anything. + // This was almost certainly a waste of time to get working, because almost nobody + // actually uses the horn of glory. At least now there shouldn't be anyone complaining + // about the horn of glory breaking anything and everything that should never break. + @Subscribe + public void onBeforeRender(BeforeRender event) { - chatMessageManager.queue(QueuedMessage.builder() - .type(ChatMessageType.CONSOLE) - .runeLiteFormattedMessage(chatMessage.build()) - .build()); - } - - String getCollectorHeardCall() - { - Widget widget = client.getWidget(WidgetInfo.BA_COLL_LISTEN_TEXT); - String call = null; - - if (widget != null) + if (!isInGame()) { - call = widget.getText(); + return; } - return call; - } + boolean rebuild = false; - Map getCalledEggMap() - { - Map map; - String calledEgg = getCollectorHeardCall(); - - if (calledEgg == null) + Widget callWidget = getRole() == null ? null : client.getWidget(getRole().getGloryCall()); + if (callWidget == null) { - return null; + callWidget = getRole() == null ? null : client.getWidget(getRole().getCall()); } - switch (calledEgg) - { - case "Red eggs": - map = redEggs; - break; - case "Green eggs": - map = greenEggs; - break; - case "Blue eggs": - map = blueEggs; - break; - default: - map = null; - } + String newCallText = getRole() == null ? lastCallText : getRole().getCall(client); + int newCallColor = callWidget == null ? lastCallColor : callWidget.getTextColor(); - return map; - } - - static Color getEggColor(String str) - { - Color color; - - if (str == null) + Widget listenWidget = getRole() == null ? null : client.getWidget(getRole().getGloryListen()); + if (listenWidget == null) { - return null; - } - - if (str.startsWith("Red")) - { - color = Color.RED; - } - else if (str.startsWith("Green")) - { - color = Color.GREEN; - } - else if (str.startsWith("Blue")) - { - color = Color.CYAN; - } - else if (str.startsWith("Yellow")) - { - color = Color.YELLOW; + listenWidget = getRole() == null ? null : client.getWidget(getRole().getListen()); + usingGloryHorn = false; } else { - color = null; + usingGloryHorn = true; } - return color; - } + String newListenText = getRole() == null ? lastListenText : getRole().getListen(client); - private HashMap getEggMap(int itemID) - { - switch (itemID) + if (!Objects.equals(newCallText, lastCallText)) { - case ItemID.RED_EGG: - return redEggs; - case ItemID.GREEN_EGG: - return greenEggs; - case ItemID.BLUE_EGG: - return blueEggs; - case ItemID.YELLOW_EGG: - return yellowEggs; - default: - return null; + rebuild = true; + lastCallText = newCallText; + callTimer = new Timer(); + tickReset = true; + hornCalled = false; + hornListened = false; + menu.setHornUpdated(false); + syncd = true; + + if (tickCounter != null) + { + tickCounter.setInSync(true); + } + } + + if (!Objects.equals(newListenText, lastListenText)) + { + if (newListenText != null && !newListenText.equals("- - -")) + { + hornListened = true; + rebuild = true; + } + else if (hornListened) + { + newListenText = lastListenText; + + // If the player uses the horn of glory, the listen text will be taken from there and set to the + // normal widget when the player exits the interface + if (listenWidget != null && !usingGloryHorn) + { + // Attacker has two widgets for it's listen text, the top widget is the one that is kept track of + if (getRole() == Role.ATTACKER) + { + listenWidget.setText(newListenText); + client.getWidget(WidgetInfo.BA_ATK_LISTEN_BOTTOM_TEXT).setText(Role.getMissingListen(newListenText)); + } + else + { + listenWidget.setText(newListenText); + } + + } + } + + lastListenText = newListenText; + } + + // Disabled for now, will need to also check either chat or verify a busy animation is not happening + /*if (newCallColor == COLOR_CALL_CALLED && !Objects.equals(lastClickedTell, lastCallText)) + { + hornCalled = false; + rebuild = true; + + if (callWidget != null) + { + callWidget.setTextColor(COLOR_CALL_UPDATED); + lastCallColor = COLOR_CALL_UPDATED; + } + } + + else if (newCallColor == COLOR_CALL_UPDATED && Objects.equals(lastClickedTell, lastCallText)) + { + hornCalled = true; + rebuild = true; + + if (callWidget != null) + { + callWidget.setTextColor(COLOR_CALL_CALLED); + lastCallColor = COLOR_CALL_CALLED; + } + }*/ + + // Horn of glory will switch text back to white color before call change + if (newCallColor != lastCallColor) + { + if (newCallColor == COLOR_CALL_CALLED) + { + hornCalled = true; + rebuild = true; + } + else if (hornCalled) + { + newCallColor = COLOR_CALL_CALLED; + if (callWidget != null) + { + callWidget.setTextColor(newCallColor); + } + } + + lastCallColor = newCallColor; + } + + if (rebuild || menu.isRebuildForced()) + { + menu.setRebuildForced(false); + menu.validateHiddenMenus(role); + } + + // This doesn't have to be done in BeforeRender. And although it is + // inefficient, it's only being done while in the instance. Will + // likely be changed in the future + if (getRole() == Role.ATTACKER && config.removeIncorrectAttackStyles()) + { + Widget weapon = client.getWidget(WidgetInfo.COMBAT_WEAPON); + + if (weapon != null) + { + if ((StringUtils.contains(weapon.getText(), "Crystal halberd") || StringUtils.contains(weapon.getText(), "Dragon claws")) + && newListenText != null && !newListenText.equals("- - -")) + { + int i = 0; + for (AttackStyle style : getAttackStyles()) + { + Widget attackStyle = client.getWidget(attackStyles.get(i)); + if (attackStyle != null && style != null) + { + if (StringUtils.startsWith(newListenText, style.getName())) + { + attackStyle.setHidden(false); + } + else + { + attackStyle.setHidden(true); + } + } + + i++; + } + } + else + { + showAllStyles(); + } + } } } + // onMenuEntryAdded is being used for conditional entry changes that are not + // easily achievable using MenuManager, all other changes use MenuManager in + // the BarbarianAssaultMenu/Menus classes + @Subscribe + public void onMenuEntryAdded(MenuEntryAdded event) + { + if (!isInGame()) + { + return; + } + + final List menu = new ArrayList<>(); + final List selected = new ArrayList<>(); + final List priority = new ArrayList<>(); + MenuEntry walk = null; + boolean prioritizeWalk = false; + + String listen = lastListenText != null ? StringUtils.remove(lastListenText, "Pois. ").toLowerCase() : ""; + + for (MenuEntry entry : client.getMenuEntries()) + { + String option = Text.removeTags(entry.getOption()).toLowerCase(); + String target = Text.removeTags(entry.getTarget()).toLowerCase(); + int identifier = entry.getIdentifier(); + + if (option.equals("walk here")) + { + walk = entry; + } + else + { + switch (getRole()) + { + case ATTACKER: + if (config.tagging() && option.equals("attack") && (target.startsWith("penance fighter") || target.startsWith("penance ranger"))) + { + String tag = StringUtils.substringBefore(entry.getTarget(), ")"); + + NPC[] npcs = client.getCachedNPCs(); + + if (identifier >= 0 && identifier < npcs.length) + { + NPC npc = npcs[identifier]; + if (npc != null) + { + Projectile projectile = projectiles.get(identifier); + if (npc.getInteracting() == null && projectile == null) + { + entry.setTarget((tag + ") (" + (10 - (tickNum + 1)) + ")").replace("", "")); + selected.add(entry); + continue; + } + // TODO add check to see if other attacker is attacking fighter/ranger + // Possibly just add it to a list when the projectile is spawned + // Also maybe add order by health option + else if (npc.getInteracting() == client.getLocalPlayer() || (projectile != null && projectile.getInteracting() == npc)) + { + entry.setTarget((tag + ") (" + (10 - (tickNum)) + ")").replace("", "")); + } + else + { + entry.setTarget((tag + ") (" + (10 - (tickNum)) + ")").replace("", "")); + } + } + } + } + break; + + case COLLECTOR: + // Take option for yellow eggs should always be the first option + if (option.equals("take") && target.equals("yellow egg")) + { + priority.add(entry); + continue; + } + else if (config.deprioritizeIncorrectEggs() + && option.equals("take") + && (target.equals("blue egg") || target.equals("green egg") || target.equals("red egg"))) + { + prioritizeWalk = true; + + if (listen.startsWith(target)) + { + selected.add(entry); + continue; + } + } + break; + + case DEFENDER: + // Take option for logs and hammer should always be the first option + if (option.equals("take") + && (target.equals("logs") || target.equals("hammer"))) + { + priority.add(entry); + continue; + } + else if (config.deprioritizeBait() + && option.equals("take") + && (target.equals("tofu") || target.equals("crackers") || target.equals("worms"))) + { + prioritizeWalk = true; + } + break; + + case HEALER: + if (config.healerMenuOption() && target.contains("penance healer") && healers.containsKey(identifier)) + { + String tag = StringUtils.substringBefore(entry.getTarget(), " ("); + int time = healers.get(identifier).timeToPoison(); + + if (time != -1) + { + entry.setTarget(tag + " (" + (healers.get(identifier).timeToPoison()) + ")"); + target = Text.removeTags(entry.getTarget()).toLowerCase(); + } + } + + if ((target.startsWith("poisoned meat ->") || target.startsWith("poisoned tofu ->") || target.startsWith("poisoned worms ->"))) + { + // Poison should only be used on healers + if (config.removeUnusedMenus() && !target.contains("penance healer")) + { + continue; + } + else if (config.controlHealer() && controlDown && identifier == lastHealerPoisoned && target.contains("penance healer")) + { + selected.add(entry); + continue; + } + } + else if (config.shiftOverstock() && target.equals("healer item machine") && shiftDown) + { + if (option.contains(listen)) + { + selected.add(entry); + continue; + } + } + else if (config.removeUnusedMenus()) + { + // Vials that are empty should only be used on spring + if (target.startsWith("healing vial ->") && !target.endsWith("healer spring")) + { + continue; + } + // Vials that are full should only be used on players + else if (target.startsWith("healing vial(4) ->")) + { + Player[] players = client.getCachedPlayers(); + + if (!(identifier >= 0 && identifier < players.length && players[identifier] != null)) + { + continue; + } + } + // Vials that are not full or empty can be used on either players or spring + else if (target.startsWith("healing vial(") && target.contains("->")) + { + Player[] players = client.getCachedPlayers(); + + if ((!(identifier >= 0 && identifier < players.length && players[identifier] != null)) + && !target.endsWith("healer spring")) + { + continue; + } + } + } + break; + } + } + + menu.add(entry); + } + + if (prioritizeWalk && walk != null) + { + menu.remove(walk); + menu.add(walk); + } + + if (!selected.isEmpty()) + { + menu.addAll(selected); + } + + if (!priority.isEmpty()) + { + menu.addAll(priority); + } + + client.setMenuEntries(menu.toArray(new MenuEntry[0])); + } + + @Subscribe + public void onMenuOptionClicked(MenuOptionClicked event) + { + if (!isInGame() && getRole() != null) + { + return; + } + + String target = Text.removeTags(event.getTarget()).toLowerCase(); + + if (getRole() == Role.HEALER) + { + if (target.startsWith("poisoned meat -> penance healer") + || target.startsWith("poisoned tofu -> penance healer") + || target.startsWith("poisoned worms -> penance healer")) + { + lastHealerPoisoned = event.getIdentifier(); + poisonUsed = StringUtils.substringBefore(target.replace("oned", "."), " ->"); + return; + } + } + + // INW + /* + String option = Text.removeTags(event.getMenuOption()); + if (option.startsWith("Tell-")) + { + lastClickedTell = getRole().getCallFromTell(option); + } + else if (usingGloryHorn && option.equals("Call")) + { + + } + */ + } + + // Interacting changed has a slight delay until after the hitsplat is applied + @Subscribe + public void onInteractingChanged(InteractingChanged event) + { + if (!isInGame() || getRole() != Role.HEALER) + { + return; + } + + Actor source = event.getSource(); + + if (source != client.getLocalPlayer()) + { + return; + } + + Actor opponent = event.getTarget(); + + if (opponent == null) + { + if (lastInteracted != -1) + { + if (StringUtils.equalsIgnoreCase(poisonUsed, getRole().getListen(client)) && healers.containsKey(lastInteracted)) + { + Healer healer = healers.get(lastInteracted); + healer.setFoodRemaining(healer.getFoodRemaining() - 1); + healer.setTimeLastPoisoned(Instant.now()); + } + } + + lastInteracted = -1; + poisonUsed = null; + } + else if (StringUtils.equals(opponent.getName(), "Penance Healer")) + { + lastInteracted = ((NPC)opponent).getIndex(); + } + + } + + @Subscribe + public void onProjectileSpawned(ProjectileSpawned event) + { + if (!isInGame()) + { + return; + } + + Actor target = event.getProjectile().getInteracting(); + if (target == null) + { + return; + } + + String name = target.getName(); + if ("Penance Fighter".equals(name) || "Penance Ranger".equals(name)) + { + projectiles.put(((NPC)target).getIndex(), event.getProjectile()); + } + } + + @Subscribe + public void onVarbitChanged(VarbitChanged event) + { + int newInGameBit = client.getVar(Varbits.IN_GAME_BA); + + if (inGameBit != newInGameBit) + { + if (newInGameBit == 0) + { + resetWave(); + callTimer = null; + hornCalled = false; + hornListened = false; + lastListenText = null; + lastCallText = null; + lastCallColor = -1; + lastClickedTell = null; + } + else + { + wave = new Wave(client); + } + + inGameBit = newInGameBit; + } + } + + private void resetWave() + { + inGame = false; + menu.setHornUpdated(false); + menu.setRebuildForced(false); + removeTickTimer(); + removeAllDeathTimes(true); + projectiles.clear(); + clearAllEggMaps(); + healers.clear(); + role = null; + lastInteracted = -1; + poisonUsed = null; + lastHealerPoisoned = -1; + tickNum = 0; + showAllStyles(); + usingGloryHorn = false; + menu.validateHiddenMenus(null); + } + + private void startWave(Role role) + { + inGame = true; + this.role = role; + + validateWidgets(); + } + + // Role widgets are not accurate if a player is using horn of glory + private void validateGame() + { + Role role = null; + + Widget inventory = client.getWidget(WidgetInfo.INVENTORY); + + if (inventory != null) + { + Collection items = inventory.getWidgetItems(); + + for (WidgetItem item : items) + { + int id = item.getId(); + if (id == ItemID.COLLECTOR_HORN) + { + role = Role.COLLECTOR; + } + else if (id == ItemID.DEFENDER_HORN) + { + role = Role.DEFENDER; + } + else if (id == ItemID.ATTACKER_HORN || id == ItemID.ATTACKER_HORN_10517 || id == ItemID.ATTACKER_HORN_10518 + || id == ItemID.ATTACKER_HORN_10519 || id == ItemID.ATTACKER_HORN_10520) + { + role = Role.ATTACKER; + } + else if (id == ItemID.HEALER_HORN || id == ItemID.HEALER_HORN_10527 || id == ItemID.HEALER_HORN_10528 + || id == ItemID.HEALER_HORN_10529 || id == ItemID.HEALER_HORN_10530) + { + role = Role.HEALER; + } + } + } + + if (role != null) + { + inGame = true; + this.role = role; + + inGameBit = 1; + + usingGloryHorn = client.getWidget(role.getGloryListen()) != null; + + Widget stage = client.getWidget(role.getWave()); + + if (stage != null) + { + this.stage = Integer.parseInt(StringUtils.substringAfter(stage.getText(), " ")); + } + + lastCallText = role.getCall(client); + lastListenText = role.getListen(client); + + if (callTimer != null && callTimer.getElapsedTime() > 30) + { + callTimer = null; + + } + + // TODO getTickCount() does not work as expected + // tickNum = (client.getTickCount() - gameTick) % 10; + + syncd = false; + + if (tickCounter != null) + { + tickCounter.setInSync(false); + } + + // If the horn is currently called, or if the call timer is still in sync + // the text will be updated to the last called color + Widget callWidget = getRole() == null ? null : client.getWidget(getRole().getGloryCall()); + if (callWidget == null) + { + callWidget = getRole() == null ? null : client.getWidget(getRole().getCall()); + } + + int newCallColor = callWidget == null ? lastCallColor : callWidget.getTextColor(); + + if (newCallColor == COLOR_CALL_CALLED) + { + lastCallColor = COLOR_CALL_CALLED; + lastClickedTell = lastCallText; + } + else if (callTimer == null) + { + lastCallColor = COLOR_CALL_UPDATED; + lastClickedTell = null; + } + + if (callWidget != null) + { + callWidget.setTextColor(lastCallColor); + } + } + else + { + inGameBit = 0; + } + + validateWidgets(); + + menu.enableSwaps(); + menu.validateHiddenMenus(getRole()); + } + + private void validateWidgets() + { + if (!config.showTimer()) + { + showRoleSprite(); + } + + if (config.showDefTimer() && getRole() == Role.DEFENDER) + { + addTickTimer(); + } + else + { + removeTickTimer(); + } + + if (config.showDeathTimes() + && (config.showDeathTimesMode() == DeathTimesMode.INFO_BOX + || config.showDeathTimesMode() == DeathTimesMode.BOTH)) + { + addAllDeathTimes(); + } + else + { + removeAllDeathTimes(false); + } + } + + private void showAllStyles() + { + for (WidgetInfo info : attackStyles) + { + Widget style = client.getWidget(info); + if (style != null) + { + style.setHidden(false); + } + } + } + + private void addTickTimer() + { + if (!isInGame() || tickCounter != null) + { + return; + } + + tickCounter = new TimerBox(torsoImage, this, tickNum); + + tickCounter.setInSync(syncd); + + tickCounter.setTooltipEnabled(true); + + removeAllDeathTimes(false); + + infoBoxManager.addInfoBox(tickCounter); + + addAllDeathTimes(); + } + + private void removeTickTimer() + { + if (tickCounter != null) + { + infoBoxManager.removeInfoBox(tickCounter); + tickCounter = null; + } + } + + private void addDeathTimes(TimerBox box) + { + if (!isInGame()) + { + return; + } + + deathTimes.add(box); + + if (config.showDeathTimes() && (config.showDeathTimesMode() == DeathTimesMode.INFO_BOX || config.showDeathTimesMode() == DeathTimesMode.BOTH)) + { + infoBoxManager.addInfoBox(box); + } + } + + private void addAllDeathTimes() + { + if (!isInGame()) + { + return; + } + + List boxes = infoBoxManager.getInfoBoxes(); + + for (TimerBox box : deathTimes) + { + if (!boxes.contains(box)) + { + infoBoxManager.addInfoBox(box); + } + } + } + + private void removeAllDeathTimes(boolean clear) + { + for (InfoBox box : infoBoxManager.getInfoBoxes().toArray(new InfoBox[0])) + { + if (box instanceof TimerBox && box.getImage() != torsoImage) + { + infoBoxManager.removeInfoBox(box); + } + } + if (clear) + { + deathTimes.clear(); + } + } + + private void showRoleSprite() + { + if (getRole() == null || !isInGame()) + { + return; + } + + Widget roleText = client.getWidget(role.getRoleText()); + Widget roleSprite = client.getWidget(role.getRoleSprite()); + + if (roleSprite != null) + { + roleSprite.setHidden(false); + } + if (roleText != null) + { + roleText.setText(getRole().name()); + } + } + + private AttackStyle[] getAttackStyles() + { + return WeaponType.getWeaponType(client.getVar(Varbits.EQUIPPED_WEAPON_TYPE)).getAttackStyles(); + } + + private void announceWaveTime() + { + if (config.waveTimes() && wave != null) + { + announceTime("Wave " + getStage() + " duration: ", wave.getWaveTimer().getElapsedTimeFormatted()); + } + } + + private void announceGameTime() + { + if (config.waveTimes() && gameTimer != null) + { + announceTime("Game finished, duration: ", gameTimer.getElapsedTimeFormatted()); + } + } private void announceTime(String preText, String time) { @@ -569,21 +1487,17 @@ public class BarbarianAssaultPlugin extends Plugin .build()); } - private boolean isEgg(int itemID) + private void announce(final ChatMessageBuilder chatMessage) { - return itemID == ItemID.RED_EGG || itemID == ItemID.GREEN_EGG - || itemID == ItemID.BLUE_EGG || itemID == ItemID.YELLOW_EGG; + chatMessageManager.queue(QueuedMessage.builder() + .type(ChatMessageType.CONSOLE) + .runeLiteFormattedMessage(chatMessage.build()) + .build()); } - private boolean isUnderPlayer(Tile tile) + long getTimeToChange() { - Player local = client.getLocalPlayer(); - if (local == null) - { - return false; - } - - return (tile.getWorldLocation().equals(local.getWorldLocation())); + return 30 - callTimer.getElapsedTime(); } private void clearAllEggMaps() @@ -594,39 +1508,44 @@ public class BarbarianAssaultPlugin extends Plugin yellowEggs.clear(); } - public Font getFont() + private HashMap getEggMap(int itemID) { - return font; - } - - Image getClockImage() - { - return clockImage; - } - - int getListenItemId(WidgetInfo listenInfo) - { - Widget listenWidget = client.getWidget(listenInfo); - - if (listenWidget != null) + switch (itemID) { - switch (listenWidget.getText()) + case ItemID.RED_EGG: + return redEggs; + + case ItemID.GREEN_EGG: + return greenEggs; + + case ItemID.BLUE_EGG: + return blueEggs; + + case ItemID.YELLOW_EGG: + return yellowEggs; + } + + return null; + } + + private boolean isItemEgg(int itemId) + { + return itemId == ItemID.RED_EGG || + itemId == ItemID.GREEN_EGG || + itemId == ItemID.BLUE_EGG || + itemId == ItemID.YELLOW_EGG; + } + + private boolean isAnyPrayerActive() + { + for (Prayer pray : Prayer.values()) + { + if (client.isPrayerActive(pray)) { - case "Tofu": - return ItemID.TOFU; - case "Crackers": - return ItemID.CRACKERS; - case "Worms": - return ItemID.WORMS; - case "Pois. Worms": - return ItemID.POISONED_WORMS; - case "Pois. Tofu": - return ItemID.POISONED_TOFU; - case "Pois. Meat": - return ItemID.POISONED_MEAT; + return true; } } - return -1; + return false; } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Calls.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Calls.java deleted file mode 100644 index 5cba373d95..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Calls.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * 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.barbarianassault; - -import java.util.HashMap; -import java.util.Map; - -public enum Calls -{ //Attacker Calls - RED_EGG("Red egg", "Tell-red"), - GREEN_EGG("Green egg", "Tell-green"), - BLUE_EGG("Blue egg", "Tell-blue"), - //Collector Calls - CONTROLLED("Controlled/Bullet/Wind", "Tell-controlled"), - ACCURATE("Accurate/Field/Water", "Tell-accurate"), - AGGRESSIVE("Aggressive/Blunt/Earth", "Tell-aggressive"), - DEFENSIVE("Defensive/Barbed/Fire", "Tell-defensive"), - //Healer Calls - TOFU("Tofu", "Tell-tofu"), - CRACKERS("Crackers", "Tell-crackers"), - WORMS("Worms", "Tell-worms"), - //Defender Calls - POIS_WORMS("Pois. Worms", "Tell-worms"), - POIS_TOFU("Pois. Tofu", "Tell-tofu"), - POIS_MEAT("Pois. Meat", "Tell-meat"); - - private final String call; - private final String option; - - private static final Map CALL_MENU = new HashMap<>(); - - static - { - for (Calls s : values()) - { - CALL_MENU.put(s.getCall(), s.getOption()); - } - } - - Calls(String call, String option) - { - this.call = call; - this.option = option; - } - - public String getCall() - { - return call; - } - - public String getOption() - { - return option; - } - - public static String getOption(String call) - { - return CALL_MENU.get(call); - } - -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/FontStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/DeathTimesMode.java similarity index 78% rename from runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/FontStyle.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/DeathTimesMode.java index cf826093d7..4083ce8ba4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/FontStyle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/DeathTimesMode.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2019, ganom + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,6 +11,7 @@ * 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 @@ -21,26 +23,25 @@ * (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.ticktimers; +package net.runelite.client.plugins.barbarianassault; -import java.awt.Font; -import lombok.AllArgsConstructor; -import lombok.Getter; -@Getter -@AllArgsConstructor -public enum FontStyle +public enum DeathTimesMode { - BOLD("Bold", Font.BOLD), - ITALIC("Italic", Font.ITALIC), - PLAIN("Plain", Font.PLAIN); + BOTH("Both"), + CHAT_BOX("Chat Box"), + INFO_BOX("Info Box"); - private String name; - private int font; + private final String name; + + DeathTimesMode(String name) + { + this.name = name; + } @Override public String toString() { - return getName(); + return name; } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Healer.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Healer.java new file mode 100644 index 0000000000..8a2154889c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Healer.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * 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.barbarianassault; + +import com.google.common.collect.ImmutableList; +import lombok.AccessLevel; +import lombok.Data; +import lombok.Getter; +import net.runelite.api.NPC; + +import java.time.Duration; +import java.time.Instant; +import java.util.List; + + +@Data +class Healer +{ + @Getter(AccessLevel.NONE) + private static final List> CODES = ImmutableList.of( + // ImmutableList.of(firstCallFood, secondCallFood, lastFoodTime), + ImmutableList.of(new int[]{1, 1}, new int[]{0, 0}, new int[]{0, 0}), + ImmutableList.of(new int[]{1, 1, 2}, new int[]{0, 0, 0}, new int[]{0, 0, 21}), + ImmutableList.of(new int[]{1, 6, 2}, new int[]{0, 0, 0}, new int[]{0, 0, 0}), + ImmutableList.of(new int[]{2, 5, 2, 0}, new int[]{0, 0, 7, 10}, new int[]{0, 0, 0, 0}), + ImmutableList.of(new int[]{2, 5, 2, 3, 0}, new int[]{0, 0, 0, 0, 7}, new int[]{0, 0, 21, 30, 0}), + ImmutableList.of(new int[]{3, 5, 2, 2, 0, 0}, new int[]{0, 0, 0, 2, 9, 10}, new int[]{12, 18, 21, 0, 0, 0}), + ImmutableList.of(new int[]{3, 7, 1, 1, 0, 0, 0}, new int[]{2, 0, 1, 1, 2, 4, 10}, new int[]{0, 21, 0, 0, 30, 45, 0}), + ImmutableList.of(new int[]{1, 9, 1, 1, 0, 0, 0}, new int[]{1, 0, 1, 1, 2, 2, 10}, new int[]{0, 0, 0, 0, 33, 42, 0}), + ImmutableList.of(new int[]{2, 8, 1, 1, 0, 0, 0, 0}, new int[]{1, 0, 1, 1, 2, 1, 1, 10}, new int[]{0, 21, 0, 0, 0, 0, 0, 0, 0}), + ImmutableList.of(new int[]{2, 5, 1, 1, 0, 0, 0}, new int[]{1, 0, 1, 1, 4, 4, 8}, new int[]{21, 33, 0, 33, 30, 45, 0})); + + private final NPC npc; + + private int wave; + + private int spawnNumber; + + private int foodRemaining; + + private int lastFoodTime; + + private int firstCallFood; + + private int secondCallFood; + + private Instant timeLastPoisoned = null; + + Healer(NPC npc, int spawnNumber, int wave) + { + this.npc = npc; + this.wave = wave; + this.spawnNumber = spawnNumber; + List code = CODES.get(wave - 1); + this.firstCallFood = code.get(0)[spawnNumber]; + this.secondCallFood = code.get(1)[spawnNumber]; + this.lastFoodTime = code.get(2)[spawnNumber]; + this.foodRemaining = firstCallFood + secondCallFood; + } + + int timeToPoison() + { + if (timeLastPoisoned == null) + { + return -1; + } + else + { + long time = Duration.between(timeLastPoisoned, Instant.now()).getSeconds(); + return time > 20 ? 0 : (int)(20 - time); + } + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Menus.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Menus.java new file mode 100644 index 0000000000..4f18e25578 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Menus.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us + * 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.barbarianassault; + +import com.google.common.collect.ImmutableSet; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.MenuAction; +import net.runelite.client.menus.ComparableEntry; + +@AllArgsConstructor +public enum Menus +{ + ATTACK_PENANCE_FIGHTER(Role.ATTACKER, new ComparableEntry("attack", "penance fighter", -1, -1, true, false)), + ATTACK_PENANCE_RANGER(Role.ATTACKER, new ComparableEntry("attack", "penance ranger", -1, -1, true, false)), + GET_SPIKES_PETRIFIED_MUSHROOM(Role.ATTACKER, new ComparableEntry("get-spikes", "petrified mushroom", -1, -1, true, true)), + TAKE_ATTACKER_ITEM_MACHINE(Role.ATTACKER, new ComparableEntry("take", "attacker item machine", -1, -1, false, true)), + TELL_RED_ATTACKER_HORN(Role.ATTACKER, new ComparableEntry("tell-red", "attacker horn", -1, -1, true, true)), + TELL_GREEN_ATTACKER_HORN(Role.ATTACKER, new ComparableEntry("tell-green", "attacker horn", -1, -1, true, true)), + TELL_BLUE_ATTACKER_HORN(Role.ATTACKER, new ComparableEntry("tell-blue", "attacker horn", -1, -1, true, true)), + + BLOCK_PENANCE_CAVE(Role.DEFENDER, new ComparableEntry("block", "penance cave", -1, -1, true, true)), + DUNK_LAVA_CRATER(Role.DEFENDER, new ComparableEntry("dunk", "lava crater", -1, -1, true, true)), + FIX(Role.DEFENDER, new ComparableEntry("fix", "", -1, -1, true, false)), + STOCK_UP_DEFENDER_ITEM_MACHINE(Role.DEFENDER, new ComparableEntry("stock-up", "defender item machine", -1, -1, true, true)), + TAKE_DEFENDER_ITEM_MACHINE(Role.DEFENDER, new ComparableEntry("take", "defender item machine", -1, -1, false, true)), + TAKE_HAMMER(Role.DEFENDER, new ComparableEntry("take", "hammer", -1, -1, true, true)), + TAKE_LOGS(Role.DEFENDER, new ComparableEntry("take", "logs", -1, -1, true, true)), + TELL_WORMS_DEFENDER_HORN(Role.DEFENDER, new ComparableEntry("tell-worms", "defender horn", -1, -1, true, true)), + TELL_TOFU_DEFENDER_HORN(Role.DEFENDER, new ComparableEntry("tell-tofu", "defender horn", -1, -1, true, true)), + TELL_MEAT_DEFENDER_HORN(Role.DEFENDER, new ComparableEntry("tell-meat", "defender horn", -1, -1, true, true)), + + DRINK_FROM_HEALER_SPRING(Role.HEALER, new ComparableEntry("drink-from", "healer spring", -1, -1, true, true)), + DUNK_POISON_CRATER(Role.HEALER, new ComparableEntry("dunk", "poison crater", -1, -1, true, true)), + STOCK_UP_HEALER_ITEM_MACHINE(Role.HEALER, new ComparableEntry("stock-up", "healer item machine", -1, -1, true, true)), + TAKE_HEALER_ITEM_MACHINE(Role.HEALER, new ComparableEntry("take", "healer item machine", -1, -1, false, true)), + TAKE_FROM_HEALER_SPRING(Role.HEALER, new ComparableEntry("take-from", "healer spring", -1, -1, true, true)), + TELL_TOFU_HEALER_HORN(Role.HEALER, new ComparableEntry("tell-tofu", "healer horn", -1, -1, true, true)), + TELL_CRACKERS_HEALER_HORN(Role.HEALER, new ComparableEntry("tell-crackers", "healer horn", -1, -1, true, true)), + TELL_WORMS_HEALER_HORN(Role.HEALER, new ComparableEntry("tell-worms", "healer horn", -1, -1, true, true)), + USE_VIAL_GROUND(Role.HEALER, new ComparableEntry("use", "healing vial", -1, MenuAction.ITEM_USE_ON_GROUND_ITEM.getId(), true, false)), + USE_VIAL_ITEM(Role.HEALER, new ComparableEntry("use", "healing vial", -1, MenuAction.ITEM_USE_ON_WIDGET_ITEM.getId(), true, false)), + USE_VIAL_NPC(Role.HEALER, new ComparableEntry("use", "healing vial", -1, MenuAction.ITEM_USE_ON_NPC.getId(), true, false)), + USE_VIAL_WIDGET(Role.HEALER, new ComparableEntry("use", "healing vial", -1, MenuAction.ITEM_USE_ON_WIDGET.getId(), true, false)), + + CONVERT_COLLECTOR_CONVERTER(Role.COLLECTOR, new ComparableEntry("convert", "collector converter", -1, -1, true, true)), + LOAD_EGG_HOPPER(Role.COLLECTOR, new ComparableEntry("load", "egg hopper", -1, -1, true, true)), + TAKE_BLUE_EGG(Role.COLLECTOR, new ComparableEntry("take", "blue egg", -1, -1, true, true)), + TAKE_GREEN_EGG(Role.COLLECTOR, new ComparableEntry("take", "green egg", -1, -1, true, true)), + TAKE_RED_EGG(Role.COLLECTOR, new ComparableEntry("take", "red egg", -1, -1, true, true)), + TAKE_YELLOW_EGG(Role.COLLECTOR, new ComparableEntry("take", "yellow egg", -1, -1, true, true)), + TELL_CONTROLLED_COLLECTOR_HORN(Role.COLLECTOR, new ComparableEntry("tell-controlled", "collector horn", -1, -1, true, true)), + TELL_ACCURATE_COLLECTOR_HORN(Role.COLLECTOR, new ComparableEntry("tell-accurate", "collector horn", -1, -1, true, true)), + TELL_AGGRESSIVE_COLLECTOR_HORN(Role.COLLECTOR, new ComparableEntry("tell-aggressive", "collector horn", -1, -1, true, true)), + TELL_DEFENSIVE_COLLECTOR_HORN(Role.COLLECTOR, new ComparableEntry("tell-defensive", "collector horn", -1, -1, true, true)), + + ATTACK_PENANCE_QUEEN(null, new ComparableEntry("attack", "penance queen", -1, -1, true, false)), + ATTACK_QUEEN_SPAWN(null, new ComparableEntry("attack", "queen spawn", -1, -1, true, false)), + DROP_HORN(null, new ComparableEntry("drop", "horn", -1, -1, true, false)), + EXAMINE_HORN(null, new ComparableEntry("examine", "horn", -1, -1, true, false)), + LIGHT_LOGS(null, new ComparableEntry("light", "logs", -1, -1, true, true)), + MEDIC_HORN(null, new ComparableEntry("medic", "horn", -1, -1, true, false)), + USE_HORN(null, new ComparableEntry("use", "horn", -1, -1, true, false)); + + @Getter + private final Role role; + + @Getter + private final ComparableEntry entry; + + private static final ImmutableSet ALL = ImmutableSet.copyOf(Menus.values()); + + public String getOption() + { + return entry.getOption(); + } + + public String getTarget() + { + return entry.getTarget(); + } + + public int getId() + { + return entry.getId(); + } + + public int getType() + { + return entry.getType(); + } + + public boolean isStrictOption() + { + return entry.isStrictOption(); + } + + public boolean isStrictTarget() + { + return entry.isStrictTarget(); + } + + public static ImmutableSet getMenus() + { + return ALL; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java index 8bc864b4a2..3b3260f559 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Role.java @@ -1,5 +1,7 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, Cameron + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,39 +26,211 @@ */ package net.runelite.client.plugins.barbarianassault; +import com.google.common.collect.ImmutableMap; +import lombok.AllArgsConstructor; import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.ItemID; +import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; + +@AllArgsConstructor enum Role { - ATTACKER(WidgetInfo.BA_ATK_LISTEN_TEXT, WidgetInfo.BA_ATK_CALL_TEXT, WidgetInfo.BA_ATK_ROLE_TEXT, WidgetInfo.BA_ATK_ROLE_SPRITE), - DEFENDER(WidgetInfo.BA_DEF_LISTEN_TEXT, WidgetInfo.BA_DEF_CALL_TEXT, WidgetInfo.BA_DEF_ROLE_TEXT, WidgetInfo.BA_DEF_ROLE_SPRITE), - COLLECTOR(WidgetInfo.BA_COLL_LISTEN_TEXT, WidgetInfo.BA_COLL_CALL_TEXT, WidgetInfo.BA_COLL_ROLE_TEXT, WidgetInfo.BA_COLL_ROLE_SPRITE), - HEALER(WidgetInfo.BA_HEAL_LISTEN_TEXT, WidgetInfo.BA_HEAL_CALL_TEXT, WidgetInfo.BA_HEAL_ROLE_TEXT, WidgetInfo.BA_HEAL_ROLE_SPRITE); + ATTACKER(WidgetInfo.BA_ATK_WAVE_TEXT, WidgetInfo.BA_ATK_LISTEN_TOP_TEXT, WidgetInfo.BA_ATK_HORN_LISTEN_TEXT, + WidgetInfo.BA_ATK_CALL_TEXT, WidgetInfo.BA_COLL_HORN_LISTEN_TEXT, WidgetInfo.BA_ATK_ROLE_TEXT, + WidgetInfo.BA_ATK_ROLE_SPRITE), + DEFENDER(WidgetInfo.BA_DEF_WAVE_TEXT, WidgetInfo.BA_DEF_LISTEN_TEXT, WidgetInfo.BA_DEF_HORN_LISTEN_TEXT, + WidgetInfo.BA_DEF_CALL_TEXT, WidgetInfo.BA_HEAL_HORN_LISTEN_TEXT, WidgetInfo.BA_DEF_ROLE_TEXT, + WidgetInfo.BA_DEF_ROLE_SPRITE), + COLLECTOR(WidgetInfo.BA_COLL_WAVE_TEXT, WidgetInfo.BA_COLL_LISTEN_TEXT, WidgetInfo.BA_COLL_HORN_LISTEN_TEXT, + WidgetInfo.BA_COLL_CALL_TEXT, WidgetInfo.BA_ATK_HORN_LISTEN_TEXT, WidgetInfo.BA_COLL_ROLE_TEXT, + WidgetInfo.BA_COLL_ROLE_SPRITE), + HEALER(WidgetInfo.BA_HEAL_WAVE_TEXT, WidgetInfo.BA_HEAL_LISTEN_TEXT, WidgetInfo.BA_DEF_HORN_LISTEN_TEXT, + WidgetInfo.BA_HEAL_CALL_TEXT, WidgetInfo.BA_DEF_HORN_LISTEN_TEXT, WidgetInfo.BA_HEAL_ROLE_TEXT, + WidgetInfo.BA_HEAL_ROLE_SPRITE); + @Getter + private final WidgetInfo wave; @Getter private final WidgetInfo listen; - + @Getter + private final WidgetInfo gloryListen; @Getter private final WidgetInfo call; - + @Getter + private final WidgetInfo gloryCall; @Getter private final WidgetInfo roleText; - @Getter private final WidgetInfo roleSprite; - Role(WidgetInfo listen, WidgetInfo call, WidgetInfo role, WidgetInfo roleSprite) + // Duplicate* entries are to catch instances where the horn of glory has + // text different than the normal horn + private static final ImmutableMap TELLS = ImmutableMap.builder() + .put("Red egg", "Tell-red") + .put("Green egg", "Tell-green") + .put("Blue egg", "Tell-blue") + .put("Controlled/Bullet/Wind", "Tell-controlled") + .put("Accurate/Field/Water", "Tell-accurate") + .put("Aggressive/Blunt/Earth", "Tell-aggressive") + .put("Defensive/Barbed/Fire", "Tell-defensive") + .put("Tofu", "Tell-tofu") + .put("Crackers", "Tell-crackers") + .put("Worms", "Tell-worms") + .put("Poison Worms", "Tell-worms") + .put("Pois. Worms", "Tell-worms") + .put("Poison Tofu", "Tell-tofu") + .put("Pois. Tofu", "Tell-tofu") + .put("Poison Meat", "Tell-meat") + .put("Pois. Meat", "Tell-meat") + .build(); + private static final ImmutableMap GLORY_CALLS = ImmutableMap.builder() + .put("Controlled/Bullet/Wind", "Controlled/") + .put("Accurate/Field/Water", "Accurate/") + .put("Aggressive/Blunt/Earth", "Aggressive/") + .put("Defensive/Barbed/Fire", "Defensive/") + .put("Tofu", "Tofu") + .put("Crackers", "Crackers") + .put("Worms", "Worms") + .put("Poison worms", "Pois. Worms") + .put("Poison tofu", "Pois. Tofu") + .put("Poison meat", "Pois. Meat") + .put("Red egg", "Red egg") + .put("Green egg", "Green egg") + .put("Blue egg", "Blue egg") + .build(); + private static final ImmutableMap ITEMS = ImmutableMap.builder() + .put("Tofu", ItemID.TOFU) + .put("Crackers", ItemID.CRACKERS) + .put("Worms", ItemID.WORMS) + .put("Pois. Worms", ItemID.POISONED_WORMS) + .put("Pois. Tofu", ItemID.POISONED_TOFU) + .put("Pois. Meat", ItemID.POISONED_MEAT) + .put("Defensive/", ItemID.BARBED_ARROW) + .put("Aggressive/", ItemID.BLUNT_ARROW) + .put("Accurate/", ItemID.FIELD_ARROW) + .put("Controlled/", ItemID.BULLET_ARROW) + .build(); + private static final ImmutableMap SPLIT_LISTENS = ImmutableMap.builder() + .put("Controlled/", "Bullet/Wind") + .put("Bullet/Wind", "Controlled/") + .put("Accurate/", "Field/Water") + .put("Field/Water", "Accurate/") + .put("Aggressive/", "Blunt/Earth") + .put("Blunt/Earth", "Aggressive/") + .put("Defensive/", "Barbed/Fire") + .put("Barbed/Fire", "Defensive/") + .build(); + + + int getListenItem(String listen) { - this.listen = listen; - this.call = call; - this.roleText = role; - this.roleSprite = roleSprite; + return ITEMS.getOrDefault(listen, -1); } - @Override - public String toString() + String getTell(String call) { - return name(); + return TELLS.getOrDefault(call, ""); } -} \ No newline at end of file + + String getCall(Client client) + { + // Do not reverse these if statements to be more efficient + // The normal widgets are no longer null/hidden after you + // click one time in the horn, and the values are incorrect + Widget callWidget = client.getWidget(getGloryCall()); + if (callWidget != null) + { + return GLORY_CALLS.get(callWidget.getText()); + } + + callWidget = client.getWidget(getCall()); + if (callWidget != null) + { + return callWidget.getText(); + } + + return null; + } + + String getListen(Client client) + { + // See the comment in getCall(Client client), before editing + Widget listenWidget = client.getWidget(getGloryListen()); + if (listenWidget != null) + { + return GLORY_CALLS.get(listenWidget.getText()); + } + + listenWidget = client.getWidget(getListen()); + if (listenWidget != null) + { + return listenWidget.getText(); + } + + return null; + } + + static String getMissingListen(String listen) + { + return SPLIT_LISTENS.getOrDefault(listen, "- - -"); + } + + // I call it "Switchception" :wutwedoin: + // Should probably switch to using an interface instead of an enum at this point + String getCallFromTell(String listen) + { + switch (this) + { + case COLLECTOR: + switch (listen) + { + case "Tell-controlled": + return "Controlled/"; + case "Tell-accurate": + return "Accurate/"; + case "Tell-aggressive": + return "Aggressive/"; + case "Tell-defensive": + return "Defensive/"; + } + break; + case ATTACKER: + switch (listen) + { + case "Tell-red": + return "Red egg"; + case "Tell-green": + return "Green egg"; + case "Tell-blue": + return "Blue egg"; + } + break; + case HEALER: + switch (listen) + { + case "Tell-tofu": + return "Tofu"; + case "Tell-crackers": + return "Crackers"; + case "Tell-worms": + return "Worms"; + } + break; + case DEFENDER: + switch (listen) + { + case "Tell-meat": + return "Pois. Meat"; + case "Tell-tofu": + return "Pois. Tofu"; + case "Tell-worms": + return "Pois. Worms"; + } + break; + } + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Game.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Scorecard.java similarity index 80% rename from runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Game.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Scorecard.java index e7ae5af8be..e33c798a83 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Game.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Scorecard.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, Jacob M + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,18 +27,21 @@ package net.runelite.client.plugins.barbarianassault; import java.awt.Color; import java.util.ArrayList; + +import lombok.AccessLevel; import lombok.Getter; -import net.runelite.api.Client; import net.runelite.api.events.ChatMessage; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.eventbus.Subscribe; + @Getter -public class Game +public class Scorecard { - private Client client; - private String currentWave; - private ArrayList Waves = new ArrayList<>(); + private BarbarianAssaultPlugin game; + + @Getter(AccessLevel.NONE) + private ArrayList waves = new ArrayList<>(); private String[] totalDescriptions = { "A: ", "; D: ", @@ -55,46 +59,46 @@ public class Game private int[] totalAmounts = new int[6]; private int[] otherRolesPoints = new int[4]; - Game(Client client) + Scorecard(BarbarianAssaultPlugin game) { - this.client = client; - } - - Game(Client client, ArrayList waves) - { - this.client = client; - this.Waves = waves; + this.game = game; } @Subscribe public void onChatMessage(ChatMessage chatMessage) { - if (chatMessage.getMessage().startsWith("---- Wave:")) + if (chatMessage.getMessage().startsWith("---- Points:")) { - String[] tempMessage = chatMessage.getMessage().split(" "); - currentWave = tempMessage[2]; - String[] temp = currentWave.split(" "); - } - if (currentWave.equals("1")) - { - Waves = null; - totalPoints = new int[6]; - totalAmounts = new int[6]; + if (game.getStage() == 1) + { + totalPoints = new int[6]; + totalAmounts = new int[6]; + } } } + void addWave(Wave wave) + { + this.waves.add(wave); + } + + int getNumberOfWaves() + { + return waves.size(); + } + ChatMessageBuilder getGameSummary() { int[] amountsList; int[] pointsList; int[] otherRolesPointsList; ChatMessageBuilder message = new ChatMessageBuilder(); - message.append("Round points: "); - for (Wave w : Waves) + message.append("Game points: "); + for (Wave wave : waves) { - amountsList = w.getWaveAmounts(); - pointsList = w.getWavePoints(); - otherRolesPointsList = w.getOtherRolesPointsList(); + amountsList = wave.getAmounts(); + pointsList = wave.getPoints(); + otherRolesPointsList = wave.getOtherRolesPointsList(); for (int j = 0; j < totalAmounts.length; j++) { totalAmounts[j] += amountsList[j]; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/GameTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Timer.java similarity index 76% rename from runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/GameTimer.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Timer.java index 948ab8bc85..69347915a6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/GameTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Timer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,37 +24,31 @@ */ package net.runelite.client.plugins.barbarianassault; +import lombok.Getter; + import java.time.Duration; import java.time.Instant; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import net.runelite.api.Constants; -class GameTimer +class Timer { - final private Instant startTime = Instant.now(); - private Instant prevWave = startTime; + @Getter + private final Instant startTime; - String getTime(boolean waveTime) + Timer() { - final Instant now = Instant.now(); - final Duration elapsed; - - if (waveTime) - { - elapsed = Duration.between(prevWave, now); - } - else - { - elapsed = Duration.between(startTime, now).minusMillis(Constants.GAME_TICK_LENGTH); - } - - return formatTime(LocalTime.ofSecondOfDay(elapsed.getSeconds())); + this.startTime = Instant.now(); } - void setWaveStartTime() + long getElapsedTime() { - prevWave = Instant.now(); + return Duration.between(startTime, Instant.now()).getSeconds(); + } + + String getElapsedTimeFormatted() + { + return formatTime(LocalTime.ofSecondOfDay(getElapsedTime())); } private static String formatTime(LocalTime time) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Round.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/TimerBox.java similarity index 59% rename from runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Round.java rename to runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/TimerBox.java index 119392ed9e..8efa4fe917 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Round.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/TimerBox.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2018, Cameron + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,50 +25,65 @@ */ package net.runelite.client.plugins.barbarianassault; -import java.time.Duration; -import java.time.Instant; -import javax.inject.Inject; -import lombok.Getter; -import lombok.Setter; -import net.runelite.api.Constants; +import lombok.Data; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.overlay.infobox.InfoBox; -class Round +import java.awt.Color; +import java.awt.image.BufferedImage; + +@Data +public class TimerBox extends InfoBox { - private final Instant roundStartTime; + private int count; - @Getter - private final Role roundRole; + private boolean inSync = true; - @Getter - @Setter - private boolean runnersKilled; + private boolean tooltipEnabled = false; - @Getter - @Setter - private boolean rangersKilled; - - @Getter - @Setter - private boolean healersKilled; - - @Getter - @Setter - private boolean fightersKilled; - - @Inject - public Round(Role role) + TimerBox(BufferedImage image, Plugin plugin, int count) { - this.roundRole = role; - this.roundStartTime = Instant.now().plusMillis(2 * Constants.GAME_TICK_LENGTH); + super(image, plugin); + this.count = count; } - public long getRoundTime() + @Override + public String getText() { - return Duration.between(roundStartTime, Instant.now()).getSeconds(); + if (count == -1) + { + return ""; + } + return Integer.toString(getCount()); } - long getTimeToChange() + @Override + public Color getTextColor() { - return 30 + (Duration.between(Instant.now(), roundStartTime).getSeconds() % 30); + if (inSync) + { + return Color.WHITE; + } + else + { + return Color.RED; + } + } + + @Override + public String getTooltip() + { + if (!tooltipEnabled) + { + return ""; + } + else if (inSync) + { + return "Valid"; + } + else + { + return "Invalid"; + } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java index 4a15f0b9de..a392312b75 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/Wave.java @@ -1,5 +1,7 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2018, Jacob M + * Copyright (c) 2019, 7ate9 + * Copyright (c) 2019, https://runelitepl.us * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,90 +27,105 @@ package net.runelite.client.plugins.barbarianassault; import com.google.common.collect.ImmutableList; -import java.awt.Color; +import lombok.AccessLevel; +import lombok.Data; import lombok.Getter; import net.runelite.api.Client; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.chat.ChatMessageBuilder; -@Getter -class Wave -{ - private Client client; - private final ImmutableList WIDGETS = ImmutableList.of( - WidgetInfo.BA_FAILED_ATTACKER_ATTACKS, - WidgetInfo.BA_RUNNERS_PASSED, - WidgetInfo.BA_EGGS_COLLECTED, - WidgetInfo.BA_HITPOINTS_REPLENISHED, - WidgetInfo.BA_WRONG_POISON_PACKS, - WidgetInfo.BA_HONOUR_POINTS_REWARD - ); - private final ImmutableList POINTSWIDGETS = ImmutableList.of( -//base - WidgetInfo.BA_BASE_POINTS, -//att - WidgetInfo.BA_FAILED_ATTACKER_ATTACKS_POINTS, - WidgetInfo.BA_RANGERS_KILLED, - WidgetInfo.BA_FIGHTERS_KILLED, -//def - WidgetInfo.BA_RUNNERS_PASSED_POINTS, - WidgetInfo.BA_RUNNERS_KILLED, -//coll - WidgetInfo.BA_EGGS_COLLECTED_POINTS, -//heal - WidgetInfo.BA_HEALERS_KILLED, - WidgetInfo.BA_HITPOINTS_REPLENISHED_POINTS, - WidgetInfo.BA_WRONG_POISON_PACKS_POINTS - ); - private int[] waveAmounts = new int[6]; - private int[] allPointsList = new int[10]; - private int[] wavePoints = new int[6]; - private int[] otherRolesPointsList = new int[4]; - private String[] descriptions = { - " A: ", - "; D: ", - "; C: ", - "; Vial: ", - "; H packs: ", - "; Total: "}; +import java.awt.Color; - private String[] otherPointsDescriptions = { - " A: ", - " D: ", - " C: ", - " H: " - }; + +@Data +public class Wave +{ + @Getter(AccessLevel.NONE) + private static final ImmutableList WIDGETS = ImmutableList.of( + WidgetInfo.BA_FAILED_ATTACKER_ATTACKS, + WidgetInfo.BA_RUNNERS_PASSED, + WidgetInfo.BA_EGGS_COLLECTED, + WidgetInfo.BA_HITPOINTS_REPLENISHED, + WidgetInfo.BA_WRONG_POISON_PACKS, + WidgetInfo.BA_HONOUR_POINTS_REWARD + ); + + @Getter(AccessLevel.NONE) + private static final ImmutableList POINTSWIDGETS = ImmutableList.of( + //Base + WidgetInfo.BA_BASE_POINTS, + //Attacker + WidgetInfo.BA_FAILED_ATTACKER_ATTACKS_POINTS, + WidgetInfo.BA_RANGERS_KILLED, + WidgetInfo.BA_FIGHTERS_KILLED, + //Defender + WidgetInfo.BA_RUNNERS_PASSED_POINTS, + WidgetInfo.BA_RUNNERS_KILLED, + //Collector + WidgetInfo.BA_EGGS_COLLECTED_POINTS, + //Healer + WidgetInfo.BA_HEALERS_KILLED, + WidgetInfo.BA_HITPOINTS_REPLENISHED_POINTS, + WidgetInfo.BA_WRONG_POISON_PACKS_POINTS + ); + + @Getter(AccessLevel.NONE) + private final Client client; + + private final Timer waveTimer; + + private boolean runnersKilled; + + private boolean rangersKilled; + + private boolean healersKilled; + + private boolean fightersKilled; + + private int collectedEggCount = 0; + + private int positiveEggCount = 0; + + private int wrongEggs = 0; + + private int hpHealed = 0; + + private int totalCollectedEggCount = 0; + + private int totalHpHealed = 0; + + private int[] amounts = new int[6]; + + private int[] allPointsList = new int[10]; + + private int[] points = new int[6]; + + private int[] otherRolesPointsList = new int[4]; + + private String[] descriptions = {" A: ", "; D: ", "; C: ", "; Vial: ", "; H packs: ", "; Total: "}; + + private String[] otherPointsDescriptions = {" A: ", " D: ", " C: ", " H: "}; Wave(Client client) { this.client = client; + this.waveTimer = new Timer(); } - void setWaveAmounts(int[] amounts) - { - System.arraycopy(amounts, 0, waveAmounts, 0, amounts.length); - } - - void setWavePoints(int[] points, int[] otherRolesPoints) - { - System.arraycopy(points, 0, wavePoints, 0, points.length); - System.arraycopy(otherRolesPoints, 0, otherRolesPointsList, 0, otherRolesPoints.length); - } - - void setWaveAmounts() + void setAmounts() { for (int i = 0; i < WIDGETS.size(); i++) { Widget w = client.getWidget(WIDGETS.get(i)); if (w != null) { - waveAmounts[i] = Integer.parseInt(w.getText()); + amounts[i] = Integer.parseInt(w.getText()); } } } - void setWavePoints() + void setPoints() { for (int i = 0; i < POINTSWIDGETS.size(); i++) { @@ -117,26 +134,26 @@ class Wave switch (i) { case 1: - wavePoints[0] += allPointsList[i]; + points[0] += allPointsList[i]; break; case 4: - wavePoints[1] += allPointsList[i]; + points[1] += allPointsList[i]; break; case 6: - wavePoints[2] += allPointsList[i]; + points[2] += allPointsList[i]; break; case 8: case 9: - wavePoints[3] += allPointsList[i]; + points[3] += allPointsList[i]; break; default: break; } } - wavePoints[5] = 0; - for (int i = 0; i < wavePoints.length - 1; i++) + points[5] = 0; + for (int i = 0; i < points.length - 1; i++) { - wavePoints[5] += wavePoints[i]; + points[5] += points[i]; } for (int i = 0; i < POINTSWIDGETS.size(); i++) { @@ -166,37 +183,35 @@ class Wave case 9: otherRolesPointsList[3] += Integer.parseInt(w.getText()); break; - default: - break; } } } - ChatMessageBuilder getWaveSummary() + ChatMessageBuilder getSummary() { ChatMessageBuilder message = new ChatMessageBuilder(); message.append("Wave points:"); for (int i = 0; i < descriptions.length; i++) { - if (i != 4) + message.append(descriptions[i]); + if (i != 5) { - message.append(descriptions[i]); - message.append(String.valueOf(waveAmounts[i])); - message.append("("); - if (wavePoints[i] < 0) - { - message.append(Color.RED, String.valueOf(wavePoints[i])); - } - else if (wavePoints[i] > 0) - { - message.append(Color.BLUE, String.valueOf(wavePoints[i])); - } - else - { - message.append(String.valueOf(wavePoints[i])); - } - message.append(")"); + message.append(String.valueOf(amounts[i])); } + message.append("("); + if (points[i] < 0) + { + message.append(Color.RED, String.valueOf(points[i])); + } + else if (points[i] > 0) + { + message.append(Color.BLUE, String.valueOf(points[i])); + } + else + { + message.append(String.valueOf(points[i])); + } + message.append(")"); } message.append(System.getProperty("line.separator")); message.append("All roles points this wave: "); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/clock.png b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/clock.png deleted file mode 100644 index c0f39269e1..0000000000 Binary files a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/clock.png and /dev/null differ diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsConfig.java deleted file mode 100644 index 5ffce8db02..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsConfig.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * 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.batools; - -import net.runelite.client.config.Config; -import net.runelite.client.config.ConfigGroup; -import net.runelite.client.config.ConfigItem; - -@ConfigGroup("BATools") -public interface BAToolsConfig extends Config -{ - @ConfigItem( - keyName = "defTimer", - name = "Defender Tick Timer", - description = "Shows the current cycle tick of runners." - ) - default boolean defTimer() - { - return false; - } - - @ConfigItem( - keyName = "calls", - name = "Remove Incorrect Calls", - description = "Remove incorrect calls." - ) - default boolean calls() - { - return false; - } - - @ConfigItem( - keyName = "swapLadder", - name = "Swap ladder option", - description = "Swap Climb-down with Quick-start in the wave lobbies" - ) - default boolean swapLadder() - { - return true; - } - - @ConfigItem( - keyName = "swapCollectorBag", - name = "swaps collector bag in ba to empty left click", - description = "Make empty the left-click option on collector bag" - ) - default boolean swapCollectorBag() - { - return false; - } - - @ConfigItem( - keyName = "swapDestroyEggs", - name = "Left click destroy eggs in BA", - description = "Make destroy the left-click option for collector eggs" - ) - default boolean swapDestroyEggs() - { - return false; - } - - @ConfigItem( - keyName = "healerCodes", - name = "Healer Codes", - description = "Overlay to show healer codes" - ) - default boolean healerCodes() - { - return false; - } - - @ConfigItem( - keyName = "healerMenuOption", - name = "Healer menu options", - description = "Shows time since last food placed on healer" - ) - default boolean healerMenuOption() - { - return false; - } - - @ConfigItem( - keyName = "eggBoi", - name = "Collector helper", - description = "Hold shift to collect the correct egg" - ) - default boolean eggBoi() - { - return false; - } - - @ConfigItem( - keyName = "osHelp", - name = "Shift OS", - description = "Hold shift to only pick up correct eggs" - ) - default boolean osHelp() - { - return false; - } - - @ConfigItem( - keyName = "prayerMetronome", - name = "Prayer Metronome", - description = "Similar to metronome plugin but only activates when a prayer is active" - ) - default boolean prayerMetronome() - { - return false; - } - - @ConfigItem( - keyName = "prayerMetronomeVolume", - name = "Prayer Metronome Volume", - description = "Volume level" - ) - default int prayerMetronomeVolume() - { - return 1; - } - - @ConfigItem( - keyName = "attackStyles", - name = "Attack Styles", - description = "Hide attack styles depending on weapon." - ) - default boolean attackStyles() - { - return false; - } - - @ConfigItem( - keyName = "removeBA", - name = "*Barbarian Assault Helper*", - description = "Remove unnecessary menu options in Barbarian Assault depending on role
Examples: Remove attack options when not attacker
Remove take options when not collector" - ) - default boolean removeBA() - { - return true; - } - - @ConfigItem( - keyName = "removeWrongEggs", - name = "Remove wrong eggs - *Barbarian Assault Helper*", - description = "Remove unnecessary menu options in Barbarian Assault depending on role
Examples: Remove attack options when not attacker
Remove take options when not collector" - ) - default boolean removeWrongEggs() - { - return false; - } - - @ConfigItem( - keyName = "removeWrongHealFood", - name = "Remove wrong Heal Food - *Barbarian Assault Helper*", - description = "Remove unnecessary menu options in Barbarian Assault depending on role
Examples: Remove attack options when not attacker
Remove take options when not collector" - ) - default boolean removeHealWrongFood() - { - return false; - } - - @ConfigItem( - keyName = "tagging", - name = "Attack Tags", - description = "Highlights the menu entry of an attacker/ranger that has not been tagged." - ) - default boolean tagging() - { - return false; - } - - @ConfigItem( - keyName = "ctrlHealer", - name = "Control Healer", - description = "Hold ctrl to put last healer clicked on top" - ) - default boolean ctrlHealer() - { - return false; - } - - @ConfigItem( - keyName = "removePenanceCave", - name = "Remove Block Penance Cave", - description = "Removes unnecessary menu option, however Moon wanted it back" - ) - default boolean removePenanceCave() - { - return false; - } - -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsOverlay.java deleted file mode 100644 index 3fcf59ba34..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsOverlay.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * 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.batools; - -import java.awt.Color; -import static java.awt.Color.GREEN; -import static java.awt.Color.RED; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.time.Duration; -import java.time.Instant; -import javax.inject.Inject; -import lombok.extern.slf4j.Slf4j; -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; - -@Slf4j - -public class BAToolsOverlay extends Overlay -{ - private final BAToolsConfig config; - private BAToolsPlugin plugin; - - @Inject - public BAToolsOverlay(BAToolsPlugin plugin, BAToolsConfig config) - { - setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_SCENE); - this.config = config; - this.plugin = plugin; - } - - - @Override - public Dimension render(Graphics2D graphics) - { - if (!config.healerCodes()) - { - return null; - } - - for (Healer healer : plugin.getHealers().values()) - { - Color color; - int timeLeft = healer.getLastFoodTime() - (int) Duration.between(plugin.getWave_start(), Instant.now()).getSeconds(); - timeLeft = timeLeft < 1 ? 0 : timeLeft; - - if (healer.getFoodRemaining() > 1) - { - color = GREEN; - } - else if (healer.getFoodRemaining() == 1) - { - if (timeLeft > 0) - { - color = RED; - } - else - { - color = GREEN; - } - } - else - { - continue; - } - - String text = String.format("%d %d", - healer.getFoodRemaining(), - timeLeft); - - - OverlayUtil.renderActorOverlay(graphics, healer.getNpc(), text, color); - } - return null; - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsPlugin.java deleted file mode 100644 index d7ca339124..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/batools/BAToolsPlugin.java +++ /dev/null @@ -1,862 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * 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.batools; - -import com.google.common.collect.ImmutableMap; -import com.google.inject.Provides; -import java.awt.event.KeyEvent; -import java.awt.image.BufferedImage; -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.inject.Inject; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import net.runelite.api.Actor; -import net.runelite.api.ChatMessageType; -import net.runelite.api.Client; -import net.runelite.api.ItemID; -import net.runelite.api.MenuEntry; -import net.runelite.api.NPC; -import net.runelite.api.NpcID; -import net.runelite.api.Prayer; -import net.runelite.api.SoundEffectID; -import net.runelite.api.Varbits; -import net.runelite.api.coords.WorldPoint; -import net.runelite.api.events.ChatMessage; -import net.runelite.api.events.ConfigChanged; -import net.runelite.api.events.GameTick; -import net.runelite.api.events.HitsplatApplied; -import net.runelite.api.events.InteractingChanged; -import net.runelite.api.events.MenuEntryAdded; -import net.runelite.api.events.MenuOptionClicked; -import net.runelite.api.events.NpcDespawned; -import net.runelite.api.events.NpcSpawned; -import net.runelite.api.events.VarbitChanged; -import net.runelite.api.events.WidgetLoaded; -import net.runelite.api.widgets.Widget; - - -import net.runelite.api.widgets.WidgetID; -import net.runelite.api.widgets.WidgetInfo; -import static net.runelite.api.widgets.WidgetInfo.BA_ATK_CALL_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_ATK_LISTEN_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_ATK_ROLE_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_COLL_CALL_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_COLL_LISTEN_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_COLL_ROLE_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_DEF_CALL_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_DEF_ROLE_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_HEAL_CALL_TEXT; -import static net.runelite.api.widgets.WidgetInfo.BA_HEAL_LISTEN_TEXT; -import static net.runelite.api.widgets.WidgetInfo.COMBAT_STYLE_FOUR; -import static net.runelite.api.widgets.WidgetInfo.COMBAT_STYLE_ONE; -import static net.runelite.api.widgets.WidgetInfo.COMBAT_STYLE_THREE; -import static net.runelite.api.widgets.WidgetInfo.COMBAT_STYLE_TWO; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.game.ItemManager; -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 net.runelite.client.plugins.PluginType; -import net.runelite.client.ui.overlay.OverlayManager; -import net.runelite.client.ui.overlay.infobox.InfoBoxManager; -import net.runelite.client.util.Text; -import org.apache.commons.lang3.ArrayUtils; -import net.runelite.client.menus.MenuManager; - - -@Slf4j -@PluginDescriptor( - name = "BA Tools", - description = "Custom tools for Barbarian Assault", - tags = {"minigame", "overlay", "timer"}, - type = PluginType.PVM, - enabledByDefault = false -) - -public class BAToolsPlugin extends Plugin implements KeyListener -{ - private boolean inGame; - private int tickNum; - private int pastCall = 0; - private int currentWave = 1; - private int lastHealer; - private static final int BA_WAVE_NUM_INDEX = 2; - private static final WorldPoint healerSpawnPoint = new WorldPoint(1898, 1586, 0); - private final List entries = new ArrayList<>(); - private ImmutableMap originalAttackStyles; - private HashMap foodPressed = new HashMap<>(); - private CycleCounter counter; - private Actor lastInteracted; - - private boolean shiftDown; - private boolean ctrlDown; - - @Inject - private Client client; - - @Inject - private OverlayManager overlayManager; - - @Inject - private BAToolsConfig config; - - @Inject - private ItemManager itemManager; - - @Inject - private InfoBoxManager infoBoxManager; - - @Inject - private BAToolsOverlay overlay; - - @Getter - private Map healers; - - @Getter - private Instant wave_start; - - @Inject - private MenuManager menuManager; - - @Inject - private KeyManager keyManager; - - - @Provides - BAToolsConfig provideConfig(ConfigManager configManager) - { - return configManager.getConfig(BAToolsConfig.class); - } - - @Override - protected void startUp() throws Exception - { - overlayManager.add(overlay); - healers = new HashMap<>(); - wave_start = Instant.now(); - //lastInteracted = null; - foodPressed.clear(); - keyManager.registerKeyListener(this); - } - - @Override - protected void shutDown() throws Exception - { - removeCounter(); - healers.clear(); - inGame = false; - lastInteracted = null; - overlayManager.remove(overlay); - keyManager.unregisterKeyListener(this); - shiftDown = false; - } - - @Subscribe - public void onWidgetLoaded(WidgetLoaded event) - { - switch (event.getGroupId()) - { - case WidgetID.BA_REWARD_GROUP_ID: - { - Widget rewardWidget = client.getWidget(WidgetInfo.BA_REWARD_TEXT); - - if (rewardWidget != null && rewardWidget.getText().contains("
5")) - { - tickNum = 0; - } - } - } - } - - @Subscribe - public void onGameTick(GameTick event) - { - Widget callWidget = getWidget(); - - if (callWidget != null) - { - if (callWidget.getTextColor() != pastCall && callWidget.getTextColor() == 16316664) - { - tickNum = 0; - } - pastCall = callWidget.getTextColor(); - } - if (inGame && config.defTimer()) - { - if (tickNum > 9) - { - tickNum = 0; - } - - if (counter == null) - { - addCounter(); - lastHealer = 0; - } - counter.setCount(tickNum); - - tickNum++; - } - - Widget weapon = client.getWidget(593, 1); - - if (config.attackStyles() - && weapon != null - && inGame - && weapon.getText().contains("Crystal halberd") || weapon.getText().contains("Dragon claws") - && client.getWidget(BA_ATK_LISTEN_TEXT) != null) - { - if (originalAttackStyles == null) - { - ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); - - builder.put(COMBAT_STYLE_ONE, client.getWidget(COMBAT_STYLE_ONE).isHidden()); - builder.put(COMBAT_STYLE_TWO, client.getWidget(COMBAT_STYLE_TWO).isHidden()); - builder.put(COMBAT_STYLE_THREE, client.getWidget(COMBAT_STYLE_THREE).isHidden()); - builder.put(COMBAT_STYLE_FOUR, client.getWidget(COMBAT_STYLE_FOUR).isHidden()); - - originalAttackStyles = builder.build(); - } - - String style = client.getWidget(BA_ATK_LISTEN_TEXT).getText(); - - if (style.contains("Defensive")) - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(true); - client.getWidget(COMBAT_STYLE_TWO).setHidden(true); - client.getWidget(COMBAT_STYLE_THREE).setHidden(true); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(false); - } - else if (style.contains("Aggressive")) - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(true); - client.getWidget(COMBAT_STYLE_TWO).setHidden(false); - client.getWidget(COMBAT_STYLE_THREE).setHidden(true); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(true); - } - else if (style.contains("Controlled")) - { - if (weapon.getText().contains("Crystal halberd")) - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(false); - client.getWidget(COMBAT_STYLE_THREE).setHidden(true); - } - else - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(true); - client.getWidget(COMBAT_STYLE_THREE).setHidden(false); - } - client.getWidget(COMBAT_STYLE_TWO).setHidden(true); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(true); - } - else if (style.contains("Accurate") && weapon.getText().contains("Dragon claws")) - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(false); - client.getWidget(COMBAT_STYLE_TWO).setHidden(true); - client.getWidget(COMBAT_STYLE_THREE).setHidden(true); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(true); - } - else - { - client.getWidget(COMBAT_STYLE_ONE).setHidden(false); - client.getWidget(COMBAT_STYLE_TWO).setHidden(false); - client.getWidget(COMBAT_STYLE_THREE).setHidden(false); - client.getWidget(COMBAT_STYLE_FOUR).setHidden(false); - } - - } - else if (originalAttackStyles != null) - { - originalAttackStyles.forEach((w, b) -> client.getWidget(w).setHidden(b)); - } - - if (config.prayerMetronome() && isAnyPrayerActive()) - { - for (int i = 0; i < config.prayerMetronomeVolume(); i++) - { - client.playSoundEffect(SoundEffectID.GE_INCREMENT_PLOP); - } - } - } - - private Widget getWidget() - { - if (client.getWidget(BA_DEF_CALL_TEXT) != null) - { - return client.getWidget(BA_DEF_CALL_TEXT); - } - else if (client.getWidget(BA_ATK_CALL_TEXT) != null) - { - return client.getWidget(BA_ATK_CALL_TEXT); - } - else if (client.getWidget(BA_COLL_CALL_TEXT) != null) - { - return client.getWidget(BA_COLL_CALL_TEXT); - } - else if (client.getWidget(BA_HEAL_CALL_TEXT) != null) - { - return client.getWidget(BA_HEAL_CALL_TEXT); - } - return null; - } - - @Subscribe - public void onVarbitChanged(VarbitChanged event) - { - int inGameBit = client.getVar(Varbits.IN_GAME_BA); - - if (inGameBit == 1 && !inGame || - inGameBit == 0 && inGame) - { - inGame = inGameBit == 1; - - if (!inGame) - { - pastCall = 0; - removeCounter(); - foodPressed.clear(); - } - else - { - addCounter(); - } - } - } - - @Subscribe - public void onChatMessage(ChatMessage event) - { - if (event.getType() == ChatMessageType.GAMEMESSAGE - && event.getMessage().startsWith("---- Wave:")) - { - String[] message = event.getMessage().split(" "); - currentWave = Integer.parseInt(message[BA_WAVE_NUM_INDEX]); - wave_start = Instant.now(); - healers.clear(); - } - } - - @Subscribe - public void onNpcSpawned(NpcSpawned event) - { - NPC npc = event.getNpc(); - - if (inGame && isNpcHealer(npc.getId())) - { - if (checkNewSpawn(npc) || Duration.between(wave_start, Instant.now()).getSeconds() < 16) - { - int spawnNumber = healers.size(); - healers.put(npc, new Healer(npc, spawnNumber, currentWave)); - } - } - } - - @Subscribe - public void onHitsplatApplied(HitsplatApplied hitsplatApplied) - { - Actor actor = hitsplatApplied.getActor(); - - if (healers.isEmpty() && !(actor instanceof NPC) && lastInteracted == null) - { - return; - } - - for (Healer healer : healers.values()) - { - if (healer.getNpc() == actor && actor == lastInteracted) - { - healer.setFoodRemaining(healer.getFoodRemaining() - 1); - } - } - } - - @Subscribe - public void onNpcDespawned(NpcDespawned event) - { - healers.remove(event.getNpc()); - } - - @Subscribe - public void onInteractingChanged(InteractingChanged event) - { - Actor opponent = event.getTarget(); - - if (opponent instanceof NPC && isNpcHealer(((NPC) opponent).getId()) && event.getSource() != client.getLocalPlayer()) - { - lastInteracted = opponent; - } - } - - private static boolean isNpcHealer(int npcId) - { - return npcId == NpcID.PENANCE_HEALER || - npcId == NpcID.PENANCE_HEALER_5766 || - npcId == NpcID.PENANCE_HEALER_5767 || - npcId == NpcID.PENANCE_HEALER_5768 || - npcId == NpcID.PENANCE_HEALER_5769 || - npcId == NpcID.PENANCE_HEALER_5770 || - npcId == NpcID.PENANCE_HEALER_5771 || - npcId == NpcID.PENANCE_HEALER_5772 || - npcId == NpcID.PENANCE_HEALER_5773 || - npcId == NpcID.PENANCE_HEALER_5774; - } - - @Subscribe - public void onMenuEntryAdded(MenuEntryAdded event) - { - - final int itemId = event.getIdentifier(); - String option = Text.removeTags(event.getOption()).toLowerCase(); - String target = Text.removeTags(event.getTarget()).toLowerCase(); - - if (config.swapDestroyEggs() & (target.equals("red egg") || target.equals("green egg") || target.equals("blue egg"))) - { - menuManager.addSwap("destroy", option, target); - } - - if (config.swapCollectorBag() & target.equals("collection bag")) - { - menuManager.addSwap("empty", option, target); - } - - if (config.swapLadder() && option.equals("climb-down") && target.equals("ladder")) - { - menuManager.addSwap("Quick-start", option, target); - } - else if (config.removeBA() && client.getVar(Varbits.IN_GAME_BA) == 1 && !option.contains("tell-"))//if in barbarian assault and menu isnt from a horn - { - if (itemId == ItemID.LOGS && !target.contains("healing vial")) - { - if (client.getWidget(BA_DEF_ROLE_TEXT) == null) - { - remove(new String[]{"take", "light"}, target); - } - else //remove "Light" option (and "Take" option if not defender). - { - remove("light", target); - } - } - else if (option.equals("use")) - { - if (config.removeHealWrongFood()) - { - Widget healer = client.getWidget(BA_HEAL_LISTEN_TEXT); - if (healer != null) - { - String item = target.split("-")[0].trim(); - List poison = Arrays.asList("poisoned tofu", "poisoned meat", "poisoned worms"); - List vials = Arrays.asList("healing vial", "healing vial(1)", "healing vial(2)", "healing vial(3)", "healing vial(4)");//"healing vial(4)" - if (poison.contains(item)) - { - //if item is a poison item - int calledPoison = 0; - switch (healer.getText())//choose which poison to hide the use/destroy option for - { - case "Pois. Tofu": - calledPoison = ItemID.POISONED_TOFU; - break; - case "Pois. Meat": - calledPoison = ItemID.POISONED_MEAT; - break; - case "Pois. Worms": - calledPoison = ItemID.POISONED_WORMS; - break; - } - if (target.equals(item))//if targeting the item itself - { - if (calledPoison != 0 && itemId != calledPoison)//if no call or chosen item is not the called one - { - remove(new String[]{"use", "destroy", "examine"}, target);//remove options - } - } - else if (!target.contains("penance healer")) - { - remove(option, target); - } - } - else if (vials.contains(item))//if item is the healer's healing vial - { - - if (!target.equals(item))//if target is not the vial itself - { - - if (!target.contains("level") || target.contains("penance") || target.contains("queen spawn"))//if someone has "penance" or "queen spawn" in their name, gg... - { - remove(option, target); - } - } - } - } - } - } - else if (option.equals("attack") && client.getWidget(BA_ATK_ROLE_TEXT) == null && !target.equals("queen spawn"))//if not attacker - { - //remove attack option from everything but queen spawns - remove(option, target); - } - else if ((option.equals("fix")) && client.getWidget(WidgetInfo.BA_DEF_ROLE_TEXT) == null)//if not defender - { - remove(option, target); - } - else if ((option.equals("block") && target.equals("penance cave") && config.removePenanceCave())) - { - remove(option, target); - } - - else if ((option.equals("load")) && client.getWidget(BA_COLL_ROLE_TEXT) == null)//if not collector, remove hopper options - { - remove(new String[]{option, "look-in"}, target); - } - else if (config.removeWrongEggs() && option.equals("take")) - { - Widget eggToColl = client.getWidget(BA_COLL_LISTEN_TEXT); - if (eggToColl != null)//if we're a collector - { - List eggsToHide = new ArrayList<>(); - eggsToHide.add(ItemID.HAMMER); - switch (eggToColl.getText())//choose which eggs to hide take option for - { - case "Red eggs": - eggsToHide.add(ItemID.BLUE_EGG); - eggsToHide.add(ItemID.GREEN_EGG); - break; - case "Blue eggs": - eggsToHide.add(ItemID.RED_EGG); - eggsToHide.add(ItemID.GREEN_EGG); - break; - case "Green eggs": - eggsToHide.add(ItemID.RED_EGG); - eggsToHide.add(ItemID.BLUE_EGG); - break; - } - if (eggsToHide.contains(itemId)) - { - remove(option, target);//hide wrong eggs - } - } - else - { - List defenderItems = Arrays.asList(ItemID.HAMMER, ItemID.TOFU, ItemID.CRACKERS, ItemID.WORMS);//logs are handled separately due to hiding "light" option too. - if (client.getWidget(BA_DEF_ROLE_TEXT) == null || !defenderItems.contains(itemId))//if not defender, or item is not a defenderItem - { - remove(option, target);//hide everything except hammer/logs and bait if Defender - } - } - } - } - - - if (client.getWidget(WidgetInfo.BA_HEAL_CALL_TEXT) == getWidget() && lastHealer != 0 && inGame && config.ctrlHealer() && ctrlDown) - { - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry correctHealer = null; - entries.clear(); - - for (MenuEntry entry : menuEntries) - { - - if (( entry.getIdentifier() == lastHealer && entry.getOption().equals("Use")) - || - ( - (entry.getTarget().equals("Poisoned meat") || entry.getTarget().equals("Poisoned worms") || entry.getTarget().equals("Poisoned tofu")) - && - entry.getOption().equals("Use") - ) - ) - { - correctHealer = entry; - } - else - { - log.info((entry.getIdentifier() == lastHealer && entry.getOption().equals("Use")) + " " + ((entry.getTarget().equals("Poisoned meat") || entry.getTarget().equals("Poisoned worms") || entry.getTarget().equals("Poisoned tofu")) && entry.getOption().equals("Use")) ); - } - } - if (correctHealer != null) - { - entries.add(correctHealer); - } - client.setMenuEntries(entries.toArray(new MenuEntry[entries.size()])); - } - - - if ((event.getTarget().contains("Penance Healer") || event.getTarget().contains("Penance Fighter") || event.getTarget().contains("Penance Ranger"))) - { - - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry lastEntry = menuEntries[menuEntries.length - 1]; - String targett = lastEntry.getTarget(); - - if (foodPressed.containsKey(lastEntry.getIdentifier())) - { - lastEntry.setTarget(lastEntry.getTarget().split("\\(")[0] + "(" + Duration.between(foodPressed.get(lastEntry.getIdentifier()), Instant.now()).getSeconds() + ")"); - if (Duration.between(foodPressed.get(lastEntry.getIdentifier()), Instant.now()).getSeconds() > 20) - { - lastEntry.setTarget(lastEntry.getTarget().replace("", "")); - } - } - else - { - lastEntry.setTarget(targett.replace("", "")); - - } - - client.setMenuEntries(menuEntries); - } - - if (client.getWidget(BA_COLL_LISTEN_TEXT) != null && inGame && config.eggBoi() && event.getTarget().endsWith("egg") && shiftDown) - { - String[] currentCall = client.getWidget(BA_COLL_LISTEN_TEXT).getText().split(" "); - - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry correctEgg = null; - entries.clear(); - - for (MenuEntry entry : menuEntries) - { - if (entry.getTarget().contains(currentCall[0]) && entry.getOption().equals("Take")) - { - correctEgg = entry; - } - else if (!entry.getOption().startsWith("Take")) - { - entries.add(entry); - } - } - if (correctEgg != null) - { - entries.add(correctEgg); - } - client.setMenuEntries(entries.toArray(new MenuEntry[0])); - } - - if (client.getWidget(WidgetInfo.BA_ATK_LISTEN_TEXT) != null && inGame && config.attackStyles() && shiftDown) - { - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry correctEgg = null; - entries.clear(); - - for (MenuEntry entry : menuEntries) - { - if (entry.getOption().contains("Walk here")) - { - entries.add(entry); - } - } - client.setMenuEntries(entries.toArray(new MenuEntry[entries.size()])); - } - - if (client.getWidget(BA_HEAL_LISTEN_TEXT) != null && inGame && config.osHelp() && event.getTarget().equals("Healer item machine") && shiftDown) - { - String[] currentCall = client.getWidget(BA_HEAL_LISTEN_TEXT).getText().split(" "); - - if (!currentCall[0].contains("Pois.")) - { - return; - } - - MenuEntry[] menuEntries = client.getMenuEntries(); - MenuEntry correctEgg = null; - entries.clear(); - - for (MenuEntry entry : menuEntries) - { - if (entry.getOption().equals("Take-" + currentCall[1])) - { - correctEgg = entry; - } - } - if (correctEgg != null) - { - entries.add(correctEgg); - client.setMenuEntries(entries.toArray(new MenuEntry[0])); - } - } - - } - - @Subscribe - public void onMenuOptionClicked(MenuOptionClicked event) - { - String target = event.getTarget(); - - if (config.tagging() && (event.getTarget().contains("Penance Ranger") || event.getTarget().contains("Penance Fighter"))) - { - if (event.getOption().contains("Attack")) - { - foodPressed.put(event.getIdentifier(), Instant.now()); - } - log.info(target); - } - - if (config.healerMenuOption() && target.contains("Penance Healer") && target.contains("Poisoned") && target.contains("->")) - { - foodPressed.put(event.getIdentifier(), Instant.now()); - lastHealer = event.getIdentifier(); - log.info("Last healer changed: " + lastHealer); - } - } - - - public void onConfigChanged(ConfigChanged event) - { - if (counter != null && !config.defTimer()) - { - removeCounter(); - } - } - - private void addCounter() - { - if (!config.defTimer() || counter != null) - { - return; - } - - int itemSpriteId = ItemID.FIGHTER_TORSO; - - BufferedImage taskImg = itemManager.getImage(itemSpriteId); - counter = new CycleCounter(taskImg, this, tickNum); - - infoBoxManager.addInfoBox(counter); - } - - private void removeCounter() - { - if (counter == null) - { - return; - } - - infoBoxManager.removeInfoBox(counter); - counter = null; - } - - private void remove(String option, String target) - { - MenuEntry[] entries = client.getMenuEntries(); - int idx = searchIndex(entries, option, target); - if (idx >= 0 && entries[idx] != null) - { - entries = ArrayUtils.removeElement(entries, entries[idx]); - client.setMenuEntries(entries); - } - } - - private void remove(String[] options, String target) - { - MenuEntry[] entries = client.getMenuEntries(); - for (String option : options) - { - int idx = searchIndex(entries, option, target); - if (idx >= 0 && entries[idx] != null) - { - entries = ArrayUtils.removeElement(entries, entries[idx]); - } - } - - client.setMenuEntries(entries); - } - - private int searchIndex(MenuEntry[] entries, String option, String target) - { - for (int i = entries.length - 1; i >= 0; i--) - { - MenuEntry entry = entries[i]; - String entryOption = Text.removeTags(entry.getOption()).toLowerCase(); - String entryTarget = Text.removeTags(entry.getTarget()).toLowerCase(); - - if (entryOption.equals(option) && entryTarget.equals(target)) - { - return i; - } - } - - return -1; - } - - private boolean checkNewSpawn(NPC npc) - { - for (WorldPoint p : WorldPoint.toLocalInstance(client, healerSpawnPoint)) - { - if (p.distanceTo(npc.getWorldLocation()) < 5) - { - return true; - } - } - return false; - } - - @Override - public void keyTyped(KeyEvent e) - { - } - - @Override - public void keyPressed(KeyEvent e) - { - if (e.getKeyCode() == KeyEvent.VK_SHIFT) - { - shiftDown = true; - } - if (e.getKeyCode() == KeyEvent.VK_CONTROL) - { - ctrlDown = true; - } - } - - @Override - public void keyReleased(KeyEvent e) - { - if (e.getKeyCode() == KeyEvent.VK_SHIFT) - { - shiftDown = false; - } - if (e.getKeyCode() == KeyEvent.VK_CONTROL) - { - ctrlDown = false; - } - } - - private boolean isAnyPrayerActive() - { - for (Prayer pray : Prayer.values())//Check if any prayers are active - { - if (client.isPrayerActive(pray)) - { - return true; - } - } - - return false; - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/batools/Calls.java b/runelite-client/src/main/java/net/runelite/client/plugins/batools/Calls.java deleted file mode 100644 index 0fb721d7a2..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/batools/Calls.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * 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.batools; - -import java.util.HashMap; -import java.util.Map; -import lombok.Getter; - -@Getter -public enum Calls -{ - //Attacker Calls - RED_EGG("Red egg", "Tell-red"), - GREEN_EGG("Green egg", "Tell-green"), - BLUE_EGG("Blue egg", "Tell-blue"), - //Collector Calls - CONTROLLED("Controlled/Bullet/Wind", "Tell-controlled"), - ACCURATE("Accurate/Field/Water", "Tell-accurate"), - AGGRESSIVE("Aggressive/Blunt/Earth", "Tell-aggressive"), - DEFENSIVE("Defensive/Barbed/Fire", "Tell-defensive"), - //Healer Calls - TOFU("Tofu", "Tell-tofu"), - CRACKERS("Crackers", "Tell-crackers"), - WORMS("Worms", "Tell-worms"), - //Defender Calls - POIS_WORMS("Pois. Worms", "Tell-worms"), - POIS_TOFU("Pois. Tofu", "Tell-tofu"), - POIS_MEAT("Pois. Meat", "Tell-meat"); - - private final String call; - private final String option; - - private static final Map CALL_MENU = new HashMap<>(); - - static - { - for (Calls s : values()) - { - CALL_MENU.put(s.getCall(), s.getOption()); - } - } - - Calls(String call, String option) - { - this.call = call; - this.option = option; - } - - public static String getOption(String call) - { - return CALL_MENU.get(call); - } - -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/batools/Healer.java b/runelite-client/src/main/java/net/runelite/client/plugins/batools/Healer.java deleted file mode 100644 index 93382e57c0..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/batools/Healer.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * 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.batools; - - -import lombok.Getter; -import lombok.Setter; -import net.runelite.api.NPC; - - -class Healer -{ - - @Getter - private NPC npc; - - @Getter - @Setter - private int wave; - - @Getter - @Setter - private int spawnNumber; - - @Getter - @Setter - private int foodRemaining; - - @Getter - @Setter - private int lastFoodTime; - - @Getter - @Setter - private int firstCallFood; - - @Getter - @Setter - private int secondCallFood; - - Healer(NPC npc, int spawnNumber, int wave) - { - this.npc = npc; - this.wave = wave; - this.spawnNumber = spawnNumber; - this.firstCallFood = getCode(wave).getFirstCallFood()[spawnNumber]; - this.secondCallFood = getCode(wave).getSecondCallFood()[spawnNumber]; - this.foodRemaining = firstCallFood + secondCallFood; - this.lastFoodTime = getCode(wave).getSpacing()[spawnNumber]; - } - - private HealerCode getCode(int wave) - { - switch (wave) - { - case 1: - return HealerCode.WAVEONE; - case 2: - return HealerCode.WAVETWO; - case 3: - return HealerCode.WAVETHREE; - case 4: - return HealerCode.WAVEFOUR; - case 5: - return HealerCode.WAVEFIVE; - case 6: - return HealerCode.WAVESIX; - case 7: - return HealerCode.WAVESEVEN; - case 8: - return HealerCode.WAVEEIGHT; - case 9: - return HealerCode.WAVENINE; - case 10: - return HealerCode.WAVETEN; - default: - return null; - } - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/batools/HealerCode.java b/runelite-client/src/main/java/net/runelite/client/plugins/batools/HealerCode.java deleted file mode 100644 index a604239045..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/batools/HealerCode.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2018, https://runelitepl.us - * 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.batools; - -import lombok.Getter; - - -enum HealerCode -{ - - WAVEONE(new int[]{1, 1}, new int[]{0, 0}, new int[]{0, 0}), - WAVETWO(new int[]{1, 1, 2}, new int[]{0, 0, 0}, new int[]{0, 0, 21}), - WAVETHREE(new int[]{1, 6, 2}, new int[]{0, 0, 0}, new int[]{0, 0, 0}), - WAVEFOUR(new int[]{2, 5, 2, 0}, new int[]{0, 0, 7, 10}, new int[]{0, 0, 0, 0}), - WAVEFIVE(new int[]{2, 5, 2, 3, 0}, new int[]{0, 0, 0, 0, 7}, new int[]{0, 0, 21, 30, 0}), - WAVESIX(new int[]{3, 5, 2, 2, 0, 0}, new int[]{0, 0, 0, 2, 9, 10}, new int[]{12, 18, 21, 0, 0, 0}), - WAVESEVEN(new int[]{3, 7, 1, 1, 0, 0, 0}, new int[]{2, 0, 1, 1, 2, 4, 10}, new int[]{0, 21, 0, 0, 30, 45, 0}), - WAVEEIGHT(new int[]{1, 9, 1, 1, 0, 0, 0}, new int[]{1, 0, 1, 1, 2, 2, 10}, new int[]{0, 0, 0, 0, 33, 42, 0}), - WAVENINE(new int[]{2, 8, 1, 1, 0, 0, 0, 0}, new int[]{1, 0, 1, 1, 2, 1, 1, 10}, new int[]{0, 21, 0, 0, 0, 0, 0, 0, 0}), - WAVETEN(new int[]{2, 5, 1, 1, 0, 0, 0}, new int[]{1, 0, 1, 1, 4, 4, 8}, new int[]{21, 33, 0, 33, 30, 45, 0}); - - - @Getter - private final int[] firstCallFood; - @Getter - private final int[] secondCallFood; - @Getter - private final int[] spacing; - - HealerCode(int[] firstCallFood, int[] secondCallFood, int[] spacing) - { - this.firstCallFood = firstCallFood; - this.secondCallFood = secondCallFood; - this.spacing = spacing; - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java index 6fa4f65e1d..7af6fac5d7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java @@ -30,6 +30,7 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.util.Set; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import lombok.Getter; import net.runelite.api.Client; import net.runelite.api.EquipmentInventorySlot; @@ -214,6 +215,7 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu } private final String text; + @Nullable private final STASHUnit stashUnit; private final WorldPoint location; private final Emote firstEmote; @@ -256,15 +258,19 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu if (itemRequirements.length > 0) { Client client = plugin.getClient(); - client.runScript(ScriptID.WATSON_STASH_UNIT_CHECK, stashUnit.getObjectId(), 0, 0, 0); - int[] intStack = client.getIntStack(); - boolean stashUnitBuilt = intStack[0] == 1; - panelComponent.getChildren().add(LineComponent.builder() - .left("STASH Unit:") - .right(stashUnitBuilt ? UNICODE_CHECK_MARK : UNICODE_BALLOT_X) - .rightColor(stashUnitBuilt ? Color.GREEN : Color.RED) - .build()); + if (stashUnit != null) + { + client.runScript(ScriptID.WATSON_STASH_UNIT_CHECK, stashUnit.getObjectId(), 0, 0, 0); + int[] intStack = client.getIntStack(); + boolean stashUnitBuilt = intStack[0] == 1; + + panelComponent.getChildren().add(LineComponent.builder() + .left("STASH Unit:") + .right(stashUnitBuilt ? UNICODE_CHECK_MARK : UNICODE_BALLOT_X) + .rightColor(stashUnitBuilt ? Color.GREEN : Color.RED) + .build()); + } panelComponent.getChildren().add(LineComponent.builder().left("Equip:").build()); @@ -312,18 +318,21 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localPoint, plugin.getEmoteImage(), Color.ORANGE); } - final WorldPoint[] worldPoints = stashUnit.getWorldPoints(); - - for (final WorldPoint worldPoint : worldPoints) + if (stashUnit != null) { - final LocalPoint stashUnitLocalPoint = LocalPoint.fromWorld(plugin.getClient(), worldPoint); + final WorldPoint[] worldPoints = stashUnit.getWorldPoints(); - if (stashUnitLocalPoint != null) + for (final WorldPoint worldPoint : worldPoints) { - final Polygon poly = Perspective.getCanvasTilePoly(plugin.getClient(), stashUnitLocalPoint); - if (poly != null) + final LocalPoint stashUnitLocalPoint = LocalPoint.fromWorld(plugin.getClient(), worldPoint); + + if (stashUnitLocalPoint != null) { - OverlayUtil.renderPolygon(graphics, poly, Color.RED); + final Polygon poly = Perspective.getCanvasTilePoly(plugin.getClient(), stashUnitLocalPoint); + if (poly != null) + { + OverlayUtil.renderPolygon(graphics, poly, Color.RED); + } } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java index c75d54c5ac..001a2e0947 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java @@ -79,7 +79,7 @@ public class FaloTheBardClue extends ClueScroll implements TextClueScroll, NpcCl { private static final List CLUES = ImmutableList.of( new FaloTheBardClue("A blood red weapon, a strong curved sword, found on the island of primate lords.", item(DRAGON_SCIMITAR)), - new FaloTheBardClue("A book that preaches of some great figure, lending strength, might, and vigour.", any("Any god book (must be complete)", item(HOLY_BOOK), item(BOOK_OF_BALANCE), item(UNHOLY_BOOK), item(BOOK_OF_LAW), item(BOOK_OF_WAR), item(BOOK_OF_DARKNESS))), + new FaloTheBardClue("A book that preaches of some great figure, lending strength, might and vigour.", any("Any god book (must be complete)", item(HOLY_BOOK), item(BOOK_OF_BALANCE), item(UNHOLY_BOOK), item(BOOK_OF_LAW), item(BOOK_OF_WAR), item(BOOK_OF_DARKNESS))), new FaloTheBardClue("A bow of elven craft was made, it shimmers bright, but will soon fade.", any("Crystal Bow", range(NEW_CRYSTAL_BOW, CRYSTAL_BOW_110), range(NEW_CRYSTAL_BOW_I, CRYSTAL_BOW_110_I))), new FaloTheBardClue("A fiery axe of great inferno, when you use it, you'll wonder where the logs go.", item(INFERNAL_AXE)), new FaloTheBardClue("A mark used to increase one's grace, found atop a seer's place.", item(MARK_OF_GRACE)), @@ -88,7 +88,7 @@ public class FaloTheBardClue extends ClueScroll implements TextClueScroll, NpcCl // The wiki doesn't specify whether the trimmed dragon defender will work so I've assumed that it doesn't new FaloTheBardClue("A sword held in the other hand, red its colour, Cyclops strength you must withstand.", item(DRAGON_DEFENDER)), new FaloTheBardClue("A token used to kill mythical beasts, in hopes of a blade or just for an xp feast.", item(WARRIOR_GUILD_TOKEN)), - new FaloTheBardClue("Green is my favorite, mature ale I do love, this takes your herblore above.", item(GREENMANS_ALEM)), + new FaloTheBardClue("Green is my favourite, mature ale I do love, this takes your herblore above.", item(GREENMANS_ALEM)), new FaloTheBardClue("It can hold down a boat or crush a goat, this object, you see, is quite heavy.", item(BARRELCHEST_ANCHOR)), new FaloTheBardClue("It comes from the ground, underneath the snowy plain. Trolls aplenty, with what looks like a mane.", item(BASALT)), new FaloTheBardClue("No attack to wield, only strength is required, made of obsidian, but with no room for a shield.", item(TZHAARKETOM)), 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 39553d8271..4a4aec4bb8 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 @@ -633,6 +633,26 @@ public class ConfigPanel extends PluginPanel { show = Boolean.parseBoolean(configManager.getConfiguration(cd.getGroup().value(), cid2.getItem().keyName())); } + else if (cid2.getType().isEnum()) + { + Class type = (Class) cid2.getType(); + try + { + Enum selectedItem = Enum.valueOf(type, configManager.getConfiguration(cd.getGroup().value(), cid2.getItem().keyName())); + if (!cid.getItem().unhideValue().equals("")) + { + show = selectedItem.toString().equals(cid.getItem().unhideValue()); + } + else if (!cid.getItem().hideValue().equals("")) + { + show = !selectedItem.toString().equals(cid.getItem().hideValue()); + } + } + catch (IllegalArgumentException ex) + { + log.info("So bad, so sad: {}", ex.toString()); + } + } } if (show) @@ -817,7 +837,7 @@ public class ConfigPanel extends PluginPanel } } }); - + if (cid.getItem().parse()) { JLabel parsingLabel = new JLabel(); @@ -1067,8 +1087,8 @@ public class ConfigPanel extends PluginPanel .splitToList(String.format("%s || %s", cid2.getItem().unhide(), cid2.getItem().hide())); if (itemHide.contains(cid.getItem().keyName())) - { // If another options visibility changes depending on the value of this checkbox, then render the entire menu again - + { + // If another options visibility changes depending on the value of this checkbox, then render the entire menu again reloadPluginlist(listItem, config, cd); } } @@ -1107,6 +1127,36 @@ public class ConfigPanel extends PluginPanel { JComboBox jComboBox = (JComboBox) component; configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), ((Enum) jComboBox.getSelectedItem()).name()); + + for (ConfigItemDescriptor cid2 : cd.getItems()) + { + if (cid2.getItem().hidden() || !cid2.getItem().hide().isEmpty()) + { + List itemHide = Splitter + .onPattern("\\|\\|") + .trimResults() + .omitEmptyStrings() + .splitToList(String.format("%s || %s", cid2.getItem().unhide(), cid2.getItem().hide())); + + if (itemHide.contains(cid.getItem().keyName())) + { + reloadPluginlist(listItem, config, cd); + } + + String changedVal = ((Enum) jComboBox.getSelectedItem()).name(); + + if (cid2.getItem().enabledBy().contains(cid.getItem().keyName()) && cid2.getItem().enabledByValue().equals(changedVal)) + { + configManager.setConfiguration(cd.getGroup().value(), cid2.getItem().keyName(), "true"); + reloadPluginlist(listItem, config, cd); + } + else if (cid2.getItem().disabledBy().contains(cid.getItem().keyName()) && cid2.getItem().disabledByValue().equals(changedVal)) + { + configManager.setConfiguration(cd.getGroup().value(), cid2.getItem().keyName(), "false"); + reloadPluginlist(listItem, config, cd); + } + } + } } else if (component instanceof HotkeyButton) { @@ -1223,4 +1273,4 @@ public class ConfigPanel extends PluginPanel { openGroupConfigPanel(listItem, config, cd, true); } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java index c2fca071ff..976d81c4a0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java @@ -172,7 +172,8 @@ public class CookingPlugin extends Plugin session.increaseCookAmount(); } - else if (message.startsWith("You accidentally burn")) + else if (message.startsWith("You accidentally burn") + || message.startsWith("You accidentally spoil")) { if (session == null) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java index 9dab05f168..abc6d7578e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java @@ -43,10 +43,8 @@ import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.ComponentConstants; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; -import net.runelite.client.ui.overlay.components.table.TableAlignment; -import net.runelite.client.ui.overlay.components.table.TableComponent; -import net.runelite.client.util.ColorUtil; class CorpDamageOverlay extends Overlay { @@ -93,9 +91,6 @@ class CorpDamageOverlay extends Overlay panelComponent.getChildren().clear(); - TableComponent tableComponent = new TableComponent(); - tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - NPC core = corpPlugin.getCore(); if (core != null) { @@ -119,14 +114,25 @@ class CorpDamageOverlay extends Overlay int textWidth = Math.max(ComponentConstants.STANDARD_WIDTH, fontMetrics.stringWidth(text)); panelComponent.setPreferredSize(new Dimension(textWidth, 0)); - tableComponent.addRow(ColorUtil.prependColorTag(text, Color.RED), ""); + panelComponent.getChildren().add(LineComponent.builder() + .left(text) + .leftColor(Color.RED) + .build()); } } if (config.showDamage()) { - tableComponent.addRow("Your damage", ColorUtil.prependColorTag(Integer.toString(myDamage), damageForKill > 0 && myDamage >= damageForKill ? Color.GREEN : Color.RED)); - tableComponent.addRow("Total damage:", Integer.toString(totalDamage)); + panelComponent.getChildren().add(LineComponent.builder() + .left("Your damage") + .right(Integer.toString(myDamage)) + .rightColor(damageForKill > 0 && myDamage >= damageForKill ? Color.GREEN : Color.RED) + .build()); + + panelComponent.getChildren().add(LineComponent.builder() + .left("Total damage") + .right(Integer.toString(totalDamage)) + .build()); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java index 893b44ff94..4218f092c6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxOverlay.java @@ -206,7 +206,7 @@ public class CoxOverlay extends Overlay if (plugin.isHandCripple()) { - int tick = plugin.getTimer(); + int tick = plugin.getCrippleTimer(); NPC olmHand = plugin.getHand(); final String tickStr = String.valueOf(tick); Point canvasPoint = olmHand.getCanvasTextLocation(graphics, tickStr, 50); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java index 975638265e..f5f08b1199 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/CoxPlugin.java @@ -132,7 +132,7 @@ public class CoxPlugin extends Plugin @Getter(AccessLevel.PACKAGE) private Actor acidTarget; @Getter(AccessLevel.PACKAGE) - private int timer = 45; + private int crippleTimer = 45; @Getter(AccessLevel.PACKAGE) private int burnTicks = 41; @Getter(AccessLevel.PACKAGE) @@ -172,7 +172,7 @@ public class CoxPlugin extends Plugin Olm_TP.clear(); prayAgainstOlm = null; burnTarget.clear(); - timer = 45; + crippleTimer = 45; burnTicks = 40; acidTicks = 25; teleportTicks = 10; @@ -225,6 +225,7 @@ public class CoxPlugin extends Plugin OlmPhase = 0; runOlm = true; needOlm = true; + crippleTimer = 45; Olm_NextSpec = -1; break; case "the great olm fires a sphere of aggression your way. your prayers have been sapped.": @@ -251,6 +252,8 @@ public class CoxPlugin extends Plugin prayAgainstOlm = PrayAgainst.RANGED; lastPrayTime = System.currentTimeMillis(); break; + case "the great olm's left claw clenches to protect itself temporarily.": + HandCripple = true; } } @@ -450,11 +453,11 @@ public class CoxPlugin extends Plugin if (HandCripple) { - timer--; - if (timer <= 0) + crippleTimer--; + if (crippleTimer <= 0) { HandCripple = false; - timer = 45; + crippleTimer = 45; } } 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 39ed1376d6..91876b555c 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 @@ -133,6 +133,8 @@ class DevToolsPanel extends PluginPanel } }); + container.add(plugin.getSoundEffects()); + return container; } } 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 6300725156..cc64835acb 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 @@ -100,6 +100,9 @@ public class DevToolsPlugin extends Plugin @Inject private WorldMapRegionOverlay mapRegionOverlay; + @Inject + private SoundEffectOverlay soundEffectOverlay; + @Inject private EventBus eventBus; @@ -128,6 +131,7 @@ public class DevToolsPlugin extends Plugin private DevToolsButton widgetInspector; private DevToolsButton varInspector; private DevToolsButton logMenuActions; + private DevToolsButton soundEffects; private NavigationButton navButton; @Provides @@ -154,30 +158,35 @@ public class DevToolsPlugin extends Plugin location = new DevToolsButton("Location"); worldMapLocation = new DevToolsButton("World Map Location"); + tileLocation = new DevToolsButton("Tile Location"); cursorPos = new DevToolsButton("Cursor Position"); + cameraPosition = new DevToolsButton("Camera Position"); - chunkBorders = new DevToolsButton("Chunk Borders"); - mapSquares = new DevToolsButton("Map Squares"); + mapSquares = new DevToolsButton("Map Squares"); lineOfSight = new DevToolsButton("Line Of Sight"); + validMovement = new DevToolsButton("Valid Movement"); interacting = new DevToolsButton("Interacting"); - examine = new DevToolsButton("Examine"); + examine = new DevToolsButton("Examine"); detachedCamera = new DevToolsButton("Detached Camera"); + widgetInspector = new DevToolsButton("Widget Inspector"); varInspector = new DevToolsButton("Var Inspector"); + soundEffects = new DevToolsButton("Sound Effects"); + logMenuActions = new DevToolsButton("Menu Actions"); + overlayManager.add(overlay); overlayManager.add(locationOverlay); overlayManager.add(sceneOverlay); overlayManager.add(cameraOverlay); overlayManager.add(worldMapLocationOverlay); overlayManager.add(mapRegionOverlay); - - logMenuActions = new DevToolsButton("Menu Actions"); + overlayManager.add(soundEffectOverlay); final DevToolsPanel panel = injector.getInstance(DevToolsPanel.class); @@ -191,17 +200,21 @@ public class DevToolsPlugin extends Plugin .build(); clientToolbar.addNavigation(navButton); + + eventBus.register(soundEffectOverlay); } @Override protected void shutDown() throws Exception { + eventBus.unregister(soundEffectOverlay); overlayManager.remove(overlay); overlayManager.remove(locationOverlay); overlayManager.remove(sceneOverlay); overlayManager.remove(cameraOverlay); overlayManager.remove(worldMapLocationOverlay); overlayManager.remove(mapRegionOverlay); + overlayManager.remove(soundEffectOverlay); clientToolbar.removeNavigation(navButton); } @@ -341,6 +354,12 @@ public class DevToolsPlugin extends Plugin player.getPlayerAppearance().setHash(); break; } + case "sound": + { + int id = Integer.parseInt(args[0]); + client.playSoundEffect(id); + break; + } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java new file mode 100644 index 0000000000..fbe2254066 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SoundEffectOverlay.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2018, WooxSolo + * 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.devtools; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.Player; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.AreaSoundEffectPlayed; +import net.runelite.api.events.SoundEffectPlayed; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; + +class SoundEffectOverlay extends Overlay +{ + private final static int MAX_LINES = 16; + private final static Color COLOR_SOUND_EFFECT = Color.WHITE; + private final static Color COLOR_AREA_SOUND_EFFECT = Color.YELLOW; + private final static Color COLOR_SILENT_SOUND_EFFECT = Color.GRAY; + + private final Client client; + private final DevToolsPlugin plugin; + private final PanelComponent panelComponent = new PanelComponent(); + + @Inject + SoundEffectOverlay(Client client, DevToolsPlugin plugin) + { + this.client = client; + this.plugin = plugin; + panelComponent.setPreferredSize(new Dimension(200, 0)); + panelComponent.getChildren().add(LineComponent.builder() + .left("Sound Effects") + .leftColor(Color.CYAN) + .build()); + setPosition(OverlayPosition.TOP_LEFT); + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (!plugin.getSoundEffects().isActive()) + { + return null; + } + + return panelComponent.render(graphics); + } + + @Subscribe + public void onSoundEffectPlayed(SoundEffectPlayed event) + { + if (!plugin.getSoundEffects().isActive()) + { + return; + } + + String text = + "Id: " + event.getSoundId() + + " - D: " + event.getDelay(); + + panelComponent.getChildren().add(LineComponent.builder() + .left(text) + .leftColor(COLOR_SOUND_EFFECT) + .build()); + + checkMaxLines(); + } + + @Subscribe + public void onAreaSoundEffectPlayed(AreaSoundEffectPlayed event) + { + if (!plugin.getSoundEffects().isActive()) + { + return; + } + + Color textColor = COLOR_AREA_SOUND_EFFECT; + + // Check if the player is within range to hear the sound + Player localPlayer = client.getLocalPlayer(); + if (localPlayer != null) + { + LocalPoint lp = localPlayer.getLocalLocation(); + if (lp != null) + { + int sceneX = lp.getSceneX(); + int sceneY = lp.getSceneY(); + int distance = Math.abs(sceneX - event.getSceneX()) + Math.abs(sceneY - event.getSceneY()); + if (distance > event.getRange()) + { + textColor = COLOR_SILENT_SOUND_EFFECT; + } + } + } + + String text = + "Id: " + event.getSoundId() + + " - L: " + event.getSceneX() + "," + event.getSceneY() + + " - R: " + event.getRange() + + " - D: " + event.getDelay(); + + panelComponent.getChildren().add(LineComponent.builder() + .left(text) + .leftColor(textColor) + .build()); + + checkMaxLines(); + } + + private void checkMaxLines() + { + while (panelComponent.getChildren().size() > MAX_LINES) + { + panelComponent.getChildren().remove(1); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java index ade94fa6f6..a4b21cb94d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WidgetField.java @@ -88,7 +88,6 @@ public class WidgetField } else { - setter.accept(widget, (T) value); log.warn("Type {} is not supported for editing", type); } setter.accept(widget, (T) value); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java index 009a448092..1e136267b8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/WorldMapRegionOverlay.java @@ -47,7 +47,7 @@ class WorldMapRegionOverlay extends Overlay private static final int LABEL_PADDING = 4; private static final int REGION_SIZE = 1 << 6; // Bitmask to return first coordinate in region - private static final int REGION_TRUNCATE = -(1 << 6); + private static final int REGION_TRUNCATE = ~((1 << 6) - 1); private final Client client; private final DevToolsPlugin plugin; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatListener.java deleted file mode 100644 index 3dabc56600..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatListener.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * Copyright (c) 2018, Abexlry - * 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.entertochat; - -import com.google.common.base.Strings; -import java.awt.event.KeyEvent; -import java.util.HashMap; -import java.util.Map; -import javax.inject.Inject; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.VarClientStr; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.input.KeyListener; -import net.runelite.client.input.MouseAdapter; - -class EnterToChatListener extends MouseAdapter implements KeyListener -{ - @Inject - private EnterToChatPlugin plugin; - - @Inject - private Client client; - - @Inject - private ClientThread clientThread; - - private final Map modified = new HashMap<>(); - - @Override - public void keyTyped(KeyEvent e) - { - } - - @Override - public void keyPressed(KeyEvent e) - { - if (client.getGameState() != GameState.LOGGED_IN || !plugin.chatboxFocused()) - { - return; - } - - if (!plugin.isTyping()) - { - switch (e.getKeyCode()) - { - case KeyEvent.VK_ENTER: - case KeyEvent.VK_SLASH: - case KeyEvent.VK_COLON: - // refocus chatbox - plugin.setTyping(true); - clientThread.invoke(() -> - { - plugin.unlockChat(); - }); - break; - } - } - else - { - switch (e.getKeyCode()) - { - case KeyEvent.VK_ENTER: - plugin.setTyping(false); - clientThread.invoke(() -> - { - plugin.lockChat(); - }); - break; - case KeyEvent.VK_ESCAPE: - plugin.setTyping(false); - clientThread.invoke(() -> - { - client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); - plugin.lockChat(); - }); - break; - case KeyEvent.VK_BACK_SPACE: - if (Strings.isNullOrEmpty(client.getVar(VarClientStr.CHATBOX_TYPED_TEXT))) - { - plugin.setTyping(false); - clientThread.invoke(() -> plugin.lockChat()); - } - } - } - } - - @Override - public void keyReleased(KeyEvent e) - { - if (client.getGameState() != GameState.LOGGED_IN) - { - return; - } - - if (plugin.chatboxFocused() && !plugin.isTyping()) - { - modified.remove(e.getKeyCode()); - - } - else - { - // press d + enter + release d - causes the right arrow to never be released - Integer m = modified.get(e.getKeyCode()); - if (m != null) - { - modified.remove(e.getKeyCode()); - e.setKeyCode(m); - } - } - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatPlugin.java deleted file mode 100644 index c8e5edfbb1..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/entertochat/EnterToChatPlugin.java +++ /dev/null @@ -1,207 +0,0 @@ -/*' - * Copyright (c) 2018, Adam - * Copyright (c) 2018, Abexlry - * 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.entertochat; - -import java.awt.Color; -import javax.inject.Inject; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.IconID; -import net.runelite.api.VarClientInt; -import net.runelite.api.VarClientStr; -import net.runelite.api.Varbits; -import net.runelite.api.events.ScriptCallbackEvent; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetInfo; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.input.KeyManager; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.plugins.PluginType; -import net.runelite.client.ui.JagexColors; -import net.runelite.client.util.ColorUtil; - -@PluginDescriptor( - name = "Press Enter to Chat", - description = "'Press Enter to Chat'", - tags = {"enter", "chat"}, - type = PluginType.UTILITY, - enabledByDefault = false -) - -public class EnterToChatPlugin extends Plugin -{ - private static final String PRESS_ENTER_TO_CHAT = "Press Enter to Chat..."; - private static final String SCRIPT_EVENT_SET_CHATBOX_INPUT = "setChatboxInput"; - private static final String SCRIPT_EVENT_BLOCK_CHAT_INPUT = "blockChatInput"; - - @Inject - private Client client; - - @Inject - private ClientThread clientThread; - - @Inject - private ConfigManager configManager; - - @Inject - private KeyManager keyManager; - - @Inject - private EnterToChatListener inputListener; - - @Getter(AccessLevel.PACKAGE) - @Setter(AccessLevel.PACKAGE) - private boolean typing; - - @Override - protected void startUp() throws Exception - { - configManager.setConfiguration("runelite", "wasdcameraplugin", false); - typing = false; - keyManager.registerKeyListener(inputListener); - - clientThread.invoke(() -> - { - if (client.getGameState() == GameState.LOGGED_IN) - { - lockChat(); - } - }); - } - - @Override - protected void shutDown() throws Exception - { - clientThread.invoke(() -> - { - if (client.getGameState() == GameState.LOGGED_IN) - { - unlockChat(); - } - }); - - keyManager.unregisterKeyListener(inputListener); - } - - - boolean chatboxFocused() - { - Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); - if (chatboxParent == null || chatboxParent.getOnKeyListener() == null) - { - return false; - } - - // the search box on the world map can be focused, and chat input goes there, even - // though the chatbox still has its key listener. - Widget worldMapSearch = client.getWidget(WidgetInfo.WORLD_MAP_SEARCH); - return worldMapSearch == null || client.getVar(VarClientInt.WORLD_MAP_SEARCH_FOCUSED) != 1; - - } - - @Subscribe - public void onScriptCallbackEvent(ScriptCallbackEvent scriptCallbackEvent) - { - switch (scriptCallbackEvent.getEventName()) - { - case SCRIPT_EVENT_SET_CHATBOX_INPUT: - Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); - if (chatboxInput != null) - { - if (chatboxFocused() && !typing) - { - chatboxInput.setText(PRESS_ENTER_TO_CHAT); - } - } - break; - case SCRIPT_EVENT_BLOCK_CHAT_INPUT: - if (!typing) - { - int[] intStack = client.getIntStack(); - int intStackSize = client.getIntStackSize(); - intStack[intStackSize - 1] = 1; - } - break; - } - } - - void lockChat() - { - Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); - if (chatboxParent != null && chatboxParent.getOnKeyListener() != null) - { - Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); - if (chatboxInput != null) - { - chatboxInput.setText(PRESS_ENTER_TO_CHAT); - } - } - } - - void unlockChat() - { - Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); - if (chatboxParent != null) - { - Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); - if (chatboxInput != null) - { - if (client.getGameState() == GameState.LOGGED_IN) - { - final boolean isChatboxTransparent = client.isResized() && client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1; - final Color textColor = isChatboxTransparent ? JagexColors.CHAT_TYPED_TEXT_TRANSPARENT_BACKGROUND : JagexColors.CHAT_TYPED_TEXT_OPAQUE_BACKGROUND; - chatboxInput.setText(getPlayerNameWithIcon() + ": " + ColorUtil.wrapWithColorTag(client.getVar(VarClientStr.CHATBOX_TYPED_TEXT) + "*", textColor)); - } - } - } - } - - private String getPlayerNameWithIcon() - { - IconID icon; - switch (client.getAccountType()) - { - case IRONMAN: - icon = IconID.IRONMAN; - break; - case ULTIMATE_IRONMAN: - icon = IconID.ULTIMATE_IRONMAN; - break; - case HARDCORE_IRONMAN: - icon = IconID.HARDCORE_IRONMAN; - break; - default: - return client.getLocalPlayer().getName(); - } - return icon + client.getLocalPlayer().getName(); - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java index 94f774ccc0..04dc3bacf8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java @@ -82,6 +82,9 @@ import static net.runelite.api.NpcID.FISHING_SPOT_7733; import static net.runelite.api.NpcID.FISHING_SPOT_7946; import static net.runelite.api.NpcID.FISHING_SPOT_7947; import static net.runelite.api.NpcID.FISHING_SPOT_8523; +import static net.runelite.api.NpcID.FISHING_SPOT_8525; +import static net.runelite.api.NpcID.FISHING_SPOT_8526; +import static net.runelite.api.NpcID.FISHING_SPOT_8527; import static net.runelite.api.NpcID.ROD_FISHING_SPOT; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1508; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1509; @@ -94,6 +97,7 @@ import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7463; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7464; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7468; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7676; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_8524; @Getter enum FishingSpot @@ -115,7 +119,8 @@ enum FishingSpot FISHING_SPOT_1511, FISHING_SPOT_1520, FISHING_SPOT_3915, FISHING_SPOT_4476, FISHING_SPOT_4477, FISHING_SPOT_5233, FISHING_SPOT_5234, FISHING_SPOT_5821, FISHING_SPOT_7200, - FISHING_SPOT_7461, FISHING_SPOT_7466 + FISHING_SPOT_7461, FISHING_SPOT_7466, FISHING_SPOT_8525, + FISHING_SPOT_8526, FISHING_SPOT_8527 ), MONKFISH("Monkfish", ItemID.RAW_MONKFISH, FISHING_SPOT_4316 @@ -124,7 +129,7 @@ enum FishingSpot ROD_FISHING_SPOT, ROD_FISHING_SPOT_1508, ROD_FISHING_SPOT_1509, ROD_FISHING_SPOT_1513, ROD_FISHING_SPOT_1515, ROD_FISHING_SPOT_1526, ROD_FISHING_SPOT_1527, ROD_FISHING_SPOT_7463, ROD_FISHING_SPOT_7464, - ROD_FISHING_SPOT_7468 + ROD_FISHING_SPOT_7468, ROD_FISHING_SPOT_8524 ), BARB_FISH("Sturgeon, Salmon, Trout", ItemID.LEAPING_STURGEON, FISHING_SPOT_1542, FISHING_SPOT_7323 diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java index 14bafcce93..4acdaa8dd4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersConfig.java @@ -58,182 +58,182 @@ public interface HidePrayersConfig extends Config @ConfigItem( position = 1, - keyName = "HideTHICK_SKIN", - name = "Hide Thick Skin", + keyName = "ShowTHICK_SKIN", + name = "Show Thick Skin", description = "Hide/Show Thick Skin", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideTHICK_SKIN() + default boolean ShowTHICK_SKIN() { return false; } @ConfigItem( position = 2, - keyName = "HideBURST_OF_STRENGTH", - name = "Hide Burst of Strength", + keyName = "ShowBURST_OF_STRENGTH", + name = "Show Burst of Strength", description = "Hide/Show Burst of Strength", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideBURST_OF_STRENGTH() + default boolean ShowBURST_OF_STRENGTH() { return false; } @ConfigItem( position = 3, - keyName = "HideCLARITY_OF_THOUGHT", - name = "Hide Clarity of Thought", + keyName = "ShowCLARITY_OF_THOUGHT", + name = "Show Clarity of Thought", description = "Hide/Show Clarity of Thought", group = "Individual Prayers", hidden = true, - unhide = "showindividualprayers" + unhide = "Showindividualprayers" ) - default boolean HideCLARITY_OF_THOUGHT() + default boolean ShowCLARITY_OF_THOUGHT() { return false; } @ConfigItem( position = 4, - keyName = "HideSHARP_EYE", - name = "Hide Sharp Eye", + keyName = "ShowSHARP_EYE", + name = "Show Sharp Eye", description = "Hide/Show Sharp Eye", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideSHARP_EYE() + default boolean ShowSHARP_EYE() { return false; } @ConfigItem( position = 5, - keyName = "HideMYSTIC_WILL", - name = "Hide Mystic Will", + keyName = "ShowMYSTIC_WILL", + name = "Show Mystic Will", description = "Hide/Show Mystic Will", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideMYSTIC_WILL() + default boolean ShowMYSTIC_WILL() { return false; } @ConfigItem( position = 6, - keyName = "HideROCK_SKIN", - name = "Hide Rock Skin", + keyName = "ShowROCK_SKIN", + name = "Show Rock Skin", description = "Hide/Show Rock Skin", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideROCK_SKIN() + default boolean ShowROCK_SKIN() { return false; } @ConfigItem( position = 7, - keyName = "HideSUPERHUMAN_STRENGTH", - name = "Hide Super Human Strength", + keyName = "ShowSUPERHUMAN_STRENGTH", + name = "Show Super Human Strength", description = "Hide/Show Super Human Strength", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideSUPERHUMAN_STRENGTH() + default boolean ShowSUPERHUMAN_STRENGTH() { return false; } @ConfigItem( position = 8, - keyName = "HideIMPROVED_REFLEXES", - name = "Hide Improved_Reflexes", + keyName = "ShowIMPROVED_REFLEXES", + name = "Show Improved_Reflexes", description = "Hide/Show Improved_Reflexes", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideIMPROVED_REFLEXES() + default boolean ShowIMPROVED_REFLEXES() { return false; } @ConfigItem( position = 9, - keyName = "HideRapidRestore", - name = "Hide Rapid Restore", + keyName = "ShowRapidRestore", + name = "Show Rapid Restore", description = "Hide/Show Rapid Restore", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRapidRestore() + default boolean ShowRapidRestore() { return false; } @ConfigItem( position = 10, - keyName = "HideRapidHeal", - name = "Hide Rapid Heal", + keyName = "ShowRapidHeal", + name = "Show Rapid Heal", description = "Hide/Show Rapid Heal", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRapidHeal() + default boolean ShowRapidHeal() { return false; } @ConfigItem( position = 11, - keyName = "HideProtectItem", - name = "Hide Protect Item", + keyName = "ShowProtectItem", + name = "Show Protect Item", description = "Hide/Show Protect Item", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideProtectItem() + default boolean ShowProtectItem() { return false; } @ConfigItem( position = 12, - keyName = "HideHAWK_EYE", - name = "Hide Hawk Eye", + keyName = "ShowHAWK_EYE", + name = "Show Hawk Eye", description = "Hide/Show Hawk Eye", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideHAWK_EYE() + default boolean ShowHAWK_EYE() { return false; } @ConfigItem( position = 13, - keyName = "HideMYSTIC_LORE", - name = "Hide Mystic Lore", + keyName = "ShowMYSTIC_LORE", + name = "Show Mystic Lore", description = "Hide/Show Mystic Lore", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideMYSTIC_LORE() + default boolean ShowMYSTIC_LORE() { return false; } @@ -241,224 +241,224 @@ public interface HidePrayersConfig extends Config @ConfigItem( position = 14, - keyName = "HideSteelSkin", - name = "Hide Steel Skin", + keyName = "ShowSteelSkin", + name = "Show Steel Skin", description = "Hide/Show Steel skin", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideSteelSkin() + default boolean ShowSteelSkin() { return false; } @ConfigItem( position = 15, - keyName = "HideUltimateStrength", - name = "Hide Ultimate Strength", + keyName = "ShowUltimateStrength", + name = "Show Ultimate Strength", description = "Hide/Show Ultimate strength", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideUltimateStrength() + default boolean ShowUltimateStrength() { return false; } @ConfigItem( position = 16, - keyName = "HideIncredibleReflex", - name = "Hide Incredible Reflex", + keyName = "ShowIncredibleReflex", + name = "Show Incredible Reflex", description = "Hide/Show Incredible Reflex", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideIncredibleReflex() + default boolean ShowIncredibleReflex() { return false; } @ConfigItem( position = 17, - keyName = "HidePTFMagic", - name = "Hide Protect From Magic", + keyName = "ShowPTFMagic", + name = "Show Protect From Magic", description = "Hide/Show Protect From Magic", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePTFMagic() + default boolean ShowPTFMagic() { return false; } @ConfigItem( position = 18, - keyName = "HidePTFRange", - name = "Hide Protect From Range", + keyName = "ShowPTFRange", + name = "Show Protect From Range", description = "Hide/Show Protect from Range", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePTFRange() + default boolean ShowPTFRange() { return false; } @ConfigItem( position = 19, - keyName = "HidePTFMelee", - name = "Hide Protect From Melee", + keyName = "ShowPTFMelee", + name = "Show Protect From Melee", description = "Hide/Show Protect From Melee", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePTFMelee() + default boolean ShowPTFMelee() { return false; } @ConfigItem( position = 20, - keyName = "HideEagle", - name = "Hide Eagle Eye", + keyName = "ShowEagle", + name = "Show Eagle Eye", description = "Hide/Show Eagle Eye", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideEagle() + default boolean ShowEagle() { return false; } @ConfigItem( position = 19, - keyName = "HideMystic", - name = "Hide Mystic Might", + keyName = "ShowMystic", + name = "Show Mystic Might", description = "Hide/Show Mystic Might", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideMystic() + default boolean ShowMystic() { return false; } @ConfigItem( position = 21, - keyName = "HideRETRIBUTION", - name = "Hide Retribution", + keyName = "ShowRETRIBUTION", + name = "Show Retribution", description = "Hide/Show Retribution", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRETRIBUTION() + default boolean ShowRETRIBUTION() { return false; } @ConfigItem( position = 22, - keyName = "HideRedemption", - name = "Hide Redemption", + keyName = "ShowRedemption", + name = "Show Redemption", description = "Hide/Show Redemption", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRedemption() + default boolean ShowRedemption() { return false; } @ConfigItem( position = 23, - keyName = "HideSmite", - name = "Hide Smite", + keyName = "ShowSmite", + name = "Show Smite", description = "Hide/Show Smite", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideSmite() + default boolean ShowSmite() { return false; } @ConfigItem( position = 24, - keyName = "HidePreserve", - name = "Hide Preserve", + keyName = "ShowPreserve", + name = "Show Preserve", description = "Hide/Show Preserve", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePreserve() + default boolean ShowPreserve() { return false; } @ConfigItem( position = 25, - keyName = "HideChivalry", - name = "Hide Chivalry", + keyName = "ShowChivalry", + name = "Show Chivalry", description = "Hide/Show Chivalry", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideChivalry() + default boolean ShowChivalry() { return false; } @ConfigItem( position = 26, - keyName = "HidePiety", - name = "Hide Piety", + keyName = "ShowPiety", + name = "Show Piety", description = "Hide/Show Piety", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HidePiety() + default boolean ShowPiety() { return false; } @ConfigItem( position = 27, - keyName = "HideRigour", - name = "Hide Rigour", + keyName = "ShowRigour", + name = "Show Rigour", description = "Hide/Show Rigour", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideRigour() + default boolean ShowRigour() { return false; } @ConfigItem( position = 28, - keyName = "HideAugury", - name = "Hide Augury", + keyName = "ShowAugury", + name = "Show Augury", description = "Hide/Show Augury", group = "Individual Prayers", hidden = true, unhide = "showindividualprayers" ) - default boolean HideAugury() + default boolean ShowAugury() { return false; } @@ -723,4 +723,4 @@ public interface HidePrayersConfig extends Config { return false; } -} \ No newline at end of file +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java index d2e4bba211..15ae602352 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hideprayers/HidePrayersPlugin.java @@ -252,35 +252,35 @@ public class HidePrayersPlugin extends Plugin if (config.showindividualprayers()) { - prayerWidgets.get(0).setHidden(!config.HideTHICK_SKIN()); // Thick Skin - prayerWidgets.get(1).setHidden(!config.HideBURST_OF_STRENGTH()); // Burst of Strength - prayerWidgets.get(2).setHidden(!config.HideCLARITY_OF_THOUGHT()); // Clarity of Thought - prayerWidgets.get(3).setHidden(!config.HideSHARP_EYE()); // Sharp Eye - prayerWidgets.get(4).setHidden(!config.HideMYSTIC_WILL()); // Mystic Will - prayerWidgets.get(5).setHidden(!config.HideROCK_SKIN()); // Rock Skin - prayerWidgets.get(6).setHidden(!config.HideSUPERHUMAN_STRENGTH()); // Super Human Strength - prayerWidgets.get(7).setHidden(!config.HideIMPROVED_REFLEXES()); // Improved_Reflexes - prayerWidgets.get(8).setHidden(!config.HideRapidRestore()); // Rapid Restore - prayerWidgets.get(9).setHidden(!config.HideRapidHeal()); // Rapid Heal - prayerWidgets.get(10).setHidden(!config.HideProtectItem()); // Protect Item - prayerWidgets.get(11).setHidden(!config.HideHAWK_EYE()); // Hawk Eye - prayerWidgets.get(12).setHidden(!config.HideMYSTIC_LORE()); // Mystic Lore - prayerWidgets.get(13).setHidden(!config.HideSteelSkin()); // Steel Skin - prayerWidgets.get(14).setHidden(!config.HideUltimateStrength()); // Ultimate Strength - prayerWidgets.get(15).setHidden(!config.HideIncredibleReflex()); // Incredible Reflexes - prayerWidgets.get(16).setHidden(!config.HidePTFMagic()); // Protect from Magic - prayerWidgets.get(17).setHidden(!config.HidePTFRange()); // Protect from Range - prayerWidgets.get(18).setHidden(!config.HidePTFMelee()); // Protect from Melee - prayerWidgets.get(19).setHidden(!config.HideEagle()); // eagle eye - prayerWidgets.get(20).setHidden(!config.HideMystic()); // Mystic Might - prayerWidgets.get(21).setHidden(!config.HideRETRIBUTION()); // Retribution - prayerWidgets.get(22).setHidden(!config.HideRedemption()); // Redemption - prayerWidgets.get(23).setHidden(!config.HideSmite()); // Smite - prayerWidgets.get(24).setHidden(!config.HidePreserve()); // Preserve - prayerWidgets.get(25).setHidden(!config.HideChivalry()); // Chivalry - prayerWidgets.get(26).setHidden(!config.HidePiety()); // Piety - prayerWidgets.get(27).setHidden(!config.HideRigour()); // Rigour - prayerWidgets.get(28).setHidden(!config.HideAugury()); // Augury + prayerWidgets.get(0).setHidden(!config.ShowTHICK_SKIN()); // Thick Skin + prayerWidgets.get(1).setHidden(!config.ShowBURST_OF_STRENGTH()); // Burst of Strength + prayerWidgets.get(2).setHidden(!config.ShowCLARITY_OF_THOUGHT()); // Clarity of Thought + prayerWidgets.get(3).setHidden(!config.ShowSHARP_EYE()); // Sharp Eye + prayerWidgets.get(4).setHidden(!config.ShowMYSTIC_WILL()); // Mystic Will + prayerWidgets.get(5).setHidden(!config.ShowROCK_SKIN()); // Rock Skin + prayerWidgets.get(6).setHidden(!config.ShowSUPERHUMAN_STRENGTH()); // Super Human Strength + prayerWidgets.get(7).setHidden(!config.ShowIMPROVED_REFLEXES()); // Improved_Reflexes + prayerWidgets.get(8).setHidden(!config.ShowRapidRestore()); // Rapid Restore + prayerWidgets.get(9).setHidden(!config.ShowRapidHeal()); // Rapid Heal + prayerWidgets.get(10).setHidden(!config.ShowProtectItem()); // Protect Item + prayerWidgets.get(11).setHidden(!config.ShowHAWK_EYE()); // Hawk Eye + prayerWidgets.get(12).setHidden(!config.ShowMYSTIC_LORE()); // Mystic Lore + prayerWidgets.get(13).setHidden(!config.ShowSteelSkin()); // Steel Skin + prayerWidgets.get(14).setHidden(!config.ShowUltimateStrength()); // Ultimate Strength + prayerWidgets.get(15).setHidden(!config.ShowIncredibleReflex()); // Incredible Reflexes + prayerWidgets.get(16).setHidden(!config.ShowPTFMagic()); // Protect from Magic + prayerWidgets.get(17).setHidden(!config.ShowPTFRange()); // Protect from Range + prayerWidgets.get(18).setHidden(!config.ShowPTFMelee()); // Protect from Melee + prayerWidgets.get(19).setHidden(!config.ShowEagle()); // eagle eye + prayerWidgets.get(20).setHidden(!config.ShowMystic()); // Mystic Might + prayerWidgets.get(21).setHidden(!config.ShowRETRIBUTION()); // Retribution + prayerWidgets.get(22).setHidden(!config.ShowRedemption()); // Redemption + prayerWidgets.get(23).setHidden(!config.ShowSmite()); // Smite + prayerWidgets.get(24).setHidden(!config.ShowPreserve()); // Preserve + prayerWidgets.get(25).setHidden(!config.ShowChivalry()); // Chivalry + prayerWidgets.get(26).setHidden(!config.ShowPiety()); // Piety + prayerWidgets.get(27).setHidden(!config.ShowRigour()); // Rigour + prayerWidgets.get(28).setHidden(!config.ShowAugury()); // Augury } else if (config.getarmadylprayers()) @@ -509,7 +509,7 @@ public class HidePrayersPlugin extends Plugin prayerWidgets.get(9).setHidden(false); // Rapid Heal } - if (WorldType.isHighRiskWorld(client.getWorldType()) || client.getRealSkillLevel(Skill.PRAYER) <= 24) + if (WorldType.isAllHighRiskWorld(client.getWorldType()) || client.getRealSkillLevel(Skill.PRAYER) <= 24) { prayerWidgets.get(10).setHidden(true); // Protect Item } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java index 4774bc67e7..cc14b5ff67 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingConfig.java @@ -33,6 +33,17 @@ import net.runelite.client.config.ModifierlessKeybind; @ConfigGroup("keyremapping") public interface KeyRemappingConfig extends Config { + @ConfigItem( + position = 0, + keyName = "hideDisplayName", + name = "Hide display name", + description = "Hides the display name from showing before \"Press Enter to Chat...\"" + ) + default boolean hideDisplayName() + { + return false; + } + @ConfigItem( position = 1, keyName = "cameraRemap", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java index 12f25828f7..5b38cbdc25 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingPlugin.java @@ -37,6 +37,7 @@ import net.runelite.api.IconID; import net.runelite.api.VarClientInt; import net.runelite.api.VarClientStr; import net.runelite.api.Varbits; +import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; @@ -68,7 +69,7 @@ public class KeyRemappingPlugin extends Plugin private ClientThread clientThread; @Inject - private ConfigManager configManager; + private KeyRemappingConfig config; @Inject private KeyManager keyManager; @@ -83,7 +84,6 @@ public class KeyRemappingPlugin extends Plugin @Override protected void startUp() throws Exception { - configManager.setConfiguration("runelite", "entertochatplugin", false); typing = false; keyManager.registerKeyListener(inputListener); @@ -150,6 +150,25 @@ public class KeyRemappingPlugin extends Plugin return w == null || w.isSelfHidden(); } + @Subscribe + public void onConfigChanged(ConfigChanged configChanged) + { + if (!configChanged.getGroup().equals("keyremapping") || !configChanged.getKey().equals("hideDisplayName")) + { + return; + } + + clientThread.invoke(() -> + { + Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); + if (chatboxInput != null && chatboxInput.getText().endsWith(PRESS_ENTER_TO_CHAT)) + { + chatboxInput.setText(getWaitingText()); + } + } + ); + } + @Subscribe public void onScriptCallbackEvent(ScriptCallbackEvent scriptCallbackEvent) { @@ -161,7 +180,7 @@ public class KeyRemappingPlugin extends Plugin { if (chatboxFocused() && !typing) { - chatboxInput.setText(getPlayerNameWithIcon() + ": " + PRESS_ENTER_TO_CHAT); + chatboxInput.setText(getWaitingText()); } } break; @@ -181,7 +200,7 @@ public class KeyRemappingPlugin extends Plugin Widget chatboxInput = client.getWidget(WidgetInfo.CHATBOX_INPUT); if (chatboxInput != null) { - chatboxInput.setText(getPlayerNameWithIcon() + ": " + PRESS_ENTER_TO_CHAT); + chatboxInput.setText(getWaitingText()); // Typed text can be non-empty on plugin start, so clear it now client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); } @@ -220,4 +239,16 @@ public class KeyRemappingPlugin extends Plugin } return icon + client.getLocalPlayer().getName(); } + + private String getWaitingText() + { + if (config.hideDisplayName()) + { + return PRESS_ENTER_TO_CHAT; + } + else + { + return getPlayerNameWithIcon() + ": " + PRESS_ENTER_TO_CHAT; + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java index 6e459949c5..03179c69b9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java @@ -158,5 +158,15 @@ public interface LootTrackerConfig extends Config return ""; } + @ConfigItem( + keyName = "lootValueMessage", + name = "Loot Value Messages", + description = "Sends a game message with the total value you of your loot when you get a kill", + position = 5 + ) + default boolean sendLootValueMessages() + { + return true; + } } 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 33eb043639..7c21c9f7dc 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 @@ -133,10 +133,6 @@ public class LootTrackerPlugin extends Plugin 5179, "Brimstone Chest", 11573, "Crystal Chest" ); - - // Player deaths - public static HashSet usernameSet = new HashSet(Arrays.stream(new String[]{"All Records"}).collect(Collectors.toList())); - private static final File LOOT_RECORDS_FILE = new File(RuneLite.RUNELITE_DIR, "lootRecords.json"); private static final Set RESPAWN_REGIONS = ImmutableSet.of( 12850, // Lumbridge @@ -144,49 +140,38 @@ public class LootTrackerPlugin extends Plugin 12342, // Edgeville 11062 // Camelot ); - private boolean pvpDeath = false; - - @Inject - private ClientToolbar clientToolbar; - - @Inject - private ItemManager itemManager; - - @Inject - private ChatMessageManager chatMessageManager; - - @Inject - private SpriteManager spriteManager; - - @Inject - private LootTrackerConfig config; - + // Player deaths + public static HashSet usernameSet = new HashSet(Arrays.stream(new String[]{"All Records"}).collect(Collectors.toList())); @Inject public Client client; - + @VisibleForTesting + public Collection lootRecords = new ArrayList<>(); + private boolean pvpDeath = false; + @Inject + private ClientToolbar clientToolbar; + @Inject + private ItemManager itemManager; + @Inject + private ChatMessageManager chatMessageManager; + @Inject + private SpriteManager spriteManager; + @Inject + private LootTrackerConfig config; @Inject private ClientThread clientThread; - @Inject private SessionManager sessionManager; - @Inject private ScheduledExecutorService executor; - private LootTrackerPanel panel; private NavigationButton navButton; private String eventType; - private List ignoredItems = new ArrayList<>(); - private Multiset inventorySnapshot; - @Getter(AccessLevel.PACKAGE) private LootTrackerClient lootTrackerClient; private BufferedReader bufferedReader; private JsonStreamParser jsonStreamParser; - @VisibleForTesting - public Collection lootRecords = new ArrayList<>(); private static Collection stack(Collection items) { @@ -217,6 +202,13 @@ public class LootTrackerPlugin extends Plugin return list; } + private static Collection toGameItems(Collection items) + { + return items.stream() + .map(item -> new GameItem(item.getId(), item.getQuantity())) + .collect(Collectors.toList()); + } + @Provides LootTrackerConfig provideConfig(ConfigManager configManager) { @@ -405,7 +397,6 @@ public class LootTrackerPlugin extends Plugin } } - @Subscribe public void onPlayerSpawned(PlayerSpawned event) { @@ -418,6 +409,18 @@ public class LootTrackerPlugin extends Plugin @Subscribe public void onPlayerLootReceived(final PlayerLootReceived playerLootReceived) { + if (config.sendLootValueMessages()) + { + if (WorldType.isDeadmanWorld(client.getWorldType()) || WorldType.isHighRiskWorld(client.getWorldType()) || WorldType.isPvpWorld(client.getWorldType()) || client.getVar(Varbits.IN_WILDERNESS) == 1) + { + final String totalValue = StackFormatter.quantityToRSStackSize(playerLootReceived.getItems().stream() + .mapToInt(itemStack -> itemManager.getItemPrice(itemStack.getId()) * itemStack.getQuantity()).sum()); + + chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.CONSOLE).runeLiteFormattedMessage( + new ChatMessageBuilder().append("The total value of your loot is " + totalValue + " GP.") + .build()).build()); + } + } final Player player = playerLootReceived.getPlayer(); final Collection items = playerLootReceived.getItems(); final String name = player.getName(); @@ -793,13 +796,6 @@ public class LootTrackerPlugin extends Plugin .toArray(LootTrackerItem[]::new); } - private static Collection toGameItems(Collection items) - { - return items.stream() - .map(item -> new GameItem(item.getId(), item.getQuantity())) - .collect(Collectors.toList()); - } - public Collection convertToLootTrackerRecord(final Collection records) { Collection trackerRecords = new ArrayList<>(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java index d4fd2aabf4..b51940b206 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java @@ -46,7 +46,8 @@ import net.runelite.client.plugins.menuentryswapper.util.RingOfWealthMode; import net.runelite.client.plugins.menuentryswapper.util.SkillsNecklaceMode; import net.runelite.client.plugins.menuentryswapper.util.SlayerRingMode; import net.runelite.client.plugins.menuentryswapper.util.XericsTalismanMode; - +import net.runelite.client.plugins.menuentryswapper.util.teleEquippedMode; +import net.runelite.client.plugins.menuentryswapper.util.CharterOption; @ConfigGroup("menuentryswapper") @@ -210,11 +211,37 @@ public interface MenuEntrySwapperConfig extends Config return false; } + @ConfigItem( + keyName = "teleEquippedCape", + name = "Teleport Equipped Cape", + description = "Makes Teleport/Tele to POH the left click option on equip screen", + position = 12, + group = "Equipment swapper" + ) + default boolean teleEquippedCape() + { + return false; + } + + @ConfigItem( + keyName = "telecapeMode", + name = "ModeTeleCape", + description = "", + position = 13, + group = "Equipment swapper", + hidden = true, + unhide = "teleEquippedCape" + ) + default teleEquippedMode telecapeMode() + { + return teleEquippedMode.TELEPORT; + } + @ConfigItem( keyName = "maxMode", name = "Mode", description = "", - position = 12, + position = 14, group = "Equipment swapper", hidden = true, unhide = "swapMax" @@ -228,7 +255,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapArdougneCape", name = "Swap Ardougne Cape", description = "Enables swapping of 'Teleport' and 'Wear'.", - position = 13, + position = 15, group = "Equipment swapper" ) default boolean getSwapArdougneCape() @@ -240,7 +267,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapConstructionCape", name = "Swap Construction Cape", description = "Enables swapping of 'Teleport' and 'Wear'.", - position = 14, + position = 16, group = "Equipment swapper" ) default boolean getSwapConstructionCape() @@ -252,7 +279,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapCraftingCape", name = "Swap Crafting Cape", description = "Enables swapping of 'Teleport' and 'Wear'.", - position = 15, + position = 17, group = "Equipment swapper" ) default boolean getSwapCraftingCape() @@ -264,7 +291,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapMagicCape", name = "Swap Magic Cape", description = "Enables swapping of 'Spellbook' and 'Wear'.", - position = 16, + position = 18, group = "Equipment swapper" ) default boolean getSwapMagicCape() @@ -276,7 +303,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapExplorersRing", name = "Swap Explorer's Ring", description = "Enables swapping of 'Spellbook' and 'Wear'.", - position = 17, + position = 19, group = "Equipment swapper" ) default boolean getSwapExplorersRing() @@ -288,7 +315,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapAdmire", name = "Admire", description = "Swap 'Admire' with 'Teleport', 'Spellbook' and 'Perks' (max cape) for mounted skill capes.", - position = 18, + position = 20, group = "Equipment swapper" ) default boolean swapAdmire() @@ -300,7 +327,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapQuestCape", name = "Swap Quest Cape", description = "Enables swapping Quest cape options in worn interface.", - position = 19, + position = 21, group = "Equipment swapper" ) default boolean swapQuestCape() @@ -312,7 +339,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "questCapeMode", name = "Mode", description = "", - position = 20, + position = 22, group = "Equipment swapper", hidden = true, unhide = "swapQuestCape" @@ -328,7 +355,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "customSwaps", name = "Custom Swaps", description = "Add custom swaps here, 1 per line. Syntax: option, target : option, target
Note that the first entry should be the left click one!", - position = 19, + position = 23, group = "Miscellaneous", parse = true, clazz = Parse.class, @@ -343,7 +370,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "shiftClickCustomization", name = "Customizable Shift-click", description = "Allows customization of shift-clicks on items.", - position = 20, + position = 24, group = "Miscellaneous" ) default boolean shiftClickCustomization() @@ -351,11 +378,23 @@ public interface MenuEntrySwapperConfig extends Config return true; } + @ConfigItem( + keyName = "swapCoalBag", + name = "Swap Coal Bag Empty", + description = "Makes Empty the left click option when in a bank", + position = 25, + group = "Miscellaneous" + ) + default boolean swapCoalBag() + { + return true; + } + @ConfigItem( keyName = "swapBirdhouseEmpty", name = "Birdhouse", description = "Swap 'Interact' with 'Empty' for birdhouses on Fossil Island.", - position = 21, + position = 26, group = "Miscellaneous" ) default boolean swapBirdhouseEmpty() @@ -367,7 +406,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBones", name = "Bury", description = "Swap 'Bury' with 'Use' on Bones.", - position = 22, + position = 27, group = "Miscellaneous" ) default boolean swapBones() @@ -379,7 +418,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapChase", name = "Chase", description = "Allows to left click your cat to chase rats.", - position = 23, + position = 28, group = "Miscellaneous" ) default boolean swapChase() @@ -391,7 +430,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapHarpoon", name = "Harpoon", description = "Swap 'Cage', 'Big Net' with 'Harpoon' on Fishing spots.", - position = 24, + position = 29, group = "Miscellaneous" ) default boolean swapHarpoon() @@ -403,7 +442,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapOccult", name = "Occult Altar", description = "Swap 'Venerate' with 'Ancient', 'Lunar', or 'Arceuus' on an Altar of the Occult.", - position = 25, + position = 30, group = "Miscellaneous" ) default boolean swapOccult() @@ -415,7 +454,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "occultalter", name = "Mode", description = "", - position = 26, + position = 31, group = "Miscellaneous", hidden = true, unhide = "swapOccult" @@ -429,7 +468,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapHomePortal", name = "Home", description = "Swap 'Enter' with 'Home', 'Build' or 'Friend's house' on Portal.", - position = 27, + position = 32, group = "Miscellaneous" ) default boolean swapHomePortal() @@ -441,7 +480,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "home", name = "Mode", description = "", - position = 28, + position = 33, group = "Miscellaneous", hidden = true, unhide = "swapHomePortal" @@ -455,7 +494,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPrivate", name = "Private", description = "Swap 'Shared' with 'Private' on the Chambers of Xeric storage units.", - position = 29, + position = 34, group = "Miscellaneous" ) default boolean swapPrivate() @@ -467,7 +506,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPick", name = "Pick", description = "Swap 'Pick' with 'Pick-lots' of the Gourd tree in the Chambers of Xeric.", - position = 30, + position = 35, group = "Miscellaneous" ) default boolean swapPick() @@ -479,7 +518,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapQuick", name = "Quick Pass/Open/Start/Travel", description = "Swap 'Pass' with 'Quick-Pass', 'Open' with 'Quick-Open', 'Ring' with 'Quick-Start' and 'Talk-to' with 'Quick-Travel'.", - position = 31, + position = 36, group = "Miscellaneous" ) default boolean swapQuick() @@ -491,7 +530,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBoxTrap", name = "Reset", description = "Swap 'Check' with 'Reset' on box traps.", - position = 32, + position = 37, group = "Miscellaneous" ) default boolean swapBoxTrap() @@ -503,7 +542,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "rockCake", name = "Rock Cake Guzzle", description = "Enables Left Click 'Guzzle' on the Dwarven Rock Cake.", - position = 33, + position = 38, group = "Miscellaneous" ) default boolean rockCake() @@ -515,7 +554,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapRogueschests", name = "Rogues Chests", description = "Swap Rogues Chests from 'Open' to 'Search for traps'.", - position = 34, + position = 39, group = "Miscellaneous" ) default boolean swapRogueschests() @@ -527,7 +566,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapClimbUpDown", name = "Climb", description = "Swap 'Climb-Up'/'Climb-Down' depending on Shift or Control key.", - position = 35, + position = 40, group = "Miscellaneous" ) default boolean swapClimbUpDown() @@ -539,7 +578,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapStun", name = "Stun Hoop Snakes", description = "Swap 'Attack' with 'Stun'.", - position = 36, + position = 41, group = "Miscellaneous" ) default boolean swapStun() @@ -551,7 +590,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSearch", name = "Search", description = "Swap 'Close', 'Shut' with 'Search' on chests, cupboards, etc.", - position = 37, + position = 42, group = "Miscellaneous" ) default boolean swapSearch() @@ -563,7 +602,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapHardWoodGrove", name = "Hardwood Grove", description = "Swap 'Quick-Pay(100)' and 'Send-Parcel' at Hardwood Grove.", - position = 38, + position = 43, group = "Miscellaneous" ) default boolean swapHardWoodGrove() @@ -576,7 +615,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "removeObjects", name = "Remove Objects", description = "Removes interaction with the listed objects.", - position = 39, + position = 44, group = "Miscellaneous" ) default boolean getRemoveObjects() @@ -588,7 +627,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "removedObjects", name = "Objects", description = "Objects listed here will have all interaction be removed.", - position = 40, + position = 45, group = "Miscellaneous", hidden = true, unhide = "removeObjects" @@ -602,7 +641,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapslayer", name = "Swap Slayer Ring", description = "", - position = 41, + position = 46, group = "Teleportation" ) default boolean getSlayerRing() @@ -614,7 +653,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "slayerringmode", name = "Mode", description = "", - position = 42, + position = 47, group = "Teleportation", hidden = true, unhide = "swapslayer" @@ -630,7 +669,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBuyOne", name = "Swappable Buy One", description = "", - position = 43, + position = 48, group = "Shop / stores" ) default boolean getSwapBuyOne() @@ -643,7 +682,7 @@ public interface MenuEntrySwapperConfig extends Config name = "Items", description = "", group = "Shop / stores", - position = 44, + position = 49, hidden = true, unhide = "swapBuyOne" ) @@ -656,7 +695,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBuyFive", name = "Swappable Buy Five", description = "", - position = 45, + position = 50, group = "Shop / stores" ) default boolean getSwapBuyFive() @@ -668,7 +707,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "buyFiveItems", name = "Items", description = "", - position = 46, + position = 51, group = "Shop / stores", hidden = true, unhide = "swapBuyFive" @@ -682,7 +721,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBuyTen", name = "Swappable Buy Ten", description = "", - position = 47, + position = 52, group = "Shop / stores" ) default boolean getSwapBuyTen() @@ -694,7 +733,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "buyTenItems", name = "Items", description = "", - position = 48, + position = 53, group = "Shop / stores", hidden = true, unhide = "swapBuyTen" @@ -708,7 +747,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapBuyFifty", name = "Swappable Buy Fifty", description = "", - position = 49, + position = 54, group = "Shop / stores" ) default boolean getSwapBuyFifty() @@ -720,7 +759,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "buyFiftyItems", name = "Items", description = "", - position = 50, + position = 55, group = "Shop / stores", hidden = true, unhide = "swapBuyFifty" @@ -734,7 +773,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSellOne", name = "Swappable Sell One", description = "", - position = 51, + position = 56, group = "Shop / stores" ) default boolean getSwapSellOne() @@ -746,7 +785,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "sellOneItems", name = "Items", description = "", - position = 52, + position = 57, group = "Shop / stores", hidden = true, unhide = "swapSellOne" @@ -760,7 +799,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSellFive", name = "Swappable Sell Five", description = "", - position = 53, + position = 58, group = "Shop / stores" ) default boolean getSwapSellFive() @@ -772,7 +811,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "sellFiveItems", name = "Items", description = "", - position = 54, + position = 59, group = "Shop / stores", hidden = true, unhide = "swapSellFive" @@ -786,7 +825,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSellTen", name = "Swappable Sell Ten", description = "", - position = 55, + position = 60, group = "Shop / stores" ) default boolean getSwapSellTen() @@ -798,7 +837,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "sellTenItems", name = "Items", description = "", - position = 56, + position = 61, group = "Shop / stores", hidden = true, unhide = "swapSellTen" @@ -812,7 +851,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSellFifty", name = "Swappable Sell Fifty", description = "", - position = 57, + position = 62, group = "Shop / stores" ) default boolean getSwapSellFifty() @@ -824,7 +863,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "sellFiftyItems", name = "Items", description = "", - position = 58, + position = 63, group = "Shop / stores", hidden = true, unhide = "swapSellFifty" @@ -866,7 +905,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "getTempConstruction", name = "Easy Construction", description = "Makes 'Remove'/'Build' the default option for listed items.", - position = 59, + position = 64, group = "Skilling" ) @@ -879,7 +918,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "getTempConstructionItems", name = "Build Items", description = "", - position = 60, + position = 65, group = "Skilling", hidden = true, unhide = "getTempConstruction" @@ -893,7 +932,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSmithing", name = "Swap Smithing", description = "Enables swapping of 'Smith-1' and 'Smith-all' options.", - position = 61, + position = 66, group = "Skilling" ) default boolean getSwapSmithing() @@ -905,7 +944,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapTanning", name = "Swap Tanning", description = "Enables swapping of 'Tan-1' and 'Tan-all' options.", - position = 62, + position = 67, group = "Skilling" ) default boolean getSwapTanning() @@ -917,7 +956,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSawmill", name = "Swap Sawmill Operator", description = "Makes 'Buy-plank' the default option on the Sawmill Operator.", - position = 63, + position = 68, group = "Skilling" ) default boolean getSwapSawmill() @@ -929,7 +968,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSawmillPlanks", name = "Swap Buy Planks", description = "Makes 'Buy All' the default option when buying planks.", - position = 64, + position = 69, group = "Skilling" ) default boolean getSwapSawmillPlanks() @@ -941,7 +980,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPuroPuro", name = "Swap Puro-Puro Wheat", description = "", - position = 65, + position = 70, group = "Skilling" ) default boolean getSwapPuro() @@ -955,7 +994,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapAssignment", name = "Assignment", description = "Swap 'Talk-to' with 'Assignment' for Slayer Masters. This will take priority over swapping Trade.", - position = 66, + position = 71, group = "Talk-To" ) default boolean swapAssignment() @@ -964,13 +1003,13 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "swapBanker", - name = "Bank", - description = "Swap 'Talk-to' with 'Bank' on Bank NPCs.
Example: Banker.", - position = 67, + keyName = "swapBankExchange", + name = "Bank/Exchange", + description = "Swap Talk-to with Bank or Exchange on NPC
Example: Banker, Grand Exchange Clerk, Tool Leprechaun, Void Knight", + position = 72, group = "Talk-To" ) - default boolean swapBank() + default boolean swapBankExchange() { return true; } @@ -979,7 +1018,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapContract", name = "Contract", description = "Swap 'Talk-to' with 'Contract' on Guildmaster Jane.", - position = 68, + position = 73, group = "Talk-To" ) default boolean swapContract() @@ -987,71 +1026,24 @@ public interface MenuEntrySwapperConfig extends Config return true; } - @ConfigItem( - keyName = "claimDynamite", - name = "Claim Dynamite", - description = "Swap 'Talk-to' with 'Claim Dynamite' on Thirus.", - position = 69, - group = "Talk-To" - ) - default boolean claimDynamite() - { - return true; - } @ConfigItem( - keyName = "claimSlime", - name = "Claim Slime", - description = "Swap 'Talk-to' with 'Claim Slime' from Morytania diaries.", - position = 70, + keyName = "swapInteract", + name = "Interact", + description = "Swap options for generic interactions on NPCs
Example: Decant for Bob Barter, Repairs for Dark Mage, Claim Slime for Robin, Claim Dynamite", + position = 74, group = "Talk-To" ) - default boolean claimSlime() - { - return true; - } - - @ConfigItem( - keyName = "swapDarkMage", - name = "Repairs", - description = "Swap 'Talk-to' with 'Repairs' for Dark Mage.", - position = 71, - group = "Talk-To" - ) - default boolean swapDarkMage() - { - return true; - } - - @ConfigItem( - keyName = "swapDecant", - name = "Decant", - description = "Swap 'Talk-to' with 'Decant' for Bob Barter and Murky Matt at the Grand Exchange.", - position = 72, - group = "Talk-To" - ) - default boolean swapDecant() + default boolean swapInteract() { return false; } - @ConfigItem( - keyName = "swapExchange", - name = "Exchange", - description = "Swap 'Talk-to' with 'Exchange' on various NPCs.
Example: Grand Exchange Clerk, Tool Leprechaun, Void Knight.", - position = 73, - group = "Talk-To" - ) - default boolean swapExchange() - { - return true; - } - @ConfigItem( keyName = "swapPickpocket", - name = "Pickpocket on H.A.M.", - description = "Swap 'Talk-to' with 'Pickpocket' on H.A.M members.", - position = 74, + name = "Pickpocket", + description = "Swap Talk-to with Pickpocket on NPC
Example: Man, Woman", + position = 75, group = "Talk-To" ) default boolean swapPickpocket() @@ -1063,7 +1055,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPay", name = "Pay", description = "Swap 'Talk-to' with 'Pay' on various NPCs.
Example: Elstan, Heskel, Fayeth.", - position = 75, + position = 76, group = "Talk-To" ) default boolean swapPay() @@ -1075,7 +1067,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapAbyssTeleport", name = "Teleport to Abyss", description = "Swap 'Talk-to' with 'Teleport' for the Mage of Zamorak.", - position = 76, + position = 77, group = "Talk-To" ) default boolean swapAbyssTeleport() @@ -1087,7 +1079,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapTrade", name = "Trade", description = "Swap 'Talk-to' with 'Trade' on various NPCs.
Example: Shop keeper, Shop assistant.", - position = 77, + position = 78, group = "Talk-To" ) default boolean swapTrade() @@ -1096,11 +1088,11 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "swapTravel", - name = "Travel", - description = "Swap 'Talk-to' with 'Travel', 'Take-boat', 'Pay-fare', 'Charter' on various NPCs.
Example: Squire, Monk of Entrana, Customs officer, Trader Crewmember.", - position = 78, - group = "Talk-To" + keyName = "swapTravel", + name = "Travel", + description = "Swap 'Talk-to' with 'Travel', 'Take-boat', 'Pay-fare', 'Charter' on various NPCs.
Example: Squire, Monk of Entrana, Customs officer, Trader Crewmember.", + position = 79, + group = "Talk-To" ) default boolean swapTravel() { @@ -1108,25 +1100,13 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "swapDream", - name = "Dream", - description = "Swap 'Talk-to' with 'Dream' for Dominic Onion.", - position = 79, - group = "Talk-To" + keyName = "swapMinigame", + name = "Minigames", + description = "Swap Talk-to with Start-Minigame, Story, Dream on NPC
Example: Guardian mummy, Juna, Dominic Onion", + position = 80, + group = "Talk-To" ) - default boolean swapDream() - { - return true; - } - - @ConfigItem( - keyName = "swapStory", - name = "Story", - description = "Swap 'Talk-to' with 'Story' for Juna at Tears of Guthix.", - position = 80, - group = "Talk-To" - ) - default boolean swapStory() + default boolean swapMinigame() { return true; } @@ -1156,13 +1136,13 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "swapEscort", - name = "Escort", - description = "Swap 'Talk-to' with 'Escort' for the Temple Trekking mini-game.", - position = 83, + keyName = "swapEnchant", + name = "Enchant", + description = "Swap Talk-to with Enchant for Eluned", + position = 82, group = "Talk-To" ) - default boolean swapEscort() + default boolean swapEnchant() { return true; } @@ -1173,7 +1153,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapFairyRing", name = "Fairy Ring", description = "Swap 'Zanaris' with 'Last-destination' or 'Configure' on Fairy rings.", - position = 84, + position = 83, group = "Teleportation" ) default boolean swapFairyRing() @@ -1185,7 +1165,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "fairyring", name = "Mode", description = "", - position = 85, + position = 84, group = "Teleportation", hidden = true, unhide = "swapFairyRing" @@ -1199,7 +1179,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapObelisk", name = "Obelisk", description = "Swap the options on wilderness obelisks between 'Activate', 'Set destination' or 'Teleport to destination'.", - position = 86, + position = 85, group = "Teleportation" ) default boolean swapObelisk() @@ -1211,7 +1191,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "obelisk", name = "Mode", description = "", - position = 87, + position = 86, group = "Teleportation", hidden = true, unhide = "swapObelisk" @@ -1225,7 +1205,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapTeleportItem", name = "Teleport Items", description = "Swap 'Wear' or 'Wield' with 'Rub' or 'Teleport' on teleport items.
Example: Amulet of glory, Explorer's ring, Chronicle.", - position = 88, + position = 87, group = "Teleportation" ) default boolean swapTeleportItem() @@ -1237,7 +1217,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapWildernessLever", name = "Wilderness Lever", description = "Swap the wilderness lever left click to be Edgeville/Ardougne.", - position = 89, + position = 88, group = "Teleportation" ) default boolean swapWildernessLever() @@ -1249,7 +1229,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapNexus", name = "Portal Nexus", description = "Makes the teleport menu have priority over the left click destination on the portal nexus.", - position = 90, + position = 99, group = "Teleportation" ) default boolean swapNexus() @@ -1261,7 +1241,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapGamesNecklace", name = "Swap Games Necklace", description = "Swap the left click 'remove' option with the desired teleport location on a worn Games Necklace.", - position = 91, + position = 100, group = "Teleportation" ) default boolean getGamesNecklace() @@ -1273,7 +1253,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "gamesNecklaceMode", name = "Mode", description = "", - position = 92, + position = 101, group = "Teleportation", hidden = true, unhide = "swapGamesNecklace" @@ -1287,7 +1267,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapDuelingRing", name = "Swap Dueling Ring", description = "Swap the left click 'remove' option with the desired teleport location on a worn Ring of Dueling.", - position = 93, + position = 102, group = "Teleportation" ) default boolean getDuelingRing() @@ -1299,7 +1279,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "duelingRingMode", name = "Mode", description = "", - position = 94, + position = 103, group = "Teleportation", hidden = true, unhide = "swapDuelingRing" @@ -1313,7 +1293,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapGlory", name = "Swap Glory", description = "Swap the left click 'remove' option with the desired teleport location on a worn Amulet of Glory / Amulet of Eternal Glory.", - position = 95, + position = 104, group = "Teleportation" ) default boolean getGlory() @@ -1325,7 +1305,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "gloryMode", name = "Mode", description = "", - position = 96, + position = 105, group = "Teleportation", hidden = true, unhide = "swapGlory" @@ -1339,7 +1319,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapSkill", name = "Swap Skill", description = "Swap the left click 'remove' option with the desired teleport location on a worn Skills Necklace.", - position = 97, + position = 106, group = "Teleportation" ) default boolean getSkillsNecklace() @@ -1351,7 +1331,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "skillsnecklacemode", name = "Mode", description = "", - position = 98, + position = 107, group = "Teleportation", hidden = true, unhide = "swapSkill" @@ -1365,7 +1345,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapPassage", name = "Swap Passage", description = "Swap the left click 'remove' option with the desired teleport location on a worn Necklace of Passage.", - position = 99, + position = 108, group = "Teleportation" ) default boolean getNecklaceofPassage() @@ -1377,7 +1357,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "necklaceofpassagemode", name = "Mode", description = "", - position = 100, + position = 109, group = "Teleportation", hidden = true, unhide = "swapPassage" @@ -1391,7 +1371,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapDigsite", name = "Swap Digsite", description = "Swap the left click 'remove' option with the desired teleport location on a worn Digsite Pendant.", - position = 101, + position = 110, group = "Teleportation" ) default boolean getDigsitePendant() @@ -1403,7 +1383,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "digsitependantmode", name = "Mode", description = "", - position = 102, + position = 111, group = "Teleportation", hidden = true, unhide = "swapDigsite" @@ -1417,7 +1397,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapCombat", name = "Swap Combat", description = "Swap the left click 'remove' option with the desired teleport location on a worn Combat Bracelet.", - position = 103, + position = 112, group = "Teleportation" ) default boolean getCombatBracelet() @@ -1429,7 +1409,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "combatbraceletmode", name = "Mode", description = "", - position = 104, + position = 113, group = "Teleportation", hidden = true, unhide = "swapCombat" @@ -1443,7 +1423,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapburning", name = "Swap Burning", description = "Swap the left click 'remove' option with the desired teleport location on a worn Burning Amulet.", - position = 105, + position = 114, group = "Teleportation" ) default boolean getBurningAmulet() @@ -1455,7 +1435,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "burningamuletmode", name = "Mode", description = "", - position = 106, + position = 115, group = "Teleportation", hidden = true, unhide = "swapburning" @@ -1469,7 +1449,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapxeric", name = "Swap Xeric's", description = "Swap the left click 'remove' option with the desired teleport location on a worn Xeric's Talisman.", - position = 107, + position = 116, group = "Teleportation" ) default boolean getXericsTalisman() @@ -1481,7 +1461,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "xericstalismanmode", name = "Mode", description = "", - position = 108, + position = 117, group = "Teleportation", hidden = true, unhide = "swapxeric" @@ -1495,7 +1475,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "swapwealth", name = "Swap Wealth", description = "Swap the left click 'remove' option with the desired teleport location on a worn Ring of Wealth.", - position = 109, + position = 118, group = "Teleportation" ) default boolean getRingofWealth() @@ -1507,7 +1487,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "ringofwealthmode", name = "Mode", description = "", - position = 110, + position = 119, group = "Teleportation", hidden = true, unhide = "swapwealth" @@ -1523,7 +1503,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideExamine", name = "Hide Examine", description = "Hides the 'Examine' option from the right click menu.", - position = 111, + position = 120, group = "Right Click Options" ) default boolean hideExamine() @@ -1535,7 +1515,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideTradeWith", name = "Hide Trade With", description = "Hides the 'Trade with' option from the right click menu.", - position = 112, + position = 121, group = "Right Click Options" ) default boolean hideTradeWith() @@ -1547,7 +1527,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideReport", name = "Hide Report", description = "Hides the 'Report' option from the right click menu.", - position = 113, + position = 122, group = "Right Click Options" ) default boolean hideReport() @@ -1559,7 +1539,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideLookup", name = "Hide Lookup", description = "Hides the 'Lookup' option from the right click menu.", - position = 114, + position = 123, group = "Right Click Options" ) default boolean hideLookup() @@ -1571,7 +1551,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideNet", name = "Hide Net", description = "Hides the 'Net' option from the right click menu.", - position = 115, + position = 124, group = "Right Click Options" ) default boolean hideNet() @@ -1583,7 +1563,7 @@ public interface MenuEntrySwapperConfig extends Config keyName = "hideBait", name = "Hide Bait", description = "Hides the 'Bait' option from the right click menu.", - position = 116, + position = 125, group = "Right Click Options" ) default boolean hideBait() @@ -1594,11 +1574,11 @@ public interface MenuEntrySwapperConfig extends Config //----------------------Untradeables---------------------------// @ConfigItem( - keyName = "hideDestroyRunepouch", - name = "Hide Destroy on Rune Pouch", - description = "Hides the 'Destroy' option when right clicking a Rune pouch.", - position = 117, - group = "Untradeables" + keyName = "hideDestroyRunepouch", + name = "Hide Destroy on Rune Pouch", + description = "Hides the 'Destroy' option when right clicking a Rune pouch.", + position = 126, + group = "Untradeables" ) default boolean hideDestroyRunepouch() { @@ -1606,11 +1586,11 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "hideDestroyCoalbag", - name = "Hide Destroy on Coal bag", - description = "Hides the 'Destroy' option when right clicking a Coal bag.", - position = 118, - group = "Untradeables" + keyName = "hideDestroyCoalbag", + name = "Hide Destroy on Coal bag", + description = "Hides the 'Destroy' option when right clicking a Coal bag.", + position = 127, + group = "Untradeables" ) default boolean hideDestroyCoalbag() { @@ -1618,11 +1598,11 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "hideDestroyHerbsack", - name = "Hide Destroy on Herb sack", - description = "Hides the 'Destroy' option when right clicking a Herb sack.", - position = 119, - group = "Untradeables" + keyName = "hideDestroyHerbsack", + name = "Hide Destroy on Herb sack", + description = "Hides the 'Destroy' option when right clicking a Herb sack.", + position = 128, + group = "Untradeables" ) default boolean hideDestroyHerbsack() { @@ -1630,11 +1610,11 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "hideDestroyBoltpouch", - name = "Hide Destroy on Bolt pouch", - description = "Hides the 'Destroy' option when right clicking a Bolt pouch.", - position = 120, - group = "Untradeables" + keyName = "hideDestroyBoltpouch", + name = "Hide Destroy on Bolt pouch", + description = "Hides the 'Destroy' option when right clicking a Bolt pouch.", + position = 129, + group = "Untradeables" ) default boolean hideDestroyBoltpouch() { @@ -1642,11 +1622,11 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "hideDestroyGembag", - name = "Hide Destroy on Gem bag", - description = "Hides the 'Destroy' option when right clicking a Gem bag.", - position = 121, - group = "Untradeables" + keyName = "hideDestroyGembag", + name = "Hide Destroy on Gem bag", + description = "Hides the 'Destroy' option when right clicking a Gem bag.", + position = 130, + group = "Untradeables" ) default boolean hideDestroyGembag() { @@ -1654,11 +1634,11 @@ public interface MenuEntrySwapperConfig extends Config } @ConfigItem( - keyName = "hideDropRunecraftingPouch", - name = "Hide Drop on RC pouches", - description = "Hides the 'Drop' option when right clicking a Small, Medium, Large, or Giant pouch.", - position = 122, - group = "Untradeables" + keyName = "hideDropRunecraftingPouch", + name = "Hide Drop on RC pouches", + description = "Hides the 'Drop' option when right clicking a Small, Medium, Large, or Giant pouch.", + position = 131, + group = "Untradeables" ) default boolean hideDropRunecraftingPouch() { @@ -1668,16 +1648,28 @@ public interface MenuEntrySwapperConfig extends Config //------------------------------------------------------------// @ConfigItem( - keyName = "swapImps", - name = "Impling Jars", - description = "Don't open implings if bank has a clue.", - position = 123, - group = "Miscellaneous" + keyName = "swapImps", + name = "Impling Jars", + description = "Don't open implings if bank has a clue.", + position = 132, + group = "Miscellaneous" ) default boolean swapImps() { return false; } + @ConfigItem( + keyName = "charterOption", + name = "Trader Crew", + description = "Configure whether you want Charter or Trade to be the first option of Trader Crewmembers.", + position = 133, + group = "Miscellaneous" + ) + default CharterOption charterOption() + { + return CharterOption.TRADE; + } + //------------------------------------------------------------// } 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 c75a8859ef..7619f61394 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 @@ -81,6 +81,7 @@ import net.runelite.client.plugins.menuentryswapper.util.FairyRingMode; import net.runelite.client.plugins.menuentryswapper.util.HouseMode; import net.runelite.client.plugins.menuentryswapper.util.ObeliskMode; import net.runelite.client.plugins.menuentryswapper.util.OccultAltarMode; +import net.runelite.client.plugins.menuentryswapper.util.CharterOption; import static net.runelite.client.util.MenuUtil.swap; import net.runelite.client.util.MiscUtils; import net.runelite.client.util.Text; @@ -902,23 +903,19 @@ public class MenuEntrySwapperPlugin extends Plugin if (option.equals("talk-to")) { - if (config.swapPickpocket() && target.contains("h.a.m.")) + if (config.swapPickpocket()) { swap(client, "pickpocket", option, target, true); } - if (config.swapAbyssTeleport() && target.contains("mage of zamorak")) - { - swap(client, "teleport", option, target, true); - } - if (config.swapHardWoodGrove() && target.contains("rionasta")) { swap(client, "send-parcel", option, target, true); } - if (config.swapBank()) + if (config.swapBankExchange()) { swap(client, "bank", option, target, true); + swap(client, "exchange", option, target, true); } if (config.swapContract()) @@ -926,14 +923,14 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "contract", option, target, true); } - if (config.swapExchange()) - { - swap(client, "exchange", option, target, true); - } - - if (config.swapDarkMage()) + if (config.swapInteract()) { swap(client, "repairs", option, target, true); + swap(client, "claim-slime", option, target, true); + swap(client, "decant", option, target, true); + swap(client, "claim", option, target, true); + swap(client, "heal", option, target, true); + swap(client, "help", option, target, true); } // make sure assignment swap is higher priority than trade swap for slayer masters @@ -947,21 +944,19 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "buy-plank", option, target, true); } - if (config.claimDynamite() && target.equals("thirus")) - { - swap(client, "claim", option, target, true); - } - - if (config.swapTrade()) + if (config.swapTrade() && (!(target.equals("trader crewmember") || target.equals("trader stan")) || config.charterOption().equals(CharterOption.TRADE))) { swap(client, "trade", option, target, true); swap(client, "trade-with", option, target, true); swap(client, "shop", option, target, true); } - if (config.claimSlime() && target.equals("robin")) + if (config.swapMinigame()) { - swap(client, "claim-slime", option, target, true); + swap(client, "story", option, target, true); + swap(client, "escort", option, target, true); + swap(client, "dream", option, target, true); + swap(client, "start-minigame", option, target, true); } if (config.swapTravel()) @@ -976,6 +971,16 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "rellekka", option, target, true); swap(client, "follow", option, target, true); swap(client, "transport", option, target, true); + + if (config.swapAbyssTeleport() && target.contains("mage of zamorak")) + { + swap(client, "teleport", option, target, true); + } + + if (!(target.equals("trader crewmember") || target.equals("trader stan")) || config.charterOption().equals(CharterOption.CHARTER)) + { + swap(client, "charter", option, target, true); + } } if (config.swapPay()) @@ -984,30 +989,16 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "pay (", option, target, false); } - if (config.swapDream()) - { - swap(client, "dream", option, target, true); - } - - if (config.swapDecant()) - { - swap(client, "decant", option, target, true); - } - if (config.swapQuick()) { swap(client, "quick-travel", option, target, true); } - if (config.swapStory()) + if (config.swapEnchant()) { - swap(client, "story", option, target, true); + swap(client, "enchant", option, target, true); } - if (config.swapEscort()) - { - swap(client, "escort", option, target, true); - } } else if (config.swapWildernessLever() && target.equals("lever") && option.equals("ardougne")) @@ -1025,18 +1016,9 @@ public class MenuEntrySwapperPlugin extends Plugin swap(client, "stun", option, target, true); } - else if (config.swapTravel() && option.equals("pass") && target.equals("energy barrier")) + else if (config.swapTravel() && (option.equals("pass") || option.equals("open"))) { - swap(client, "pay-toll(2-ecto)", option, target, true); - } - - else if (config.swapTravel() && option.equals("open") && target.equals("gate")) - { - swap(client, "pay-toll(10gp)", option, target, true); - } - else if (config.swapHardWoodGrove() && option.equals("open") && target.equals("hardwood grove doors")) - { - swap(client, "quick-pay(100)", option, target, true); + swap(client, "pay-toll", option, target, false); } else if (config.swapTravel() && option.equals("inspect") && target.equals("trapdoor")) { @@ -1157,7 +1139,14 @@ public class MenuEntrySwapperPlugin extends Plugin { swap(client, "quick-open", option, target, true); } - + else if (config.swapQuick() && option.equals("enter")) + { + swap(client, "quick-enter", option, target, true); + } + else if (config.swapQuick() && option.equals("leave tomb")) + { + swap(client, "quick-leave", option, target, true); + } else if (config.swapAdmire() && option.equals("admire")) { swap(client, "teleport", option, target, true); @@ -1202,17 +1191,14 @@ public class MenuEntrySwapperPlugin extends Plugin } // Put all item-related swapping after shift-click - else if (config.swapTeleportItem() && option.equals("wear")) + else if (config.swapTeleportItem() && (option.equals("wear") || option.equals("wield"))) { swap(client, "rub", option, target, true); swap(client, "teleport", option, target, true); } - else if (option.equals("wield")) + else if (config.swapCoalBag() && option.contains("deposit") && target.equals("coal bag")) { - if (config.swapTeleportItem()) - { - swap(client, "teleport", option, target, true); - } + swap(client, "empty", option, target, true); } else if (config.swapBones() && option.equals("bury")) { @@ -1382,6 +1368,12 @@ public class MenuEntrySwapperPlugin extends Plugin menuManager.addSwap("remove", "burning amulet", config.getBurningAmuletMode().toString()); } + if (config.teleEquippedCape()) + { + menuManager.addSwap("remove", "tele to poh", config.telecapeMode().toString()); + menuManager.addSwap("remove", "teleport", config.telecapeMode().toString()); + } + if (config.getCombatBracelet()) { menuManager.addSwap("remove", "combat bracelet", config.getCombatBraceletMode().toString()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CharterOption.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CharterOption.java new file mode 100644 index 0000000000..668d993dcb --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/CharterOption.java @@ -0,0 +1,20 @@ +package net.runelite.client.plugins.menuentryswapper.util; + +public enum CharterOption +{ + TRADE("Trade"), + CHARTER("Charter"); + + private final String name; + + CharterOption(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return name; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/teleEquippedMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/teleEquippedMode.java new file mode 100644 index 0000000000..9f22bcbc3e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/util/teleEquippedMode.java @@ -0,0 +1,20 @@ +package net.runelite.client.plugins.menuentryswapper.util; + +public enum teleEquippedMode +{ + TELE_TO_POH("Tele to POH"), + TELEPORT("teleport"); + + private final String name; + + teleEquippedMode(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return name; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java index 5cea04a613..148d7e4255 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/metronome/MetronomePlugin.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.metronome; import com.google.inject.Provides; import javax.inject.Inject; +import net.runelite.api.SoundEffectVolume; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; @@ -164,7 +165,7 @@ public class MetronomePlugin extends Plugin { if (tockClip == null) { - client.playSoundEffect(SoundEffectID.GE_INCREMENT_PLOP); + client.playSoundEffect(SoundEffectID.GE_DECREMENT_PLOP, SoundEffectVolume.MEDIUM_HIGH); } else { @@ -180,7 +181,7 @@ public class MetronomePlugin extends Plugin { if (tickClip == null) { - client.playSoundEffect(SoundEffectID.GE_DECREMENT_PLOP); + client.playSoundEffect(SoundEffectID.GE_DECREMENT_PLOP, SoundEffectVolume.MEDIUM_HIGH); } else { 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 90a7a9e66e..7fd4cff995 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 @@ -194,7 +194,7 @@ public class NpcSceneOverlay extends Overlay break; } - if (config.drawNames()) + if (config.drawNames() && actor.getName() != null) { String npcName = Text.removeTags(actor.getName()); Point textLocation = actor.getCanvasTextLocation(graphics, npcName, actor.getLogicalHeight() + 40); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java index 7a59d02a33..5e57404903 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsConfig.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2019, Owain van Brakel * Copyright (c) 2018, Tomas Slusny * All rights reserved. * @@ -30,48 +31,85 @@ 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 net.runelite.client.config.Stub; @ConfigGroup("objectindicators") public interface ObjectIndicatorsConfig extends Config { @ConfigItem( - position = 0, + keyName = "overlayStub", + name = "Overlay Style", + description = "", + position = 0 + ) + default Stub overlayStub() + { + return new Stub(); + } + + @ConfigItem( + position = 1, + keyName = "objectMarkerRenderStyle", + name = "Highlight Style", + description = "Highlight setting", + parent = "overlayStub" + ) + default RenderStyle objectMarkerRenderStyle() + { + return RenderStyle.OUTLINE; + } + + + @ConfigItem( + position = 2, + keyName = "objectMarkerOutlineRenderStyle", + name = "Outline Style", + description = "Highlight outline setting", + parent = "overlayStub", + hidden = true, + unhide = "objectMarkerRenderStyle", + unhideValue = "OUTLINE" + ) + default OutlineRenderStyle objectMarkerOutlineRenderStyle() + { + return OutlineRenderStyle.NORMAL_OUTLINE; + } + + @ConfigItem( + keyName = "colorStub", + name = "Colors", + description = "", + position = 3 + ) + default Stub colorStub() + { + return new Stub(); + } + + @ConfigItem( + position = 4, keyName = "markerColor", name = "Marker color", - description = "Configures the color of object marker" + description = "Configures the outer color of object marker", + parent = "colorStub" ) - default Color markerColor() + default Color objectMarkerColor() { return Color.YELLOW; } @Range( - min = 0, - max = 10 + max = 100 ) @ConfigItem( - position = 1, - keyName = "stroke", - name = "Stroke Size", - description = "Configures the stroke size of object marker" - ) - default int stroke() - { - return 2; - } - - @Range( - min = 0, - max = 255 - ) - @ConfigItem( - position = 2, - keyName = "alpha", + position = 5, + keyName = "objectMarkerAlpha", name = "Alpha", - description = "Configures the opacity/alpha of object marker" + description = "Configures the opacity/alpha of object marker", + parent = "colorStub" ) - default int alpha() + default int objectMarkerAlpha() { - return 20; + return 100; } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java index 08c1aa94ff..a4e9aee7e9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/ObjectIndicatorsOverlay.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2019, Owain van Brakel * Copyright (c) 2018, Tomas Slusny * All rights reserved. * @@ -24,33 +25,40 @@ */ package net.runelite.client.plugins.objectindicators; -import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; +import java.awt.geom.Area; +import static java.lang.Math.floor; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.DecorativeObject; import net.runelite.api.GameObject; import net.runelite.api.TileObject; +import net.runelite.client.graphics.ModelOutlineRenderer; 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.OverlayPriority; +import net.runelite.client.ui.overlay.OverlayUtil; class ObjectIndicatorsOverlay extends Overlay { + private static final Color TRANSPARENT = new Color(0, 0, 0, 0); + private final Client client; private final ObjectIndicatorsConfig config; private final ObjectIndicatorsPlugin plugin; + private final ModelOutlineRenderer modelOutliner; @Inject - private ObjectIndicatorsOverlay(Client client, ObjectIndicatorsConfig config, ObjectIndicatorsPlugin plugin) + private ObjectIndicatorsOverlay(Client client, ObjectIndicatorsConfig config, ObjectIndicatorsPlugin plugin, ModelOutlineRenderer modelOutliner) { this.client = client; this.config = config; this.plugin = plugin; + this.modelOutliner = modelOutliner; setPosition(OverlayPosition.DYNAMIC); setPriority(OverlayPriority.LOW); setLayer(OverlayLayer.ABOVE_SCENE); @@ -66,46 +74,70 @@ class ObjectIndicatorsOverlay extends Overlay continue; } - final Polygon polygon; - Polygon polygon2 = null; + Color color = config.objectMarkerColor(); + int opacity = (int) floor(config.objectMarkerAlpha() * 2.55); + Color objectColor = new Color(color.getRed(), color.getGreen(), color.getBlue(), opacity); - if (object instanceof GameObject) + switch (config.objectMarkerRenderStyle()) { - polygon = ((GameObject) object).getConvexHull(); - } - else if (object instanceof DecorativeObject) - { - polygon = ((DecorativeObject) object).getConvexHull(); - polygon2 = ((DecorativeObject) object).getConvexHull2(); - } - else - { - polygon = object.getCanvasTilePoly(); - } + case OUTLINE: + switch (config.objectMarkerOutlineRenderStyle()) + { + case THIN_OUTLINE: + modelOutliner.drawOutline(object, 1, objectColor); + break; - if (polygon != null) - { - renderPoly(graphics, polygon, config.markerColor(), config.stroke(), config.alpha()); - } + case NORMAL_OUTLINE: + modelOutliner.drawOutline(object, 2, objectColor); + break; - if (polygon2 != null) - { - renderPoly(graphics, polygon2, config.markerColor(), config.stroke(), config.alpha()); + case THIN_GLOW: + modelOutliner.drawOutline(object, 4, objectColor, TRANSPARENT); + break; + + case GLOW: + modelOutliner.drawOutline(object, 8, objectColor, TRANSPARENT); + break; + } + break; + case HULL: + final Polygon polygon; + Polygon polygon2 = null; + + if (object instanceof GameObject) + { + polygon = ((GameObject) object).getConvexHull(); + } + else if (object instanceof DecorativeObject) + { + polygon = ((DecorativeObject) object).getConvexHull(); + polygon2 = ((DecorativeObject) object).getConvexHull2(); + } + else + { + polygon = object.getCanvasTilePoly(); + } + + if (polygon != null) + { + OverlayUtil.renderPolygon(graphics, polygon, objectColor); + } + + if (polygon2 != null) + { + OverlayUtil.renderPolygon(graphics, polygon2, objectColor); + } + break; + case CLICKBOX: + Area clickbox = object.getClickbox(); + if (clickbox != null) + { + OverlayUtil.renderHoverableArea(graphics, object.getClickbox(), client.getMouseCanvasPosition(), TRANSPARENT, objectColor, objectColor.darker()); + } + break; } } return null; } - - private void renderPoly(Graphics2D graphics, Polygon polygon, Color color, int stroke, int alpha) - { - if (polygon != null) - { - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 255)); - graphics.setStroke(new BasicStroke(stroke)); - graphics.draw(polygon); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha)); - graphics.fill(polygon); - } - } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/batools/CycleCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/OutlineRenderStyle.java similarity index 79% rename from runelite-client/src/main/java/net/runelite/client/plugins/batools/CycleCounter.java rename to runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/OutlineRenderStyle.java index e6c026fe05..2ed550f2b1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/batools/CycleCounter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/OutlineRenderStyle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, https://runelitepl.us + * Copyright (c) 2019, Owain van Brakel * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,16 +22,13 @@ * (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.batools; -import java.awt.image.BufferedImage; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.ui.overlay.infobox.Counter; +package net.runelite.client.plugins.objectindicators; -class CycleCounter extends Counter +public enum OutlineRenderStyle { - CycleCounter(BufferedImage img, Plugin plugin, int tick) - { - super(img, plugin, tick); - } + THIN_OUTLINE, + NORMAL_OUTLINE, + THIN_GLOW, + GLOW } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/RenderStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/RenderStyle.java new file mode 100644 index 0000000000..4ef9af24ca --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/objectindicators/RenderStyle.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2019, Owain van Brakel + * 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.objectindicators; + +public enum RenderStyle +{ + CLICKBOX, + HULL, + OUTLINE +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java index 14a42e13b7..9ca6337427 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java @@ -65,7 +65,7 @@ class OpponentInfoOverlay extends Overlay private final PanelComponent panelComponent = new PanelComponent(); - private Integer lastMaxHealth; + private int lastMaxHealth; private int lastRatio = 0; private int lastHealthScale = 0; private String opponentName; @@ -111,7 +111,7 @@ class OpponentInfoOverlay extends Overlay lastHealthScale = opponent.getHealth(); opponentName = Text.removeTags(opponent.getName()); - lastMaxHealth = null; + lastMaxHealth = -1; if (opponent instanceof NPC) { lastMaxHealth = npcManager.getHealth(((NPC) opponent).getId()); @@ -167,7 +167,7 @@ class OpponentInfoOverlay extends Overlay final HitpointsDisplayStyle displayStyle = opponentInfoConfig.hitpointsDisplayStyle(); if ((displayStyle == HitpointsDisplayStyle.HITPOINTS || displayStyle == HitpointsDisplayStyle.BOTH) - && lastMaxHealth != null) + && lastMaxHealth != -1) { // This is the reverse of the calculation of healthRatio done by the server // which is: healthRatio = 1 + (healthScale - 1) * health / maxHealth (if health > 0, 0 otherwise) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java index e6cc7dcf83..9134c1f8d1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPingOverlay.java @@ -32,7 +32,6 @@ import java.util.Iterator; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.Perspective; -import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint; import net.runelite.client.plugins.party.data.PartyTilePingData; import net.runelite.client.ui.overlay.Overlay; @@ -60,18 +59,6 @@ class PartyPingOverlay extends Overlay return null; } - // Update selected scene tile - if (!client.isMenuOpen()) - { - Point p = client.getMouseCanvasPosition(); - p = new Point( - p.getX() - client.getViewportXOffset(), - p.getY() - client.getViewportYOffset()); - - client.setCheckClick(true); - client.setMouseCanvasHoverPosition(p); - } - synchronized (plugin.getPendingTilePings()) { final Iterator iterator = plugin.getPendingTilePings().iterator(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java index 272ec5d6ab..d3095afd5a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pestcontrol/PestControlPlugin.java @@ -396,7 +396,7 @@ public class PestControlPlugin extends Plugin } // Get points from dialog after purchase - Widget pestControlDialog = client.getWidget(WidgetInfo.PEST_CONTROL_DIALOG_TEXT); + Widget pestControlDialog = client.getWidget(WidgetInfo.MINIGAME_DIALOG_TEXT); if (pestControlDialog != null) { String pestControlDialogText = Text.sanitizeMultilineText(pestControlDialog.getText()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java index 0fda9fe9af..4a7c393f31 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/pvptools/PvpToolsPlugin.java @@ -1,10 +1,12 @@ /* - * Copyright (c) 2019. PKLite - All Rights Reserved - * Unauthorized modification, distribution, or possession of this source file, via any medium is strictly prohibited. - * Proprietary and confidential. Refer to PKLite License file for more information on - * full terms of this copyright and to determine what constitutes authorized use. - * Written by PKLite(ST0NEWALL, others) , 2019 - * + * ****************************************************************************** + * * Copyright (c) 2019 RuneLitePlus + * * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. + * * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors: + * * ST0NEWALL#9112 + * * RuneLitePlus Discord: https://discord.gg/Q7wFtCe + * * RuneLitePlus website: https://runelitepl.us + * ***************************************************************************** */ package net.runelite.client.plugins.pvptools; @@ -44,6 +46,7 @@ import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuOpened; import net.runelite.api.events.PlayerDespawned; import net.runelite.api.events.PlayerSpawned; +import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.AsyncBufferedImage; @@ -104,6 +107,9 @@ public class PvpToolsPlugin extends Plugin @Inject private ItemManager itemManager; + @Inject + private ChatMessageManager chatMessageManager; + private PvpToolsPlugin uhPvpToolsPlugin = this; private static final String WALK_HERE = "WALK HERE"; @@ -510,6 +516,7 @@ public class PvpToolsPlugin extends Plugin } } + /** * Enables or disables the fall in helper feature */ diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java index dec84b0a5f..47805b8f39 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java @@ -29,7 +29,6 @@ import java.awt.Color; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; -import net.runelite.client.config.Keybind; import net.runelite.client.config.Stub; @ConfigGroup("raids") @@ -259,15 +258,29 @@ public interface RaidsConfig extends Config @ConfigItem( position = 17, parent = "roomConfig", - keyName = "crabColor", - name = "Crab color", + keyName = "goodCrabColor", + name = "Good Crab color", description = "The color of good crabs", hidden = true, unhide = "crabHandler" ) - default Color crabColor() + default Color goodCrabColor() { - return Color.MAGENTA; + return new Color(255, 155, 245); + } + + @ConfigItem( + position = 17, + parent = "roomConfig", + keyName = "rareCrabColor", + name = "Rare Crab color", + description = "The color of rare crabs", + hidden = true, + unhide = "crabHandler" + ) + default Color rareCrabColor() + { + return new Color(255, 200, 0); } @ConfigItem( @@ -457,15 +470,4 @@ public interface RaidsConfig extends Config { return false; } - - @ConfigItem( - keyName = "hotkey", - name = "Toggle scout overlay", - description = "When pressed the scout overlay will be toggled. Must enable show scout overlay in raid", - position = 33 - ) - default Keybind hotkey() - { - return Keybind.NOT_SET; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java index 3c15b0b678..2bfa3e41be 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java @@ -25,7 +25,6 @@ */ package net.runelite.client.plugins.raids; -import com.google.common.collect.ImmutableList; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; @@ -35,8 +34,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.inject.Inject; import lombok.Getter; import lombok.Setter; @@ -71,42 +68,6 @@ public class RaidsOverlay extends Overlay private static final int SMALL_ICON_SIZE = 21; private static final int TITLE_COMPONENT_HEIGHT = 20; private static final int LINE_COMPONENT_HEIGHT = 16; - private static final Pattern FIRST_HALF = Pattern.compile("Start, (.*), End,"); - private static final Pattern SECOND_HALF = Pattern.compile(", Start, (.*), End"); - private static final ImmutableList goodCrabsFirst = ImmutableList.of( - "FSCCP.PCSCF - #WNWSWN#ESEENW", - "SCFCP.CSCFS - #ENEESW#ENWWSW", - "SCFPC.CSPCF - #WSWWNE#WSEENE", - "SCPFC.CCPSF - #NWWWSE#WNEESE", - "SCPFC.CSPCF - #NEEESW#WWNEEE", - "SCSPF.CCSPF - #ESWWNW#ESENES", - "SPCFC.CSPCF - #WWNEEE#WSWNWS", - "SCPFC.PCSCF - #WNEEES#NWSWNW", //rare crabs first bad crabs second - "SFCCPC.PCSCPF - #WSEENES#WWWNEEE", //good crabs first rare crabs second rare crabs third - "SCPFC.CCSSF - #NEESEN#WSWWNE" //good crabs - ); - private static final ImmutableList goodCrabsSecond = ImmutableList.of( - "FSCCP.PCSCF - #WNWSWN#ESEENW", - "FSCCS.PCPSF - #WSEEEN#WSWNWS", - "FSCPC.CSCPF - #WNWWSE#EENWWW", - "SCFCP.CCSPF - #ESEENW#ESWWNW", - "SCFCP.CSCFS - #ENEESW#ENWWSW", - "SCFPC.CSPCF - #WSWWNE#WSEENE", - "SCFPC.PCCSF - #WSEENE#WWWSEE", - "SCFPC.SCPCF - #NESENE#WSWWNE", - "SCPFC.CCPSF - #NWWWSE#WNEESE", - "SCPFC.CSPCF - #NEEESW#WWNEEE", - "SCPFC.CSPSF - #WWSEEE#NWSWWN", - "SCSPF.CCSPF - #ESWWNW#ESENES", - "SFCCP.CSCPF - #WNEESE#NWSWWN", - "SFCCS.PCPSF - #ENWWSW#ENESEN", - "SPCFC.CSPCF - #WWNEEE#WSWNWS", - "SPCFC.SCCPF - #ESENES#WWWNEE", - "SPSFP.CCCSF - #NWSWWN#ESEENW", //bad crabs first good crabs second - "SFCCPC.PCSCPF - #WSEENES#WWWNEEE", //good crabs first rare crabs second rare crabs third - "FSCCP.PCSCF - #ENWWWS#NEESEN", //bad crabs first good crabs second - "SCPFC.CCSSF - #NEESEN#WSWWNE" //good crabs - ); private final PanelComponent panelComponent = new PanelComponent(); private final ItemManager itemManager; private final SpriteManager spriteManager; @@ -116,17 +77,13 @@ public class RaidsOverlay extends Overlay private RaidsConfig config; @Setter private boolean sharable = false; - @Getter @Setter private boolean scoutOverlayShown = false; - @Getter private boolean scouterActive = false; - @Getter private int width; - @Getter private int height; @@ -191,9 +148,6 @@ public class RaidsOverlay extends Overlay { color = Color.RED; } - - Matcher firstMatcher = FIRST_HALF.matcher(plugin.getRaid().getFullRotationString()); - Matcher secondMatcher = SECOND_HALF.matcher(plugin.getRaid().getFullRotationString()); int combatCount = 0; int roomCount = 0; List iceRooms = new ArrayList<>(); @@ -295,7 +249,7 @@ public class RaidsOverlay extends Overlay .color(color) .build()); - if (recordRaid()) + if (plugin.recordRaid() != null) { panelComponent.getChildren().add(TitleComponent.builder() .text("Record Raid") @@ -402,15 +356,20 @@ public class RaidsOverlay extends Overlay } if (config.crabHandler() && puzzleNameLC.equals("crabs")) { - if (firstMatcher.find() && secondMatcher.find()) + if (plugin.getGoodCrabs() == null) { - if (crabHandler(firstMatcher.group(1), secondMatcher.group(1))) + color = Color.RED; + } + else + { + switch (plugin.getGoodCrabs()) { - color = config.crabColor(); - } - else - { - color = Color.RED; + case "Good Crabs": + color = config.goodCrabColor(); + break; + case "Rare Crabs": + color = config.rareCrabColor(); + break; } } } @@ -508,26 +467,4 @@ public class RaidsOverlay extends Overlay } return ImageUtil.resizeCanvas(bim, SMALL_ICON_SIZE, SMALL_ICON_SIZE); } - - private boolean crabHandler(String firstHalf, String secondHalf) - { - return (firstHalf.contains("Crabs") && goodCrabsFirst.contains(plugin.getLayoutFullCode())) - || (secondHalf.contains("Crabs") && goodCrabsSecond.contains(plugin.getLayoutFullCode())); - } - - boolean recordRaid() - { - Matcher firstMatcher = FIRST_HALF.matcher(plugin.getRaid().getFullRotationString()); - Matcher secondMatcher = SECOND_HALF.matcher(plugin.getRaid().getFullRotationString()); - if (plugin.getRaid().getRotationString().toLowerCase().equals("vasa,tekton,vespula") - && plugin.getRaid().getFullRotationString().toLowerCase().contains("crabs") - && plugin.getRaid().getFullRotationString().toLowerCase().contains("tightrope")) - { - if (firstMatcher.find() && secondMatcher.find()) - { - return (crabHandler(firstMatcher.group(1), secondMatcher.group(1))); - } - } - return false; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 26d5db698c..4ea46f01cd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -25,10 +25,10 @@ */ package net.runelite.client.plugins.raids; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.inject.Binder; import com.google.inject.Provides; -import java.io.IOException; import java.awt.image.BufferedImage; import java.text.DecimalFormat; import java.time.Instant; @@ -39,7 +39,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ScheduledExecutorService; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; @@ -71,15 +70,12 @@ import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatColorType; import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; -import net.runelite.client.chat.ChatCommandManager; import net.runelite.client.chat.QueuedMessage; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.OverlayMenuClicked; import net.runelite.client.game.ItemManager; -import net.runelite.client.events.ChatInput; import net.runelite.client.game.SpriteManager; -import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; @@ -87,7 +83,6 @@ import net.runelite.client.plugins.raids.solver.Layout; import net.runelite.client.plugins.raids.solver.LayoutSolver; import net.runelite.client.plugins.raids.solver.RotationSolver; import net.runelite.client.ui.ClientToolbar; -import net.runelite.client.ui.DrawManager; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayMenuEntry; @@ -95,17 +90,14 @@ import net.runelite.client.ui.overlay.WidgetOverlay; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.ui.overlay.tooltip.Tooltip; import net.runelite.client.ui.overlay.tooltip.TooltipManager; -import net.runelite.client.util.HotkeyListener; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; import org.apache.commons.lang3.StringUtils; -import static net.runelite.client.util.Text.sanitize; -import net.runelite.http.api.chat.ChatClient; @PluginDescriptor( - name = "Chambers Of Xeric", + name = "CoX Scouter", description = "Show helpful information for the Chambers of Xeric raid", - tags = {"combat", "raid", "overlay", "pve", "pvm", "bosses", "cox", "olm"}, + tags = {"combat", "raid", "overlay", "pve", "pvm", "bosses", "cox", "olm", "scout"}, type = PluginType.PVM, enabledByDefault = false ) @@ -118,13 +110,40 @@ public class RaidsPlugin extends Plugin private static final String RAID_START_MESSAGE = "The raid has begun!"; private static final String LEVEL_COMPLETE_MESSAGE = "level complete!"; private static final String RAID_COMPLETE_MESSAGE = "Congratulations - your raid is complete!"; - private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###.##"); private static final String SPLIT_REGEX = "\\s*,\\s*"; - private static final String LAYOUT_COMMAND_STRING = "!layout"; + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###.##"); private static final Pattern ROTATION_REGEX = Pattern.compile("\\[(.*?)]"); - private static final int LINE_COMPONENT_HEIGHT = 16; - private static final Pattern LEVEL_COMPLETE_REGEX = Pattern.compile("(.+) level complete! Duration: ([0-9:]+)"); private static final Pattern RAID_COMPLETE_REGEX = Pattern.compile("Congratulations - your raid is complete! Duration: ([0-9:]+)"); + private static final ImmutableSet GOOD_CRABS_FIRST = ImmutableSet.of( + "FSCCP.PCSCF - #WNWSWN#ESEENW", //both good crabs + "SCSPF.CCSPF - #ESWWNW#ESENES", //both good crabs + "SPCFC.CSPCF - #WWNEEE#WSWNWS", //both good crabs + "SCFCP.CSCFS - #ENEESW#ENWWSW", //good crabs + "SCPFC.CCSSF - #NEESEN#WSWWNE", //good crabs + "SCFPC.CSPCF - #WSWWNE#WSEENE" //good crabs first rare crabs second + ); + private static final ImmutableSet GOOD_CRABS_SECOND = ImmutableSet.of( + "SCFCP.CCSPF - #ESEENW#ESWWNW", //bad crabs first good crabs second + "SCPFC.CSPSF - #WWSEEE#NWSWWN", //bad crabs first good crabs second + "SFCCS.PCPSF - #ENWWSW#ENESEN", //bad crabs first good crabs second + "SPCFC.SCCPF - #ESENES#WWWNEE", //bad crabs first good crabs second + "SPSFP.CCCSF - #NWSWWN#ESEENW", //bad crabs first good crabs second + "FSCCP.PCSCF - #ENWWWS#NEESEN" //bad crabs first good crabs second + ); + private static final ImmutableSet RARE_CRABS_FIRST = ImmutableSet.of( + "SCPFC.CSPCF - #NEEESW#WWNEEE", //rare crabs first good crabs second + "SCPFC.PCSCF - #WNEEES#NWSWNW", //rare crabs first bad crabs second + "SCPFC.CCPSF - #NWWWSE#WNEESE" //both rare crabs + ); + private static final ImmutableSet RARE_CRABS_SECOND = ImmutableSet.of( + "FSCPC.CSCPF - #WNWWSE#EENWWW", //bad crabs first rare crabs second + "SCFPC.PCCSF - #WSEENE#WWWSEE", //bad crabs first rare crabs second + "SCFPC.SCPCF - #NESENE#WSWWNE", //bad crabs first rare crabs second + "SFCCP.CSCPF - #WNEESE#NWSWWN", //bad crabs first rare crabs second + "SCFPC.CSPCF - #WSWWNE#WSEENE" //good crabs first rare crabs second + ); + private static final String TRIPLE_PUZZLE = "SFCCPC.PCSCPF - #WSEENES#WWWNEEE"; //good crabs first rare crabs second rare crabs third + private static final Pattern PUZZLES = Pattern.compile("Puzzle - (\\w+)"); @Getter private final ArrayList roomWhitelist = new ArrayList<>(); @Getter @@ -135,7 +154,6 @@ public class RaidsPlugin extends Plugin private final ArrayList layoutWhitelist = new ArrayList<>(); @Getter private final Map> recommendedItemsList = new HashMap<>(); - public boolean canShow; @Inject private ChatMessageManager chatMessageManager; @Inject @@ -143,14 +161,6 @@ public class RaidsPlugin extends Plugin @Inject private Client client; @Inject - private DrawManager drawManager; - @Inject - private ChatCommandManager chatCommandManager; - @Inject - private ChatClient chatClient; - @Inject - private ScheduledExecutorService executor; - @Inject private RaidsConfig config; @Inject private OverlayManager overlayManager; @@ -163,32 +173,21 @@ public class RaidsPlugin extends Plugin @Inject private LayoutSolver layoutSolver; @Inject - private KeyManager keyManager; - @Inject private SpriteManager spriteManager; @Inject private ClientThread clientThread; @Inject private TooltipManager tooltipManager; + @Inject + private ClientToolbar clientToolbar; + @Inject + private ItemManager itemManager; @Getter private Raid raid; @Getter private boolean inRaidChambers; - @Inject - private ClientToolbar clientToolbar; - private int upperTime = -1; - private int middleTime = -1; - private int lowerTime = -1; - private int raidTime = -1; - private WidgetOverlay widgetOverlay; - private String tooltip; - @Inject - private ItemManager itemManager; - private NavigationButton navButton; - private boolean raidStarted; @Getter - private String layoutFullCode; - private RaidsTimer timer; + private String goodCrabs; @Getter private int startPlayerCount; @Getter @@ -197,6 +196,18 @@ public class RaidsPlugin extends Plugin private List startingPartyMembers = new ArrayList<>(); @Getter private Set missingPartyMembers = new HashSet<>(); + @Getter + private String layoutFullCode; + @Getter + private boolean raidStarted; + private int upperTime = -1; + private int middleTime = -1; + private int lowerTime = -1; + private int raidTime = -1; + private WidgetOverlay widgetOverlay; + private String tooltip; + private NavigationButton navButton; + private RaidsTimer timer; @Provides RaidsConfig provideConfig(ConfigManager configManager) @@ -219,10 +230,8 @@ public class RaidsPlugin extends Plugin { overlayManager.add(partyOverlay); } - keyManager.registerKeyListener(hotkeyListener); updateLists(); clientThread.invokeLater(() -> checkRaidPresence(true)); - chatCommandManager.registerCommandAsync(LAYOUT_COMMAND_STRING, this::lookupRaid, this::submitRaidLookup); widgetOverlay = overlayManager.getWidgetOverlay(WidgetInfo.RAIDS_POINTS_INFOBOX); RaidsPanel panel = injector.getInstance(RaidsPanel.class); panel.init(config); @@ -247,14 +256,6 @@ public class RaidsPlugin extends Plugin overlayManager.remove(partyOverlay); } infoBoxManager.removeInfoBox(timer); - keyManager.unregisterKeyListener(hotkeyListener); - inRaidChambers = false; - widgetOverlay = null; - raidStarted = false; - raid = null; - timer = null; - chatCommandManager.unregisterCommand(LAYOUT_COMMAND_STRING); - final Widget widget = client.getWidget(WidgetInfo.RAIDS_POINTS_INFOBOX); if (widget != null) { @@ -492,72 +493,6 @@ public class RaidsPlugin extends Plugin } } - private void lookupRaid(final ChatMessage chatmessage, final String message) - { - final String player; - if (chatmessage.getType().equals(ChatMessageType.PRIVATECHATOUT)) - { - player = client.getLocalPlayer().getName(); - } - else - { - player = sanitize(chatmessage.getName()); - } - - final String layout; - try - { - layout = chatClient.getLayout(player); - } - catch (IOException ex) - { - log.debug("unable to lookup raids layout", ex); - return; - } - - chatmessage.getMessageNode().setRuneLiteFormatMessage(new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append("Layout: ") - .append(ChatColorType.NORMAL) - .append(layout) - .build()); - - chatMessageManager.update(chatmessage.getMessageNode()); - client.refreshChat(); - } - - private boolean submitRaidLookup(final ChatInput chatInput, final String value) - { - if (!inRaidChambers) - { - return true; - } - - final String playerName = sanitize(client.getLocalPlayer().getName()); - final String layout = getRaid().getLayout().toCodeString(); - final String rooms = getRaid().toRoomString(); - final String raidData = "[" + layout + "]: " + rooms; - log.debug("Submitting raids layout {} for {}", raidData, playerName); - - executor.execute(() -> - { - try - { - chatClient.submitLayout(playerName, raidData); - } - catch (IOException e) - { - log.warn("unable to submit raids layout", e); - } - finally - { - chatInput.resume(); - } - }); - - return true; - } - private void updatePartyMembers(boolean force) { int partySize = client.getVar(Varbits.RAID_PARTY_SIZE); @@ -587,17 +522,18 @@ public class RaidsPlugin extends Plugin } partyMembers.clear(); - for (int i = 0; i < widgets.length; i++) + for (Widget widget : widgets) { - if (widgets[i] != null) + if (widget == null || widget.getText() == null) { - // Party members names can be found as a color tagged string in every fourth(ish) of these children - String name = widgets[i].getName(); - if (name.length() > 1) - { - // Clean away tag - partyMembers.add(name.substring(name.indexOf('>') + 1, name.indexOf('<', 1))); - } + continue; + } + + String name = widget.getName(); + + if (name.length() > 1) + { + partyMembers.add(name.substring(name.indexOf('>') + 1, name.indexOf('<', 1))); } } @@ -654,23 +590,43 @@ public class RaidsPlugin extends Plugin return; } - layoutFullCode = layout.getTest(); - log.debug("Full Layout Code: " + layoutFullCode); + layoutFullCode = layout.getCode(); raid.updateLayout(layout); RotationSolver.solve(raid.getCombatRooms()); - overlay.setScoutOverlayShown(true); + setOverlayStatus(true); sendRaidLayoutMessage(); + Matcher puzzleMatch = PUZZLES.matcher(raid.getFullRotationString()); + final List puzzles = new ArrayList<>(); + while (puzzleMatch.find()) + { + puzzles.add(puzzleMatch.group()); + } + if (raid.getFullRotationString().contains("Crabs")) + { + switch (puzzles.size()) + { + case 1: + goodCrabs = handleCrabs(puzzles.get(0)); + break; + case 2: + goodCrabs = handleCrabs(puzzles.get(0), puzzles.get(1)); + break; + case 3: + goodCrabs = handleCrabs(puzzles.get(0), puzzles.get(1), puzzles.get(2)); + break; + } + } } else if (!config.scoutOverlayAtBank()) { - overlay.setScoutOverlayShown(false); + setOverlayStatus(false); } } // If we left party raid was started or we left raid if (client.getVar(VarPlayer.IN_RAID_PARTY) == -1 && (!inRaidChambers || !config.scoutOverlayInRaid())) { - overlay.setScoutOverlayShown(false); + setOverlayStatus(false); raidStarted = false; } } @@ -696,7 +652,7 @@ public class RaidsPlugin extends Plugin .build()) .build()); - if (overlay.recordRaid()) + if (recordRaid() != null) { chatMessageManager.queue(QueuedMessage.builder() .type(ChatMessageType.FRIENDSCHATNOTIFICATION) @@ -1061,6 +1017,10 @@ public class RaidsPlugin extends Plugin lowerTime = -1; raidTime = -1; tooltip = null; + inRaidChambers = false; + widgetOverlay = null; + raidStarted = false; + timer = null; } private int timeToSeconds(String s) @@ -1143,22 +1103,73 @@ public class RaidsPlugin extends Plugin tooltip = builder.toString(); } - private final HotkeyListener hotkeyListener = new HotkeyListener(() -> config.hotkey()) + private String handleCrabs(String firstGroup) { - @Override - public void hotkeyPressed() + if (firstGroup.contains("Crabs") && GOOD_CRABS_FIRST.contains(layoutFullCode)) { - if (config.scoutOverlayInRaid() && raidStarted) + return "Good Crabs"; + } + if (firstGroup.contains("Crabs") && RARE_CRABS_FIRST.contains(layoutFullCode)) + { + return "Rare Crabs"; + } + return null; + } + + private String handleCrabs(String firstGroup, String secondGroup) + { + if (firstGroup.contains("Crabs") && GOOD_CRABS_FIRST.contains(layoutFullCode)) + { + return "Good Crabs"; + } + if (secondGroup.contains("Crabs") && GOOD_CRABS_SECOND.contains(layoutFullCode)) + { + return "Good Crabs"; + } + if (firstGroup.contains("Crabs") && RARE_CRABS_FIRST.contains(layoutFullCode)) + { + return "Rare Crabs"; + } + if (secondGroup.contains("Crabs") && RARE_CRABS_SECOND.contains(layoutFullCode)) + { + return "Rare Crabs"; + } + return null; + } + + private String handleCrabs(String firstGroup, String secondGroup, String thirdGroup) + { + if (firstGroup.contains("Crabs")) + { + return "Good Crabs"; + } + if (secondGroup.contains("Crabs")) + { + return "Rare Crabs"; + } + if (thirdGroup.contains("Crabs")) + { + return "Rare Crabs"; + } + return null; + } + + String recordRaid() + { + if (raid.getRotationString().toLowerCase().equals("vasa,tekton,vespula") + && raid.getFullRotationString().toLowerCase().contains("crabs") + && raid.getFullRotationString().toLowerCase().contains("tightrope")) + { + if (goodCrabs != null) { - if (overlay.isScoutOverlayShown()) - { - overlay.setScoutOverlayShown(false); - } - else - { - overlay.setScoutOverlayShown(true); - } + return goodCrabs; } } - }; + return null; + } + + private void setOverlayStatus(boolean bool) + { + overlay.setScoutOverlayShown(bool); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java index 49944432a8..09357f7774 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/Layout.java @@ -36,7 +36,7 @@ public class Layout @Getter @Setter - private String test; + private String code; public void add(Room room) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java index c71a0ce946..f53de67596 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/solver/LayoutSolver.java @@ -213,7 +213,7 @@ public class LayoutSolver room.setPrevious(lastRoom); lastRoom.setNext(room); layout.add(room); - layout.setTest(code); + layout.setCode(code); position += 8; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java index a08fb63880..7a113607ee 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetWeaknessOverlay.java @@ -98,9 +98,9 @@ class TargetWeaknessOverlay extends Overlay final int healthScale = target.getHealth(); final int healthRatio = target.getHealthRatio(); - final Integer maxHealth = npcManager.getHealth(target.getId()); + final int maxHealth = npcManager.getHealth(target.getId()); - if (healthRatio < 0 || healthScale <= 0 || maxHealth == null) + if (healthRatio < 0 || healthScale <= 0 || maxHealth == -1) { return -1; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/NPCContainer.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/NPCContainer.java index 6f787a9444..6edc06cead 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/NPCContainer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/NPCContainer.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2018, Woox * Copyright (c) 2019, Ganom + * Copyright (c) 2019, Lucas * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,65 +25,125 @@ */ package net.runelite.client.plugins.ticktimers; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import java.awt.Color; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.Setter; import net.runelite.api.Actor; +import net.runelite.api.AnimationID; import net.runelite.api.NPC; import net.runelite.api.NPCDefinition; +import net.runelite.api.NpcID; +import net.runelite.api.Prayer; +@Getter class NPCContainer { - @Getter private NPC npc; - @Getter private int npcIndex; - @Getter private String npcName; - @Getter private int npcSize; + private ImmutableSet animations; + private int attackSpeed; @Setter - @Getter - private int TicksUntilAttack; + private int ticksUntilAttack; @Setter - @Getter - private int npcSpeed; - @Setter - @Getter private Actor npcInteracting; @Setter - @Getter - private Attackstyle attackStyle; + private AttackStyle attackStyle; - NPCContainer(NPC npc) + NPCContainer(NPC npc, int attackSpeed) { this.npc = npc; this.npcName = npc.getName(); this.npcIndex = npc.getIndex(); this.npcInteracting = npc.getInteracting(); - this.npcSpeed = 0; - this.attackStyle = Attackstyle.UNKNOWN; - this.TicksUntilAttack = 0; + this.attackStyle = AttackStyle.UNKNOWN; + this.attackSpeed = attackSpeed; + this.ticksUntilAttack = -1; final NPCDefinition composition = npc.getTransformedDefinition(); + BossMonsters monster = BossMonsters.of(npc.getId()); + + if (monster == null) + { + throw new IllegalStateException(); + } + + this.animations = monster.animations; + this.attackStyle = monster.attackStyle; + if (composition != null) { this.npcSize = composition.getSize(); } } + @RequiredArgsConstructor + enum BossMonsters + { + SERGEANT_STRONGSTACK(NpcID.SERGEANT_STRONGSTACK, AttackStyle.MELEE, ImmutableSet.of(AnimationID.MINION_AUTO1, AnimationID.MINION_AUTO2, AnimationID.MINION_AUTO3)), + SERGEANT_STEELWILL(NpcID.SERGEANT_STEELWILL, AttackStyle.MAGE, ImmutableSet.of(AnimationID.MINION_AUTO1, AnimationID.MINION_AUTO2, AnimationID.MINION_AUTO3)), + SERGEANT_GRIMSPIKE(NpcID.SERGEANT_GRIMSPIKE, AttackStyle.RANGE, ImmutableSet.of(AnimationID.MINION_AUTO1, AnimationID.MINION_AUTO2, AnimationID.MINION_AUTO4)), + GENERAL_GRAARDOR(NpcID.GENERAL_GRAARDOR, AttackStyle.MELEE, ImmutableSet.of(AnimationID.GENERAL_AUTO1, AnimationID.GENERAL_AUTO2, AnimationID.GENERAL_AUTO3)), + + TSTANON_KARLAK(NpcID.TSTANON_KARLAK, AttackStyle.MELEE, ImmutableSet.of(AnimationID.ZAMMY_GENERIC_AUTO)), + BALFRUG_KREEYATH(NpcID.BALFRUG_KREEYATH, AttackStyle.MAGE, ImmutableSet.of(AnimationID.ZAMMY_GENERIC_AUTO, AnimationID.BALFRUG_AUTO)), + ZAKLN_GRITCH(NpcID.ZAKLN_GRITCH, AttackStyle.RANGE, ImmutableSet.of(AnimationID.ZAMMY_GENERIC_AUTO, AnimationID.ZAKL_AUTO)), + KRIL_TSUTSAROTH(NpcID.KRIL_TSUTSAROTH, AttackStyle.UNKNOWN, ImmutableSet.of(AnimationID.KRIL_SPEC, AnimationID.KRIL_AUTO)), + + STARLIGHT(NpcID.STARLIGHT, AttackStyle.MELEE, ImmutableSet.of(AnimationID.STARLIGHT_AUTO)), + GROWLER(NpcID.GROWLER, AttackStyle.MAGE, ImmutableSet.of(AnimationID.GROWLER_AUTO)), + BREE(NpcID.BREE, AttackStyle.RANGE, ImmutableSet.of(AnimationID.BREE_AUTO)), + COMMANDER_ZILYANA(NpcID.COMMANDER_ZILYANA, AttackStyle.UNKNOWN, ImmutableSet.of(AnimationID.ZILYANA_AUTO, AnimationID.ZILYANA_MELEE_AUTO, AnimationID.ZILYANA_SPEC)), + + FLIGHT_KILISA(NpcID.FLIGHT_KILISA, AttackStyle.MELEE, ImmutableSet.of(AnimationID.KILISA_AUTO)), + FLOCKLEADER_GEERIN(NpcID.FLOCKLEADER_GEERIN, AttackStyle.MAGE, ImmutableSet.of(AnimationID.GEERIN_AUTO, AnimationID.GEERIN_FLINCH)), + WINGMAN_SKREE(NpcID.WINGMAN_SKREE, AttackStyle.RANGE, ImmutableSet.of(AnimationID.SKREE_AUTO)), + KREEARRA(NpcID.KREEARRA, AttackStyle.RANGE, ImmutableSet.of(AnimationID.KREE_RANGED)), + + DAGANNOTH_REX(NpcID.DAGANNOTH_REX, AttackStyle.MAGE, ImmutableSet.of(AnimationID.DAG_REX)), + DAGANNOTH_SUPREME(NpcID.DAGANNOTH_SUPREME, AttackStyle.RANGE, ImmutableSet.of(AnimationID.DAG_SUPREME)), + DAGANNOTH_PRIME(NpcID.DAGANNOTH_PRIME, AttackStyle.MAGE, ImmutableSet.of(AnimationID.DAG_PRIME)); + + private static ImmutableMap idMap; + + static + { + ImmutableMap.Builder builder = ImmutableMap.builder(); + + for (BossMonsters monster : values()) + { + builder.put(monster.npcID, monster); + } + + idMap = builder.build(); + } + + private final int npcID; + private final AttackStyle attackStyle; + private final ImmutableSet animations; + + static BossMonsters of(int npcID) + { + return idMap.get(npcID); + } + } @AllArgsConstructor @Getter - public enum Attackstyle + public enum AttackStyle { - MAGE("Mage", Color.CYAN), - RANGE("Range", Color.GREEN), - MELEE("Melee", Color.RED), - UNKNOWN("Unknown", Color.WHITE); + MAGE("Mage", Color.CYAN, Prayer.PROTECT_FROM_MAGIC), + RANGE("Range", Color.GREEN, Prayer.PROTECT_FROM_MISSILES), + MELEE("Melee", Color.RED, Prayer.PROTECT_FROM_MELEE), + UNKNOWN("Unknown", Color.WHITE, null); - private String name = ""; + private String name; private Color color; + private Prayer prayer; } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersConfig.java index 34ace17ef9..58b0a346cd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersConfig.java @@ -23,6 +23,9 @@ */ package net.runelite.client.plugins.ticktimers; +import java.awt.Font; +import lombok.AllArgsConstructor; +import lombok.Getter; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; @@ -34,6 +37,54 @@ public interface TickTimersConfig extends Config { @ConfigItem( position = 0, + keyName = "mainConfig", + name = "Main Config", + description = "" + ) + default Stub mainConfig() + { + return new Stub(); + } + + @ConfigItem( + position = 1, + keyName = "prayerWidgetHelper", + name = "Prayer Widget Helper", + description = "Shows you which prayer to click and the time until click.", + parent = "mainConfig" + ) + default boolean showPrayerWidgetHelper() + { + return false; + } + + @ConfigItem( + position = 2, + keyName = "showHitSquares", + name = "Show Hit Squares", + description = "Shows you where the melee bosses can hit you from.", + parent = "mainConfig" + ) + default boolean showHitSquares() + { + return false; + } + + @ConfigItem( + position = 3, + keyName = "changeTickColor", + name = "Change Tick Color", + description = "If this is enabled, it will change the tick color to white" + + "
at 1 tick remaining, signaling you to swap.", + parent = "mainConfig" + ) + default boolean changeTickColor() + { + return false; + } + + @ConfigItem( + position = 4, keyName = "bosses", name = "Bosses", description = "" @@ -44,19 +95,31 @@ public interface TickTimersConfig extends Config } @ConfigItem( - position = 1, - keyName = "graardor", - name = "General Graardor", - description = "Show tick timers for General Graardor", + position = 5, + keyName = "gwd", + name = "God Wars Dungeon", + description = "Show tick timers for GWD Bosses. This must be enabled before you zone in.", parent = "bosses" ) - default boolean graardor() + default boolean gwd() { return true; } @ConfigItem( - position = 22, + position = 6, + keyName = "dks", + name = "Dagannoth Kings", + description = "Show tick timers for Dagannoth Kings. This must be enabled before you zone in.", + parent = "bosses" + ) + default boolean dks() + { + return true; + } + + @ConfigItem( + position = 7, keyName = "text", name = "Text", description = "" @@ -67,7 +130,7 @@ public interface TickTimersConfig extends Config } @ConfigItem( - position = 23, + position = 8, keyName = "fontStyle", name = "Font Style", description = "Plain | Bold | Italics", @@ -75,7 +138,7 @@ public interface TickTimersConfig extends Config ) default FontStyle fontStyle() { - return FontStyle.PLAIN; + return FontStyle.BOLD; } @Range( @@ -83,7 +146,7 @@ public interface TickTimersConfig extends Config max = 40 ) @ConfigItem( - position = 24, + position = 9, keyName = "textSize", name = "Text Size", description = "Text Size for Timers.", @@ -95,7 +158,7 @@ public interface TickTimersConfig extends Config } @ConfigItem( - position = 25, + position = 10, keyName = "shadows", name = "Shadows", description = "Adds Shadows to text.", @@ -105,4 +168,22 @@ public interface TickTimersConfig extends Config { return false; } + + @Getter + @AllArgsConstructor + enum FontStyle + { + BOLD("Bold", Font.BOLD), + ITALIC("Italic", Font.ITALIC), + PLAIN("Plain", Font.PLAIN); + + private String name; + private int font; + + @Override + public String toString() + { + return getName(); + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersPlugin.java index 5ad1d7b542..2454e42a1e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TickTimersPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, ganom + * Copyright (c) 2019, Ganom * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,13 +24,13 @@ package net.runelite.client.plugins.ticktimers; import com.google.inject.Provides; -import java.util.HashMap; -import java.util.Map; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import net.runelite.api.AnimationID; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.NPC; @@ -41,11 +41,11 @@ import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.NPCManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; import net.runelite.client.ui.overlay.OverlayManager; -import org.apache.commons.lang3.ArrayUtils; @PluginDescriptor( name = "Boss Tick Timers", @@ -59,21 +59,24 @@ import org.apache.commons.lang3.ArrayUtils; public class TickTimersPlugin extends Plugin { private static final int GENERAL_REGION = 11347; + private static final int ARMA_REGION = 11346; + private static final int SARA_REGION = 11601; + private static final int ZAMMY_REGION = 11603; + private static final int WATERBITH_REGION = 11589; @Inject private Client client; - @Inject private OverlayManager overlayManager; - @Inject private TimersOverlay timersOverlay; - @Inject private TickTimersConfig config; - + @Inject + private NPCManager npcManager; @Getter(AccessLevel.PACKAGE) - private Map npcContainer = new HashMap<>(); + private Set npcContainer = new HashSet<>(); + private boolean validRegion; @Provides TickTimersConfig getConfig(ConfigManager configManager) @@ -91,41 +94,71 @@ public class TickTimersPlugin extends Plugin public void shutDown() { npcContainer.clear(); + overlayManager.remove(timersOverlay); + validRegion = false; } @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged) { - if (gameStateChanged.getGameState() == GameState.LOGGED_IN) - { - if (isInGeneralRegion()) - { - overlayManager.add(timersOverlay); - } - else - { - overlayManager.remove(timersOverlay); - } - } if (gameStateChanged.getGameState() != GameState.LOGGED_IN) { return; } + + if (regionCheck()) + { + validRegion = true; + overlayManager.add(timersOverlay); + } + else + { + validRegion = false; + overlayManager.remove(timersOverlay); + } npcContainer.clear(); } @Subscribe public void onNpcSpawned(NpcSpawned event) { + if (!validRegion) + { + return; + } + NPC npc = event.getNpc(); + switch (npc.getId()) { case NpcID.SERGEANT_STRONGSTACK: case NpcID.SERGEANT_STEELWILL: case NpcID.SERGEANT_GRIMSPIKE: case NpcID.GENERAL_GRAARDOR: - case NpcID.GENERAL_GRAARDOR_6494: - npcContainer.put(npc, new NPCContainer(npc)); + case NpcID.TSTANON_KARLAK: + case NpcID.BALFRUG_KREEYATH: + case NpcID.ZAKLN_GRITCH: + case NpcID.KRIL_TSUTSAROTH: + case NpcID.STARLIGHT: + case NpcID.BREE: + case NpcID.GROWLER: + case NpcID.COMMANDER_ZILYANA: + case NpcID.FLIGHT_KILISA: + case NpcID.FLOCKLEADER_GEERIN: + case NpcID.WINGMAN_SKREE: + case NpcID.KREEARRA: + if (config.gwd()) + { + npcContainer.add(new NPCContainer(npc, npcManager.getAttackSpeed(npc.getId()))); + } + break; + case NpcID.DAGANNOTH_REX: + case NpcID.DAGANNOTH_SUPREME: + case NpcID.DAGANNOTH_PRIME: + if (config.dks()) + { + npcContainer.add(new NPCContainer(npc, npcManager.getAttackSpeed(npc.getId()))); + } break; } } @@ -133,92 +166,76 @@ public class TickTimersPlugin extends Plugin @Subscribe public void onNpcDespawned(NpcDespawned event) { - if (npcContainer.remove(event.getNpc()) != null && !npcContainer.isEmpty()) + if (!validRegion) { - npcContainer.remove(event.getNpc()); + return; + } + + NPC npc = event.getNpc(); + + switch (npc.getId()) + { + case NpcID.SERGEANT_STRONGSTACK: + case NpcID.SERGEANT_STEELWILL: + case NpcID.SERGEANT_GRIMSPIKE: + case NpcID.GENERAL_GRAARDOR: + case NpcID.TSTANON_KARLAK: + case NpcID.BALFRUG_KREEYATH: + case NpcID.ZAKLN_GRITCH: + case NpcID.KRIL_TSUTSAROTH: + case NpcID.STARLIGHT: + case NpcID.BREE: + case NpcID.GROWLER: + case NpcID.COMMANDER_ZILYANA: + case NpcID.FLIGHT_KILISA: + case NpcID.FLOCKLEADER_GEERIN: + case NpcID.WINGMAN_SKREE: + case NpcID.KREEARRA: + case NpcID.DAGANNOTH_REX: + case NpcID.DAGANNOTH_SUPREME: + case NpcID.DAGANNOTH_PRIME: + npcContainer.removeIf(c -> c.getNpc() == npc); + break; } } @Subscribe public void onGameTick(GameTick Event) { - if (config.graardor()) + if (!validRegion) { - graardorHandler(); + return; } + + handleBosses(); } - private void graardorHandler() + private void handleBosses() { - for (NPCContainer npcs : getNpcContainer().values()) + for (NPCContainer npcs : getNpcContainer()) { - switch (npcs.getNpc().getId()) + if (npcs.getTicksUntilAttack() >= 0) { - case NpcID.SERGEANT_STRONGSTACK: - npcs.setTicksUntilAttack(npcs.getTicksUntilAttack() - 1); - npcs.setAttackStyle(NPCContainer.Attackstyle.MELEE); - switch (npcs.getNpc().getAnimation()) + npcs.setTicksUntilAttack(npcs.getTicksUntilAttack() - 1); + } + + for (int anims : npcs.getAnimations()) + { + if (anims == npcs.getNpc().getAnimation()) + { + if (npcs.getTicksUntilAttack() < 1) { - case AnimationID.MINION_AUTO1: - case AnimationID.MINION_AUTO2: - if (npcs.getTicksUntilAttack() < 1) - { - npcs.setTicksUntilAttack(5); - } - break; + npcs.setTicksUntilAttack(npcs.getAttackSpeed()); } - break; - case NpcID.SERGEANT_STEELWILL: - npcs.setTicksUntilAttack(npcs.getTicksUntilAttack() - 1); - npcs.setAttackStyle(NPCContainer.Attackstyle.MAGE); - switch (npcs.getNpc().getAnimation()) - { - case AnimationID.MINION_AUTO1: - case AnimationID.MINION_AUTO2: - case AnimationID.MINION_AUTO3: - if (npcs.getTicksUntilAttack() < 1) - { - npcs.setTicksUntilAttack(5); - } - break; - } - case NpcID.SERGEANT_GRIMSPIKE: - npcs.setTicksUntilAttack(npcs.getTicksUntilAttack() - 1); - npcs.setAttackStyle(NPCContainer.Attackstyle.RANGE); - switch (npcs.getNpc().getAnimation()) - { - case AnimationID.MINION_AUTO1: - case AnimationID.MINION_AUTO2: - case AnimationID.MINION_AUTO4: - if (npcs.getTicksUntilAttack() < 1) - { - npcs.setTicksUntilAttack(5); - } - break; - } - break; - case NpcID.GENERAL_GRAARDOR: - case NpcID.GENERAL_GRAARDOR_6494: - npcs.setTicksUntilAttack(npcs.getTicksUntilAttack() - 1); - npcs.setAttackStyle(NPCContainer.Attackstyle.MELEE); - switch (npcs.getNpc().getAnimation()) - { - case AnimationID.GENERAL_AUTO1: - case AnimationID.GENERAL_AUTO2: - case AnimationID.GENERAL_AUTO3: - if (npcs.getTicksUntilAttack() < 1) - { - npcs.setTicksUntilAttack(6); - } - break; - } - break; + } } } } - private boolean isInGeneralRegion() + private boolean regionCheck() { - return ArrayUtils.contains(client.getMapRegions(), GENERAL_REGION); + return Arrays.stream(client.getMapRegions()).anyMatch( + x -> x == ARMA_REGION || x == GENERAL_REGION || x == ZAMMY_REGION || x == SARA_REGION || x == WATERBITH_REGION + ); } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java index fee89efb66..a07cf1bede 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java @@ -24,19 +24,17 @@ */ package net.runelite.client.plugins.ticktimers; -import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics2D; -import java.awt.Polygon; +import java.awt.Rectangle; +import java.util.List; import javax.inject.Inject; import net.runelite.api.Client; -import net.runelite.api.NPC; -import net.runelite.api.NPCDefinition; -import net.runelite.api.Perspective; import net.runelite.api.Point; -import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -63,67 +61,91 @@ public class TimersOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - Color tickcolor; - - for (NPCContainer npcs : plugin.getNpcContainer().values()) + for (NPCContainer npc : plugin.getNpcContainer()) { - renderNpcOverlay(graphics, npcs.getNpc(), npcs.getAttackStyle().getColor(), 100, 10); - final int ticksLeft = npcs.getTicksUntilAttack(); - if (ticksLeft > 0) + if (npc.getNpc() == null) { - if (ticksLeft == 1) + continue; + } + + int ticksLeft = npc.getTicksUntilAttack(); + final List hitSquares = getHitSquares(npc.getNpc().getWorldLocation(), npc.getNpcSize(), 1, false); + final NPCContainer.AttackStyle attackStyle = npc.getAttackStyle(); + + if (config.showHitSquares() && attackStyle.getName().equals("Melee")) + { + for (WorldPoint p : hitSquares) { - tickcolor = npcs.getAttackStyle().getColor(); + OverlayUtil.drawTile(graphics, client, p, client.getLocalPlayer().getWorldLocation(), attackStyle.getColor(), 0, 0, 50); } - else + } + + if (ticksLeft <= 0) + { + continue; + } + + final String ticksLeftStr = String.valueOf(ticksLeft); + final int font = config.fontStyle().getFont(); + final boolean shadows = config.shadows(); + Color color = (ticksLeft <= 1 ? Color.WHITE : attackStyle.getColor()); + + if (!config.changeTickColor()) + { + color = attackStyle.getColor(); + } + + final Point canvasPoint = npc.getNpc().getCanvasTextLocation(graphics, Integer.toString(ticksLeft), 0); + + OverlayUtil.renderTextLocation(graphics, ticksLeftStr, config.textSize(), font, color, canvasPoint, shadows, 0); + + if (config.showPrayerWidgetHelper() && attackStyle.getPrayer() != null) + { + Rectangle bounds = OverlayUtil.renderPrayerOverlay(graphics, client, attackStyle.getPrayer(), color); + + if (bounds != null) { - tickcolor = Color.WHITE; + renderTextLocation(graphics, ticksLeftStr, 16, config.fontStyle().getFont(), color, centerPoint(bounds), shadows); } - final String ticksLeftStr = String.valueOf(ticksLeft); - Point canvasPoint = npcs.getNpc().getCanvasTextLocation(graphics, ticksLeftStr, 0); - renderTextLocation(graphics, ticksLeftStr, config.textSize(), config.fontStyle().getFont(), tickcolor, canvasPoint); } } return null; } - private void renderNpcOverlay(Graphics2D graphics, NPC actor, Color color, int outlineAlpha, int fillAlpha) - { - int size = 1; - NPCDefinition composition = actor.getTransformedDefinition(); - if (composition != null) - { - size = composition.getSize(); - } - LocalPoint lp = actor.getLocalLocation(); - Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); - - if (tilePoly != null) - { - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); - graphics.setStroke(new BasicStroke(2)); - graphics.draw(tilePoly); - graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); - graphics.fill(tilePoly); - } - } - - private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint) + private void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint, boolean shadows) { graphics.setFont(new Font("Arial", fontStyle, fontSize)); if (canvasPoint != null) { final Point canvasCenterPoint = new Point( - canvasPoint.getX(), - canvasPoint.getY()); + canvasPoint.getX() - 3, + canvasPoint.getY() + 6); final Point canvasCenterPoint_shadow = new Point( - canvasPoint.getX() + 1, - canvasPoint.getY() + 1); - if (config.shadows()) + canvasPoint.getX() - 2, + canvasPoint.getY() + 7); + if (shadows) { OverlayUtil.renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); } OverlayUtil.renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); } } + + private List getHitSquares(WorldPoint npcLoc, int npcSize, int thickness, boolean includeUnder) + { + List little = new WorldArea(npcLoc, npcSize, npcSize).toWorldPointList(); + List big = new WorldArea(npcLoc.getX() - thickness, npcLoc.getY() - thickness, npcSize + (thickness * 2), npcSize + (thickness * 2), npcLoc.getPlane()).toWorldPointList(); + if (!includeUnder) + { + big.removeIf(little::contains); + } + return big; + } + + private Point centerPoint(Rectangle rect) + { + int x = (int) (rect.getX() + rect.getWidth() / 2); + int y = (int) (rect.getY() + rect.getHeight() / 2); + return new Point(x, y); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java index 53a4995192..4d554fee56 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersPlugin.java @@ -1,16 +1,20 @@ -/******************************************************************************* - * Copyright (c) 2019. PKLite - * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. - * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the following authors: - * - * PKLite discord: https://discord.gg/Dp3HuFM - * Written by PKLite(ST0NEWALL, others) , 2019 - * - ******************************************************************************/ + +/* + * ****************************************************************************** + * * Copyright (c) 2019 RuneLitePlus + * * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. + * * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors: + * * ST0NEWALL#9112 + * * RuneLitePlus Discord: https://discord.gg/Q7wFtCe + * * RuneLitePlus website: https://runelitepl.us + * ***************************************************************************** + */ package net.runelite.client.plugins.whalewatchers; import com.google.inject.Provides; +import java.util.EnumSet; +import java.util.Objects; import javax.inject.Inject; import lombok.Getter; import net.runelite.api.Client; @@ -21,9 +25,9 @@ import net.runelite.api.Skill; import net.runelite.api.SkullIcon; import net.runelite.api.VarPlayer; import net.runelite.api.Varbits; -import static net.runelite.api.WorldType.HIGH_RISK; -import static net.runelite.api.WorldType.PVP; +import net.runelite.api.WorldType; import static net.runelite.api.WorldType.isPvpWorld; +import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.HitsplatApplied; import net.runelite.api.events.ItemContainerChanged; @@ -50,7 +54,9 @@ import org.apache.commons.lang3.ObjectUtils; public class WhaleWatchersPlugin extends Plugin { - public boolean enableOverlay = false; + private static final String CONFIG_GROUP_NAME = "WhaleWatchers"; + + public boolean protectItemOverlay = false; public int damageDone = 0; public int damageTaken = 0; public boolean inCombat = false; @@ -83,11 +89,7 @@ public class WhaleWatchersPlugin extends Plugin @Subscribe public void onOverlayMenuClicked(OverlayMenuClicked event) { - if (!event.getOverlay().equals(overlay)) - { - return; - } - else + if (event.getOverlay().equals(overlay)) { if (event.getEntry().getOption().equals("Reset")) { @@ -116,6 +118,28 @@ public class WhaleWatchersPlugin extends Plugin resetDamageCounter(); } + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (!event.getGroup().equals(CONFIG_GROUP_NAME)) + { + return; + } + + if (!config.protectItemWarning()) + { + protectItemOverlay = false; + } + if (!config.gloryWarning()) + { + displayGloryOverlay = false; + } + if (!config.smiteableWarning()) + { + displaySmiteOverlay = false; + } + } + @Subscribe public void onHitsplatApplied(HitsplatApplied event) @@ -186,28 +210,32 @@ public class WhaleWatchersPlugin extends Plugin { try { - if (client.getLocalPlayer().getSkullIcon() == (SkullIcon.SKULL)) + final SkullIcon skullIcon = Objects.requireNonNull(client.getLocalPlayer().getSkullIcon()); + final EnumSet worldTypes = client.getWorldType(); + if (WorldType.isHighRiskWorld(worldTypes)) { - if (client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 0 && client.getVar(Varbits.IN_WILDERNESS) == 1 || - client.getWorldType().contains(PVP)) - { - enableOverlay = true; - } - if (client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 1 || client.getVar(Varbits.IN_WILDERNESS) == 0 || - client.getWorldType().contains(HIGH_RISK) || client.getWorld() == 365) - { - enableOverlay = false; - } + protectItemOverlay = false; + return; } - else + if (skullIcon.equals(SkullIcon.SKULL)) { - enableOverlay = false; + if (WorldType.isPvpWorld(worldTypes) || WorldType.isDeadmanWorld(worldTypes) || + client.getVar(Varbits.IN_WILDERNESS) == 1) + { + protectItemOverlay = client.getRealSkillLevel(Skill.PRAYER) > 25 && + client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 0; + } + else + { + protectItemOverlay = false; + } } } catch (NullPointerException e) { - + // local player isn't skulled } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java index ecfc3c3b37..b0d7dc7cac 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/whalewatchers/WhaleWatchersProtOverlay.java @@ -1,12 +1,14 @@ -/******************************************************************************* - * Copyright (c) 2019. PKLite - * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. - * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the following authors: - * - * PKLite discord: https://discord.gg/Dp3HuFM - * Written by PKLite(ST0NEWALL, others) , 2019 - * - ******************************************************************************/ + +/* + * ****************************************************************************** + * * Copyright (c) 2019 RuneLitePlus + * * Redistributions and modifications of this software are permitted as long as this notice remains in its original unmodified state at the top of this file. + * * If there are any questions comments, or feedback about this software, please direct all inquiries directly to the file authors: + * * ST0NEWALL#9112 + * * RuneLitePlus Discord: https://discord.gg/Q7wFtCe + * * RuneLitePlus website: https://runelitepl.us + * ***************************************************************************** + */ package net.runelite.client.plugins.whalewatchers; @@ -49,7 +51,7 @@ public class WhaleWatchersProtOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (plugin.enableOverlay && config.protectItemWarning()) + if (plugin.protectItemOverlay && config.protectItemWarning()) { Rectangle rectangle = new Rectangle(); rectangle.setBounds(client.getCanvas().getBounds()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java index 304dd3d439..c7e4b1610b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java @@ -278,6 +278,12 @@ public class XpGlobesOverlay extends Overlay String xpHrString = decimalFormat.format(xpHr); tableComponent.addRow(ColorUtil.prependColorTag("XP per hour:", Color.ORANGE), xpHrString); } + + if (config.enableTimeToLevel()) + { + String timeLeft = xpTrackerService.getTimeTillGoal(mouseOverSkill.getSkill()); + tableComponent.addRow(ColorUtil.prependColorTag("TimeLeft:", Color.ORANGE), timeLeft); + } } xpTooltip.getChildren().add(tableComponent); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java index 266a39f8ac..2967c370f0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java @@ -126,9 +126,9 @@ class XpState * @param npc currently interacted NPC * @param npcHealth health of currently interacted NPC */ - void updateNpcExperience(Skill skill, NPC npc, Integer npcHealth) + void updateNpcExperience(Skill skill, NPC npc, int npcHealth) { - if (npc == null || npc.getCombatLevel() <= 0 || npcHealth == null) + if (npc == null || npc.getCombatLevel() <= 0 || npcHealth == -1) { return; } @@ -170,11 +170,11 @@ class XpState * @param npcHealth max health of npc that just died * @return UPDATED in case new kill was successfully added */ - XpUpdateResult updateNpcKills(Skill skill, NPC npc, Integer npcHealth) + XpUpdateResult updateNpcKills(Skill skill, NPC npc, int npcHealth) { XpStateSingle state = getSkill(skill); - if (state.getXpGained() <= 0 || npcHealth == null || npc != interactedNPC) + if (state.getXpGained() <= 0 || npcHealth == -1 || npc != interactedNPC) { return XpUpdateResult.NO_CHANGE; } 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 7a3d10f718..83df559115 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 @@ -28,8 +28,10 @@ import com.google.common.base.Strings; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; +import java.awt.Font; import java.awt.Graphics2D; import java.awt.Polygon; +import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.geom.Area; @@ -38,8 +40,11 @@ import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.Perspective; import net.runelite.api.Point; +import net.runelite.api.Prayer; import net.runelite.api.TileObject; import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.widgets.Widget; /** @@ -259,8 +264,7 @@ public class OverlayUtil return result; } - public static void renderActorTextAndImage(Graphics2D graphics, Actor actor, String text, Color color, - BufferedImage image, int yOffset, int xOffset) + public static void renderActorTextAndImage(Graphics2D graphics, Actor actor, String text, Color color, BufferedImage image, int yOffset, int xOffset) { Point textLocation = new Point(actor.getConvexHull().getBounds().x + xOffset, actor.getConvexHull().getBounds().y + yOffset); @@ -271,4 +275,69 @@ public class OverlayUtil textLocation = new Point(textLocation.getX() + xOffset, textLocation.getY() + image.getHeight() - yOffset); renderTextLocation(graphics, textLocation, text, color); } + + public static void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint, boolean shadows, int yOffset) + { + graphics.setFont(new Font("Arial", fontStyle, fontSize)); + if (canvasPoint != null) + { + final Point canvasCenterPoint = new Point( + canvasPoint.getX(), + canvasPoint.getY() + yOffset); + final Point canvasCenterPoint_shadow = new Point( + canvasPoint.getX() + 1, + canvasPoint.getY() + 1); + if (shadows) + { + renderTextLocation(graphics, canvasCenterPoint_shadow, txtString, Color.BLACK); + } + renderTextLocation(graphics, canvasCenterPoint, txtString, fontColor); + } + } + + public static void drawTile(Graphics2D graphics, Client client, WorldPoint point, WorldPoint playerPoint, Color color, int strokeWidth, int outlineAlpha, int fillAlpha) + { + if (point.distanceTo(playerPoint) >= 32) + { + return; + } + LocalPoint lp = LocalPoint.fromWorld(client, point); + if (lp == null) + { + return; + } + + Polygon poly = Perspective.getCanvasTilePoly(client, lp); + if (poly == null) + { + return; + } + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); + graphics.setStroke(new BasicStroke(strokeWidth)); + graphics.draw(poly); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); + graphics.fill(poly); + } + + public static Rectangle renderPrayerOverlay(Graphics2D graphics, Client client, Prayer prayer, Color color) + { + Widget widget = client.getWidget(prayer.getWidgetInfo()); + + if (widget == null || widget.isHidden()) + { + return null; + } + + Rectangle bounds = widget.getBounds(); + renderPolygon(graphics, rectangleToPolygon(bounds), color); + return bounds; + } + + private static Polygon rectangleToPolygon(Rectangle rect) + { + int[] xpoints = {rect.x, rect.x + rect.width, rect.x + rect.width, rect.x}; + int[] ypoints = {rect.y, rect.y, rect.y + rect.height, rect.y + rect.height}; + + return new Polygon(xpoints, ypoints, 4); + } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/fighter.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/fighter.png new file mode 100644 index 0000000000..dc3f909ee1 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/fighter.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/healer.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/healer.png new file mode 100644 index 0000000000..1938a5abdc Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/healer.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/ranger.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/ranger.png new file mode 100644 index 0000000000..662fa27e51 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/ranger.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/runner.png b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/runner.png new file mode 100644 index 0000000000..0b0ab46b9a Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/barbarianassault/runner.png differ diff --git a/runelite-client/src/main/resources/npc_stats.json b/runelite-client/src/main/resources/npc_stats.json index 2542737c5e..a2b4725500 100644 --- a/runelite-client/src/main/resources/npc_stats.json +++ b/runelite-client/src/main/resources/npc_stats.json @@ -4,6 +4,7 @@ "hitpoints": 52, "combatLevel": 51, "slayerLevel": 39, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 50, @@ -19,6 +20,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -35,6 +37,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -51,6 +54,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -67,6 +71,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -83,6 +88,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -99,6 +105,7 @@ "hitpoints": 90, "combatLevel": 96, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -115,6 +122,7 @@ "hitpoints": 105, "combatLevel": 115, "slayerLevel": 80, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 97, "defenceLevel": 105, @@ -130,6 +138,7 @@ "name": "Death spawn", "hitpoints": 60, "combatLevel": 46, + "attackSpeed": 4, "attackLevel": 67, "strengthLevel": 7, "defenceLevel": 30, @@ -146,6 +155,7 @@ "hitpoints": 105, "combatLevel": 115, "slayerLevel": 80, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 97, "defenceLevel": 105, @@ -162,6 +172,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -174,6 +185,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -186,6 +198,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -198,6 +211,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -210,6 +224,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -222,6 +237,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -234,6 +250,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -246,6 +263,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -258,6 +276,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -270,6 +289,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -282,6 +302,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -294,6 +315,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -306,6 +328,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -318,6 +341,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -330,6 +354,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -342,6 +367,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -354,6 +380,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -366,6 +393,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -378,6 +406,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -390,6 +419,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -402,6 +432,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -414,6 +445,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -426,6 +458,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -438,6 +471,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -450,6 +484,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -462,6 +497,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -474,6 +510,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -486,6 +523,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -498,6 +536,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -510,6 +549,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -522,6 +562,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -534,6 +575,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -546,6 +588,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -558,6 +601,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -570,6 +614,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -582,6 +627,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -594,6 +640,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -606,6 +653,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -618,6 +666,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -637,6 +686,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -656,6 +706,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -675,6 +726,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -694,6 +746,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -713,6 +766,7 @@ "hitpoints": 22, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 9, "defenceLevel": 10, @@ -725,6 +779,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -740,6 +795,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -755,6 +811,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -770,6 +827,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -785,6 +843,7 @@ "hitpoints": 24, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -800,6 +859,7 @@ "hitpoints": 24, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -815,6 +875,7 @@ "hitpoints": 24, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -830,6 +891,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -848,6 +910,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -866,6 +929,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -884,6 +948,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -902,6 +967,7 @@ "hitpoints": 17, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -920,6 +986,7 @@ "hitpoints": 59, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 35, "defenceLevel": 36, @@ -938,6 +1005,7 @@ "hitpoints": 59, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 35, "defenceLevel": 36, @@ -956,6 +1024,7 @@ "hitpoints": 17, "combatLevel": 16, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 14, "defenceLevel": 14, @@ -968,6 +1037,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -984,6 +1054,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1000,6 +1071,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1016,6 +1088,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1032,6 +1105,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1048,6 +1122,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1064,6 +1139,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1080,6 +1156,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1096,6 +1173,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1112,6 +1190,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1128,6 +1207,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1144,6 +1224,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1160,6 +1241,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1175,6 +1257,7 @@ "name": "Soulless", "hitpoints": 24, "combatLevel": 18, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -1186,6 +1269,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -1196,6 +1280,7 @@ "name": "Rock Crab", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -1206,6 +1291,7 @@ "name": "Rocks", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -1216,6 +1302,7 @@ "name": "Rock Crab", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -1226,6 +1313,7 @@ "name": "Rocks", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -1237,6 +1325,7 @@ "hitpoints": 116, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 104, "defenceLevel": 102, @@ -1248,6 +1337,7 @@ "hitpoints": 116, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 104, "defenceLevel": 102, @@ -1259,6 +1349,7 @@ "hitpoints": 69, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 55, "defenceLevel": 52, @@ -1270,6 +1361,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1281,6 +1373,7 @@ "hitpoints": 44, "combatLevel": 38, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 31, "defenceLevel": 32, @@ -1292,6 +1385,7 @@ "hitpoints": 74, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 61, "defenceLevel": 62, @@ -1303,6 +1397,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1314,6 +1409,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -1325,6 +1421,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -1336,6 +1433,7 @@ "hitpoints": 49, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 36, "defenceLevel": 37, @@ -1347,6 +1445,7 @@ "hitpoints": 74, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 61, "defenceLevel": 62, @@ -1358,6 +1457,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1369,6 +1469,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1379,6 +1480,7 @@ "name": "Skeleton", "hitpoints": 29, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -1393,6 +1495,7 @@ "name": "Guard dog", "hitpoints": 49, "combatLevel": 44, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 36, "defenceLevel": 37, @@ -1403,6 +1506,7 @@ "name": "Hobgoblin", "hitpoints": 62, "combatLevel": 54, + "attackSpeed": 6, "attackLevel": 45, "strengthLevel": 43, "defenceLevel": 43, @@ -1417,6 +1521,7 @@ "name": "Troll", "hitpoints": 120, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 100, "defenceLevel": 50, @@ -1432,6 +1537,7 @@ "name": "Huge spider", "hitpoints": 90, "combatLevel": 81, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 70, "defenceLevel": 69, @@ -1442,6 +1548,7 @@ "name": "Hellhound", "hitpoints": 116, "combatLevel": 122, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 104, "defenceLevel": 102, @@ -1453,6 +1560,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -1465,6 +1573,7 @@ "name": "Baby red dragon", "hitpoints": 65, "combatLevel": 65, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 55, @@ -1480,6 +1589,7 @@ "name": "Kalphite Soldier", "hitpoints": 90, "combatLevel": 85, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -1495,6 +1605,7 @@ "name": "Steel dragon", "hitpoints": 210, "combatLevel": 246, + "attackSpeed": 4, "attackLevel": 215, "strengthLevel": 215, "defenceLevel": 215, @@ -1510,6 +1621,7 @@ "name": "Dagannoth", "hitpoints": 142, "combatLevel": 135, + "attackSpeed": 4, "attackLevel": 114, "strengthLevel": 117, "defenceLevel": 98, @@ -1527,6 +1639,7 @@ "name": "Tok-Xil", "hitpoints": 60, "combatLevel": 135, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 180, "defenceLevel": 90, @@ -1537,6 +1650,7 @@ "name": "Demon", "hitpoints": 79, "combatLevel": 82, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -1547,6 +1661,7 @@ "name": "Rocnar", "hitpoints": 100, "combatLevel": 97, + "attackSpeed": 6, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -1558,6 +1673,7 @@ "hitpoints": 34, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 16, "defenceLevel": 22, @@ -1569,6 +1685,7 @@ "hitpoints": 69, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 55, "defenceLevel": 52, @@ -1580,6 +1697,7 @@ "hitpoints": 240, "combatLevel": 276, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 240, "strengthLevel": 240, "defenceLevel": 240, @@ -1597,6 +1715,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -1609,6 +1728,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1626,6 +1746,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1643,6 +1764,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1660,6 +1782,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1677,6 +1800,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1694,6 +1818,7 @@ "hitpoints": 50, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -1711,6 +1836,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1728,6 +1854,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1745,6 +1872,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1762,6 +1890,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1779,6 +1908,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -1796,6 +1926,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1813,6 +1944,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1830,6 +1962,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1847,6 +1980,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1864,6 +1998,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1881,6 +2016,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1898,6 +2034,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1915,6 +2052,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -1932,6 +2070,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -1949,6 +2088,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -1966,6 +2106,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -1983,6 +2124,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -2000,6 +2142,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -2017,6 +2160,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2034,6 +2178,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2051,6 +2196,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2068,6 +2214,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2085,6 +2232,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -2102,6 +2250,7 @@ "hitpoints": 122, "combatLevel": 131, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 112, "strengthLevel": 112, "defenceLevel": 112, @@ -2119,6 +2268,7 @@ "hitpoints": 122, "combatLevel": 131, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 112, "strengthLevel": 112, "defenceLevel": 112, @@ -2136,6 +2286,7 @@ "hitpoints": 165, "combatLevel": 189, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 165, "defenceLevel": 165, @@ -2153,6 +2304,7 @@ "hitpoints": 165, "combatLevel": 189, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 165, "defenceLevel": 165, @@ -2170,6 +2322,7 @@ "hitpoints": 210, "combatLevel": 246, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 215, "strengthLevel": 215, "defenceLevel": 215, @@ -2187,6 +2340,7 @@ "hitpoints": 210, "combatLevel": 246, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 215, "strengthLevel": 215, "defenceLevel": 215, @@ -2204,6 +2358,7 @@ "hitpoints": 50, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 40, "defenceLevel": 30, @@ -2215,6 +2370,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 6, @@ -2230,6 +2386,7 @@ "hitpoints": 61, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 42, "defenceLevel": 28, @@ -2247,31 +2404,36 @@ "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "293": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "294": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "295": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "296": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 6, @@ -2286,6 +2448,7 @@ "name": "Gunthor the brave", "hitpoints": 35, "combatLevel": 29, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 25, @@ -2302,6 +2465,7 @@ "name": "Jailer", "hitpoints": 47, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -2316,6 +2480,7 @@ "hitpoints": 37, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 26, "defenceLevel": 27, @@ -2332,6 +2497,7 @@ "hitpoints": 37, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 26, "defenceLevel": 27, @@ -2348,6 +2514,7 @@ "hitpoints": 37, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 26, "defenceLevel": 27, @@ -2363,6 +2530,7 @@ "name": "Salarin the twisted", "hitpoints": 70, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 58, "strengthLevel": 58, "defenceLevel": 62, @@ -2373,6 +2541,7 @@ "name": "Corporeal Beast", "hitpoints": 2000, "combatLevel": 785, + "attackSpeed": 6, "attackLevel": 320, "strengthLevel": 320, "defenceLevel": 310, @@ -2391,6 +2560,7 @@ "name": "Dark energy core", "hitpoints": 25, "combatLevel": 75, + "attackSpeed": 8, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 20, @@ -2405,6 +2575,7 @@ "name": "Town Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 6, "attackLevel": 15, "strengthLevel": 15, "defenceLevel": 16, @@ -2421,6 +2592,7 @@ "name": "Town Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 6, "attackLevel": 15, "strengthLevel": 15, "defenceLevel": 16, @@ -2437,6 +2609,7 @@ "name": "Town Guard", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 6, "attackLevel": 15, "strengthLevel": 15, "defenceLevel": 16, @@ -2453,6 +2626,7 @@ "name": "Town Guard", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 6, "attackLevel": 15, "strengthLevel": 15, "defenceLevel": 16, @@ -2470,6 +2644,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -2486,6 +2661,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -2502,6 +2678,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -2518,6 +2695,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -2534,6 +2712,7 @@ "hitpoints": 97, "combatLevel": 106, "slayerLevel": 70, + "attackSpeed": 4, "attackLevel": 67, "strengthLevel": 105, "defenceLevel": 105, @@ -2549,6 +2728,7 @@ "hitpoints": 97, "combatLevel": 106, "slayerLevel": 70, + "attackSpeed": 4, "attackLevel": 67, "strengthLevel": 105, "defenceLevel": 105, @@ -2564,6 +2744,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 105, "defenceLevel": 107, @@ -2579,6 +2760,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 105, "defenceLevel": 107, @@ -2594,6 +2776,7 @@ "hitpoints": 22, "combatLevel": 23, "slayerLevel": 15, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 15, "defenceLevel": 22, @@ -2610,6 +2793,7 @@ "hitpoints": 150, "combatLevel": 124, "slayerLevel": 85, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 67, "defenceLevel": 135, @@ -2626,6 +2810,7 @@ "hitpoints": 150, "combatLevel": 124, "slayerLevel": 85, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 67, "defenceLevel": 135, @@ -2642,6 +2827,7 @@ "hitpoints": 75, "combatLevel": 61, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 45, "defenceLevel": 75, @@ -2656,6 +2842,7 @@ "hitpoints": 75, "combatLevel": 61, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 45, "defenceLevel": 75, @@ -2670,6 +2857,7 @@ "hitpoints": 37, "combatLevel": 37, "slayerLevel": 25, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 37, "defenceLevel": 37, @@ -2684,6 +2872,7 @@ "hitpoints": 37, "combatLevel": 37, "slayerLevel": 25, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 37, "defenceLevel": 37, @@ -2698,6 +2887,7 @@ "hitpoints": 27, "combatLevel": 29, "slayerLevel": 20, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 27, "defenceLevel": 27, @@ -2709,6 +2899,7 @@ "hitpoints": 27, "combatLevel": 29, "slayerLevel": 20, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 27, "defenceLevel": 27, @@ -2720,6 +2911,7 @@ "hitpoints": 105, "combatLevel": 93, "slayerLevel": 65, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 70, "defenceLevel": 40, @@ -2731,6 +2923,7 @@ "hitpoints": 81, "combatLevel": 89, "slayerLevel": 55, + "attackSpeed": 4, "attackLevel": 58, "strengthLevel": 88, "defenceLevel": 88, @@ -2744,6 +2937,7 @@ "hitpoints": 79, "combatLevel": 87, "slayerLevel": 55, + "attackSpeed": 4, "attackLevel": 56, "strengthLevel": 86, "defenceLevel": 86, @@ -2757,6 +2951,7 @@ "hitpoints": 77, "combatLevel": 85, "slayerLevel": 55, + "attackSpeed": 4, "attackLevel": 54, "strengthLevel": 84, "defenceLevel": 84, @@ -2770,6 +2965,7 @@ "hitpoints": 76, "combatLevel": 83, "slayerLevel": 55, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 83, "defenceLevel": 83, @@ -2783,6 +2979,7 @@ "hitpoints": 45, "combatLevel": 43, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 30, "defenceLevel": 22, @@ -2798,6 +2995,7 @@ "hitpoints": 45, "combatLevel": 43, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 30, "defenceLevel": 22, @@ -2813,6 +3011,7 @@ "hitpoints": 45, "combatLevel": 43, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 30, "defenceLevel": 22, @@ -2828,6 +3027,7 @@ "hitpoints": 45, "combatLevel": 43, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 30, "defenceLevel": 22, @@ -2843,6 +3043,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2854,6 +3055,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2865,6 +3067,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2876,6 +3079,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2887,6 +3091,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2898,6 +3103,7 @@ "hitpoints": 75, "combatLevel": 78, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 120, @@ -2909,6 +3115,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2921,6 +3128,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2933,6 +3141,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2945,6 +3154,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2957,6 +3167,7 @@ "hitpoints": 60, "combatLevel": 66, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 60, @@ -2969,6 +3180,7 @@ "hitpoints": 16, "combatLevel": 8, "slayerLevel": 5, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 4, "defenceLevel": 4, @@ -2981,6 +3193,7 @@ "hitpoints": 19, "combatLevel": 12, "slayerLevel": 5, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 7, "defenceLevel": 7, @@ -2993,6 +3206,7 @@ "hitpoints": 19, "combatLevel": 12, "slayerLevel": 5, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 7, "defenceLevel": 7, @@ -3005,6 +3219,7 @@ "hitpoints": 40, "combatLevel": 42, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 36, "defenceLevel": 35, @@ -3016,6 +3231,7 @@ "hitpoints": 25, "combatLevel": 24, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 22, "defenceLevel": 20, @@ -3031,6 +3247,7 @@ "hitpoints": 25, "combatLevel": 24, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 22, "defenceLevel": 20, @@ -3046,6 +3263,7 @@ "hitpoints": 25, "combatLevel": 24, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 22, "defenceLevel": 20, @@ -3061,6 +3279,7 @@ "hitpoints": 15, "combatLevel": 12, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -3074,6 +3293,7 @@ "hitpoints": 15, "combatLevel": 12, "slayerLevel": 22, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -3087,6 +3307,7 @@ "hitpoints": 25, "combatLevel": 46, "slayerLevel": 33, + "attackSpeed": 4, "attackLevel": 54, "strengthLevel": 46, "defenceLevel": 32, @@ -3103,6 +3324,7 @@ "hitpoints": 210, "combatLevel": 140, "slayerLevel": 72, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 116, "defenceLevel": 120, @@ -3120,6 +3342,7 @@ "hitpoints": 210, "combatLevel": 140, "slayerLevel": 72, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 116, "defenceLevel": 120, @@ -3137,6 +3360,7 @@ "hitpoints": 210, "combatLevel": 140, "slayerLevel": 72, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 116, "defenceLevel": 120, @@ -3154,6 +3378,7 @@ "hitpoints": 210, "combatLevel": 140, "slayerLevel": 72, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 116, "defenceLevel": 120, @@ -3171,6 +3396,7 @@ "hitpoints": 51, "combatLevel": 55, "slayerLevel": 37, + "attackSpeed": 2, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -3188,6 +3414,7 @@ "hitpoints": 51, "combatLevel": 55, "slayerLevel": 37, + "attackSpeed": 2, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -3204,6 +3431,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 20, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -3215,6 +3443,7 @@ "name": "Invrigar the Necromancer", "hitpoints": 24, "combatLevel": 20, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 14, @@ -3226,6 +3455,7 @@ "name": "Dark wizard", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -3238,6 +3468,7 @@ "hitpoints": 105, "combatLevel": 49, "slayerLevel": 35, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 16, @@ -3249,6 +3480,7 @@ "hitpoints": 105, "combatLevel": 49, "slayerLevel": 35, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 16, @@ -3259,6 +3491,7 @@ "name": "Giant frog", "hitpoints": 100, "combatLevel": 99, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 80, "defenceLevel": 65, @@ -3269,6 +3502,7 @@ "name": "Big frog", "hitpoints": 25, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 20, "defenceLevel": 15, @@ -3280,6 +3514,7 @@ "hitpoints": 25, "combatLevel": 23, "slayerLevel": 17, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 35, @@ -3291,6 +3526,7 @@ "hitpoints": 5, "combatLevel": 6, "slayerLevel": 7, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 6, @@ -3307,6 +3543,7 @@ "hitpoints": 93, "combatLevel": 96, "slayerLevel": 7, + "attackSpeed": 4, "attackLevel": 82, "strengthLevel": 80, "defenceLevel": 84, @@ -3323,6 +3560,7 @@ "hitpoints": 120, "combatLevel": 76, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 45, "defenceLevel": 30, @@ -3334,6 +3572,7 @@ "hitpoints": 120, "combatLevel": 76, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 45, "defenceLevel": 30, @@ -3345,6 +3584,7 @@ "hitpoints": 120, "combatLevel": 76, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 45, "defenceLevel": 30, @@ -3356,6 +3596,7 @@ "hitpoints": 120, "combatLevel": 76, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 45, "defenceLevel": 30, @@ -3367,6 +3608,7 @@ "hitpoints": 125, "combatLevel": 127, "slayerLevel": 87, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 150, @@ -3378,6 +3620,7 @@ "name": "Whirlpool", "combatLevel": 127, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -3391,6 +3634,7 @@ "hitpoints": 255, "combatLevel": 291, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -3403,6 +3647,7 @@ "name": "Whirlpool", "combatLevel": 127, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -3416,6 +3661,7 @@ "hitpoints": 185, "combatLevel": 160, "slayerLevel": 93, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 130, "defenceLevel": 275, @@ -3431,6 +3677,7 @@ "hitpoints": 240, "combatLevel": 301, "slayerLevel": 93, + "attackSpeed": 2, "attackLevel": 230, "strengthLevel": 220, "defenceLevel": 360, @@ -3448,6 +3695,7 @@ "name": "Mugger", "hitpoints": 8, "combatLevel": 6, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -3458,6 +3706,7 @@ "name": "Black Knight", "hitpoints": 42, "combatLevel": 33, + "attackSpeed": 5, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -3474,6 +3723,7 @@ "name": "Black Knight", "hitpoints": 42, "combatLevel": 33, + "attackSpeed": 5, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -3490,6 +3740,7 @@ "name": "Highwayman", "hitpoints": 13, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 4, @@ -3505,6 +3756,7 @@ "name": "Highwayman", "hitpoints": 13, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 4, @@ -3521,16 +3773,62 @@ "hitpoints": 20, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, "rangeLevel": 1, "magicLevel": 10 }, + "513": { + "name": "Pirate", + "hitpoints": 20, + "combatLevel": 23, + "attackSpeed": 5, + "attackLevel": 20, + "strengthLevel": 20, + "defenceLevel": 20, + "rangeLevel": 1, + "magicLevel": 1, + "slashDef": 1, + "bonusAttack": 9, + "bonusStrength": 10 + }, + "514": { + "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 + }, + "515": { + "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 + }, "517": { "name": "Thug", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 5, "defenceLevel": 9, @@ -3547,6 +3845,7 @@ "hitpoints": 17, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 13, @@ -3562,6 +3861,7 @@ "name": "Tribesman", "hitpoints": 39, "combatLevel": 32, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 27, "defenceLevel": 26, @@ -3578,6 +3878,7 @@ "hitpoints": 17, "combatLevel": 8, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -3593,6 +3894,7 @@ "name": "Chaos druid warrior", "hitpoints": 40, "combatLevel": 37, + "attackSpeed": 5, "attackLevel": 32, "strengthLevel": 34, "defenceLevel": 25, @@ -3609,6 +3911,7 @@ "name": "Necromancer", "hitpoints": 40, "combatLevel": 26, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 18, @@ -3620,6 +3923,7 @@ "hitpoints": 65, "combatLevel": 74, "slayerLevel": 57, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -3637,6 +3941,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3649,6 +3954,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3661,6 +3967,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3673,6 +3980,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3685,6 +3993,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3697,6 +4006,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3709,6 +4019,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3721,6 +4032,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3733,6 +4045,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3745,6 +4058,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3757,6 +4071,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3769,6 +4084,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3781,6 +4097,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3793,6 +4110,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3805,6 +4123,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3817,6 +4136,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3829,6 +4149,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3841,6 +4162,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3853,6 +4175,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3865,6 +4188,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3877,6 +4201,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3889,6 +4214,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3901,6 +4227,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3913,6 +4240,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3925,6 +4253,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3937,6 +4266,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3949,6 +4279,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3961,6 +4292,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3973,6 +4305,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3985,6 +4318,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -3997,6 +4331,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4009,6 +4344,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4021,6 +4357,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4033,6 +4370,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4045,6 +4383,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4057,6 +4396,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4069,6 +4409,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4081,6 +4422,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4093,6 +4435,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4104,6 +4447,7 @@ "name": "Barrelchest", "hitpoints": 134, "combatLevel": 190, + "attackSpeed": 5, "attackLevel": 170, "strengthLevel": 145, "defenceLevel": 140, @@ -4117,6 +4461,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4129,6 +4474,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4141,6 +4487,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4153,6 +4500,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4165,6 +4513,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4177,6 +4526,7 @@ "hitpoints": 52, "combatLevel": 57, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 49, "strengthLevel": 50, "defenceLevel": 50, @@ -4189,6 +4539,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -4201,6 +4552,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -4213,6 +4565,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -4225,6 +4578,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -4237,6 +4591,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -4249,6 +4604,7 @@ "hitpoints": 50, "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 50, "defenceLevel": 50, @@ -4260,6 +4616,7 @@ "name": "Evil spirit", "hitpoints": 90, "combatLevel": 150, + "attackSpeed": 4, "attackLevel": 170, "strengthLevel": 146, "defenceLevel": 100, @@ -4271,6 +4628,7 @@ "hitpoints": 40, "combatLevel": 49, "slayerLevel": 42, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 30, "defenceLevel": 40, @@ -4291,6 +4649,7 @@ "name": "Tyras guard", "hitpoints": 110, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 85, "strengthLevel": 95, "defenceLevel": 100, @@ -4307,6 +4666,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -4324,6 +4684,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -4341,6 +4702,7 @@ "hitpoints": 70, "combatLevel": 96, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 70, @@ -4352,6 +4714,7 @@ "hitpoints": 70, "combatLevel": 96, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 70, @@ -4363,6 +4726,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4372,6 +4736,7 @@ "hitpoints": 80, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 120, "defenceLevel": 80, @@ -4388,6 +4753,7 @@ "hitpoints": 80, "combatLevel": 123, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 100, @@ -4404,6 +4770,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4420,6 +4787,7 @@ "hitpoints": 80, "combatLevel": 121, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 120, @@ -4436,6 +4804,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4452,6 +4821,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4468,6 +4838,7 @@ "hitpoints": 80, "combatLevel": 121, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 120, @@ -4484,6 +4855,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4497,6 +4869,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4510,6 +4883,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4523,6 +4897,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4536,6 +4911,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4549,6 +4925,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4562,6 +4939,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4575,6 +4953,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4588,6 +4967,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4601,6 +4981,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4614,6 +4995,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4627,6 +5009,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4640,6 +5023,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4653,6 +5037,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4666,6 +5051,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4679,6 +5065,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4692,6 +5079,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -4704,6 +5092,7 @@ "name": "Giant skeleton", "hitpoints": 110, "combatLevel": 100, + "attackSpeed": 6, "attackLevel": 84, "strengthLevel": 80, "defenceLevel": 80, @@ -4718,6 +5107,7 @@ "name": "Giant skeleton", "hitpoints": 110, "combatLevel": 100, + "attackSpeed": 6, "attackLevel": 84, "strengthLevel": 80, "defenceLevel": 80, @@ -4732,6 +5122,7 @@ "name": "Damis", "hitpoints": 90, "combatLevel": 103, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 90, @@ -4748,6 +5139,7 @@ "name": "Damis", "hitpoints": 200, "combatLevel": 174, + "attackSpeed": 4, "attackLevel": 160, "strengthLevel": 100, "defenceLevel": 160, @@ -4764,6 +5156,7 @@ "name": "Stranger", "hitpoints": 80, "combatLevel": 95, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 80, "defenceLevel": 80, @@ -4781,6 +5174,7 @@ "name": "Bandit", "hitpoints": 65, "combatLevel": 74, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -4791,6 +5185,7 @@ "name": "Bandit", "hitpoints": 50, "combatLevel": 57, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -4802,6 +5197,7 @@ "hitpoints": 80, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 120, "defenceLevel": 80, @@ -4818,6 +5214,7 @@ "hitpoints": 80, "combatLevel": 123, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 100, @@ -4834,6 +5231,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4850,6 +5248,7 @@ "hitpoints": 80, "combatLevel": 121, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 120, @@ -4866,6 +5265,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4882,6 +5282,7 @@ "hitpoints": 100, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 120, @@ -4898,6 +5299,7 @@ "hitpoints": 80, "combatLevel": 121, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 120, @@ -4914,6 +5316,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4923,6 +5326,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4932,6 +5336,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4941,6 +5346,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4950,6 +5356,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4959,6 +5366,7 @@ "hitpoints": 70, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 70 @@ -4966,65 +5374,76 @@ "717": { "name": "Mummy", "hitpoints": 10, + "attackSpeed": 4, "undead": true }, "720": { "name": "Mummy", "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "721": { "name": "Mummy", "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "722": { "name": "Mummy", "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "723": { "name": "Mummy", "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "724": { "name": "Mummy", "hitpoints": 10, + "attackSpeed": 4, "undead": true }, "725": { "name": "Mummy", "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "726": { "name": "Mummy", "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "727": { "name": "Mummy", "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "728": { "name": "Mummy", "hitpoints": 68, "combatLevel": 103, + "attackSpeed": 4, "undead": true }, "729": { "name": "Scarabs", "hitpoints": 25, "combatLevel": 92, + "attackSpeed": 1, "attackLevel": 255, "strengthLevel": 2, "defenceLevel": 10, @@ -5040,6 +5459,7 @@ "name": "Bandit", "hitpoints": 30, "combatLevel": 56, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 70, "defenceLevel": 30, @@ -5055,6 +5475,7 @@ "name": "Bandit", "hitpoints": 30, "combatLevel": 56, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 70, "defenceLevel": 30, @@ -5070,6 +5491,7 @@ "name": "Bandit", "hitpoints": 30, "combatLevel": 41, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 50, "defenceLevel": 20, @@ -5085,6 +5507,7 @@ "name": "Bandit", "hitpoints": 30, "combatLevel": 41, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 50, "defenceLevel": 20, @@ -5100,6 +5523,7 @@ "name": "Bandit champion", "hitpoints": 50, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 80, "defenceLevel": 50, @@ -5114,6 +5538,7 @@ "hitpoints": 50, "combatLevel": 75, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -5125,6 +5550,7 @@ "name": "Giant Roc", "hitpoints": 250, "combatLevel": 172, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 100, @@ -5136,6 +5562,7 @@ "name": "Shadow", "hitpoints": 15, "combatLevel": 73, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 120, "defenceLevel": 5, @@ -5151,6 +5578,7 @@ "name": "Skraeling", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -5161,6 +5589,7 @@ "name": "Skraeling", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -5171,6 +5600,7 @@ "name": "Me", "hitpoints": 45, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 74, @@ -5181,6 +5611,7 @@ "name": "Me", "hitpoints": 45, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 74, @@ -5192,6 +5623,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -5208,6 +5640,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -5224,6 +5657,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -5240,6 +5674,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -5256,6 +5691,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -5272,6 +5708,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -5288,6 +5725,7 @@ "hitpoints": 106, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -5304,6 +5742,7 @@ "hitpoints": 50, "combatLevel": 93, "slayerLevel": 1, + "attackSpeed": 15, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 90, @@ -5320,6 +5759,7 @@ "hitpoints": 90, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 90, @@ -5334,6 +5774,7 @@ "hitpoints": 90, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 105, "strengthLevel": 90, "defenceLevel": 50, @@ -5352,6 +5793,7 @@ "hitpoints": 130, "combatLevel": 191, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 169, "strengthLevel": 190, "defenceLevel": 169, @@ -5368,6 +5810,7 @@ "hitpoints": 130, "combatLevel": 191, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 169, "strengthLevel": 190, "defenceLevel": 169, @@ -5384,6 +5827,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 15, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 90, @@ -5400,6 +5844,7 @@ "hitpoints": 90, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 90, @@ -5414,6 +5859,7 @@ "hitpoints": 90, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 105, "strengthLevel": 90, "defenceLevel": 50, @@ -5432,6 +5878,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -5448,6 +5895,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -5458,6 +5906,7 @@ "name": "Melzar the Mad", "hitpoints": 44, "combatLevel": 43, + "attackSpeed": 4, "attackLevel": 37, "strengthLevel": 37, "defenceLevel": 34, @@ -5471,6 +5920,7 @@ "hitpoints": 60, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -5482,6 +5932,7 @@ "hitpoints": 60, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -5493,6 +5944,7 @@ "hitpoints": 60, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -5504,6 +5956,7 @@ "hitpoints": 60, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -5515,6 +5968,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5526,6 +5980,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5537,6 +5992,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5548,6 +6004,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5559,6 +6016,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5570,6 +6028,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5581,6 +6040,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5592,6 +6052,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5603,6 +6064,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5614,6 +6076,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5625,6 +6088,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5636,6 +6100,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5647,6 +6112,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5658,6 +6124,7 @@ "hitpoints": 71, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 36, "defenceLevel": 35, @@ -5668,6 +6135,7 @@ "name": "Zombie", "hitpoints": 50, "combatLevel": 39, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -5679,6 +6147,7 @@ "name": "Slash Bash", "hitpoints": 100, "combatLevel": 111, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 60, @@ -5694,6 +6163,7 @@ "name": "Moss giant", "hitpoints": 120, "combatLevel": 84, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -5711,6 +6181,7 @@ "name": "Agrith Naar", "hitpoints": 100, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 83, "strengthLevel": 90, "defenceLevel": 82, @@ -5723,6 +6194,7 @@ "hitpoints": 18, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 4, "undead": true }, "925": { @@ -5730,6 +6202,7 @@ "hitpoints": 140, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 110, "defenceLevel": 70, @@ -5746,6 +6219,7 @@ "hitpoints": 135, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 110, "defenceLevel": 60, @@ -5762,6 +6236,7 @@ "hitpoints": 120, "combatLevel": 91, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 100, "defenceLevel": 50, @@ -5778,6 +6253,7 @@ "hitpoints": 120, "combatLevel": 91, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 100, "defenceLevel": 50, @@ -5794,6 +6270,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5806,6 +6283,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5818,6 +6296,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5830,6 +6309,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5842,6 +6322,7 @@ "hitpoints": 95, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 80, "defenceLevel": 30, @@ -5854,6 +6335,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5868,6 +6350,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5882,6 +6365,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5896,6 +6380,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5910,6 +6395,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5924,6 +6410,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5938,6 +6425,7 @@ "hitpoints": 90, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 75, "defenceLevel": 40, @@ -5951,6 +6439,7 @@ "name": "Ghast", "hitpoints": 22, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 18, @@ -5961,30 +6450,35 @@ "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "950": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "951": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "952": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "953": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "955": { @@ -5992,6 +6486,7 @@ "hitpoints": 40, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -6008,6 +6503,7 @@ "hitpoints": 40, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -6023,6 +6519,7 @@ "name": "Kalphite Soldier", "hitpoints": 90, "combatLevel": 85, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -6038,6 +6535,7 @@ "name": "Kalphite Soldier", "hitpoints": 90, "combatLevel": 85, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -6054,6 +6552,7 @@ "hitpoints": 171, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -6070,6 +6569,7 @@ "hitpoints": 171, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -6086,6 +6586,7 @@ "hitpoints": 40, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -6102,6 +6603,7 @@ "hitpoints": 171, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -6118,6 +6620,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -6134,6 +6637,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -6150,6 +6654,7 @@ "hitpoints": 70, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 50, @@ -6161,6 +6666,7 @@ "hitpoints": 70, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 50, @@ -6172,6 +6678,7 @@ "hitpoints": 70, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 50, @@ -6183,6 +6690,7 @@ "hitpoints": 120, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -6196,6 +6704,7 @@ "hitpoints": 120, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -6209,6 +6718,7 @@ "hitpoints": 120, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -6237,6 +6747,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6252,6 +6763,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6267,6 +6779,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6282,6 +6795,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6297,6 +6811,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6312,6 +6827,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6327,6 +6843,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6342,6 +6859,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6357,6 +6875,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -6372,6 +6891,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6384,6 +6904,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6396,6 +6917,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6408,6 +6930,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6420,6 +6943,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -6433,6 +6957,7 @@ "hitpoints": 75, "combatLevel": 86, "slayerLevel": 57, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 75, @@ -6449,6 +6974,7 @@ "name": "Snake", "hitpoints": 25, "combatLevel": 35, + "attackSpeed": 3, "attackLevel": 25, "strengthLevel": 50, "defenceLevel": 25, @@ -6460,6 +6986,7 @@ "hitpoints": 6, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -6471,6 +6998,7 @@ "hitpoints": 33, "combatLevel": 52, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 57, "strengthLevel": 57, "defenceLevel": 30, @@ -6481,6 +7009,7 @@ "name": "Giant mosquito", "hitpoints": 3, "combatLevel": 13, + "attackSpeed": 12, "attackLevel": 5, "strengthLevel": 1, "defenceLevel": 45, @@ -6496,6 +7025,7 @@ "hitpoints": 45, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 55, @@ -6507,6 +7037,7 @@ "hitpoints": 45, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 55, @@ -6518,6 +7049,7 @@ "hitpoints": 45, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 55, @@ -6529,6 +7061,7 @@ "hitpoints": 45, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 55, @@ -6540,6 +7073,7 @@ "hitpoints": 45, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 55, @@ -6629,6 +7163,7 @@ "name": "Fear reaper", "hitpoints": 25, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 39, "strengthLevel": 41, "defenceLevel": 40, @@ -6639,6 +7174,7 @@ "name": "Confusion beast", "hitpoints": 28, "combatLevel": 43, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 41, "defenceLevel": 40, @@ -6651,6 +7187,7 @@ "name": "Confusion beast", "hitpoints": 28, "combatLevel": 43, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 41, "defenceLevel": 40, @@ -6663,6 +7200,7 @@ "name": "Confusion beast", "hitpoints": 28, "combatLevel": 43, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 41, "defenceLevel": 40, @@ -6675,6 +7213,7 @@ "name": "Confusion beast", "hitpoints": 28, "combatLevel": 43, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 41, "defenceLevel": 40, @@ -6687,6 +7226,7 @@ "name": "Confusion beast", "hitpoints": 28, "combatLevel": 43, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 41, "defenceLevel": 40, @@ -6699,6 +7239,7 @@ "name": "Hopeless creature", "hitpoints": 25, "combatLevel": 40, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 36, "defenceLevel": 39, @@ -6709,6 +7250,7 @@ "name": "Hopeless creature", "hitpoints": 25, "combatLevel": 40, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 36, "defenceLevel": 39, @@ -6719,6 +7261,7 @@ "name": "Hopeless creature", "hitpoints": 25, "combatLevel": 40, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 36, "defenceLevel": 39, @@ -6741,6 +7284,7 @@ "name": "Tolna", "hitpoints": 37, "combatLevel": 46, + "attackSpeed": 5, "attackLevel": 42, "strengthLevel": 41, "defenceLevel": 40, @@ -6766,6 +7310,7 @@ "hitpoints": 85, "combatLevel": 90, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 70, "defenceLevel": 70, @@ -6777,6 +7322,7 @@ "hitpoints": 50, "combatLevel": 62, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 55, "defenceLevel": 50, @@ -6786,6 +7332,7 @@ "name": "Giant Sea Snake", "hitpoints": 100, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 170, "strengthLevel": 90, "defenceLevel": 160, @@ -6796,6 +7343,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 8, @@ -6811,6 +7359,7 @@ "name": "Mourner", "hitpoints": 25, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -6823,6 +7372,7 @@ "1118": { "name": "Man", "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -6833,6 +7383,7 @@ "name": "Woman", "hitpoints": 10, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 2, @@ -6843,6 +7394,7 @@ "name": "Barrelchest (hard)", "hitpoints": 255, "combatLevel": 380, + "attackSpeed": 5, "attackLevel": 306, "strengthLevel": 261, "defenceLevel": 140, @@ -6856,6 +7408,7 @@ "hitpoints": 255, "combatLevel": 316, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 305, "strengthLevel": 342, "defenceLevel": 169, @@ -6871,6 +7424,7 @@ "name": "Dessous (hard)", "hitpoints": 255, "combatLevel": 217, + "attackSpeed": 3, "attackLevel": 198, "strengthLevel": 198, "defenceLevel": 99, @@ -6887,6 +7441,7 @@ "hitpoints": 255, "combatLevel": 273, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 380, "strengthLevel": 160, "defenceLevel": 135, @@ -6902,6 +7457,7 @@ "name": "Woman", "hitpoints": 13, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 1, "defenceLevel": 1, @@ -6915,6 +7471,7 @@ "name": "Woman", "hitpoints": 10, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 2, @@ -6925,6 +7482,7 @@ "name": "Damis (hard)", "hitpoints": 198, "combatLevel": 200, + "attackSpeed": 4, "attackLevel": 198, "strengthLevel": 198, "defenceLevel": 90, @@ -6941,6 +7499,7 @@ "name": "Damis (hard)", "hitpoints": 255, "combatLevel": 272, + "attackSpeed": 4, "attackLevel": 320, "strengthLevel": 200, "defenceLevel": 160, @@ -6957,6 +7516,7 @@ "name": "Mourner", "hitpoints": 13, "combatLevel": 18, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -6972,6 +7532,7 @@ "name": "Woman", "hitpoints": 13, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 1, "defenceLevel": 1, @@ -6985,6 +7546,7 @@ "name": "Woman", "hitpoints": 13, "combatLevel": 12, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -6995,6 +7557,7 @@ "name": "Woman", "hitpoints": 10, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 2, @@ -7005,6 +7568,7 @@ "name": "Woman", "hitpoints": 23, "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -7015,6 +7579,7 @@ "name": "Paladin", "hitpoints": 66, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -7031,6 +7596,7 @@ "name": "Mourner", "hitpoints": 25, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7044,6 +7610,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -7057,6 +7624,7 @@ "name": "Mourner", "hitpoints": 13, "combatLevel": 12, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -7071,6 +7639,7 @@ "hitpoints": 60, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -7087,6 +7656,7 @@ "hitpoints": 85, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 95, "defenceLevel": 80, @@ -7098,6 +7668,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7109,6 +7680,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7119,6 +7691,7 @@ "name": "Alomone", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 4, @@ -7132,6 +7705,7 @@ "name": "Clivet", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 4, @@ -7145,6 +7719,7 @@ "name": "Hazeel Cultist", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 4, @@ -7158,6 +7733,7 @@ "name": "Khazard Guard", "hitpoints": 25, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 18, "defenceLevel": 20, @@ -7173,6 +7749,7 @@ "name": "Khazard Guard", "hitpoints": 25, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 18, "defenceLevel": 20, @@ -7188,6 +7765,7 @@ "name": "Khazard Guard", "hitpoints": 25, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 18, "defenceLevel": 20, @@ -7203,6 +7781,7 @@ "name": "General Khazard", "hitpoints": 170, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 80, @@ -7214,6 +7793,7 @@ "hitpoints": 116, "combatLevel": 137, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -7224,6 +7804,7 @@ "name": "Khazard Ogre", "hitpoints": 60, "combatLevel": 63, + "attackSpeed": 6, "attackLevel": 54, "strengthLevel": 53, "defenceLevel": 53, @@ -7236,6 +7817,7 @@ "name": "Khazard Scorpion", "hitpoints": 40, "combatLevel": 44, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 39, "defenceLevel": 34, @@ -7246,10 +7828,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, @@ -7263,6 +7850,7 @@ "name": "Arzinian Avatar of Strength", "hitpoints": 70, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 65, "defenceLevel": 50, @@ -7272,10 +7860,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, @@ -7291,6 +7884,7 @@ "name": "Arzinian Avatar of Ranging", "hitpoints": 70, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 40, "defenceLevel": 75, @@ -7302,10 +7896,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, @@ -7320,6 +7919,7 @@ "name": "Arzinian Avatar of Magic", "hitpoints": 70, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 50, "defenceLevel": 75, @@ -7334,6 +7934,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7344,6 +7945,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7354,6 +7956,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7364,6 +7967,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7374,6 +7978,7 @@ "name": "Ram", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7385,6 +7990,7 @@ "hitpoints": 10, "combatLevel": 31, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 10, @@ -7396,6 +8002,7 @@ "hitpoints": 10, "combatLevel": 31, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 10, @@ -7406,6 +8013,7 @@ "name": "Experiment", "hitpoints": 40, "combatLevel": 51, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 50, "defenceLevel": 50, @@ -7416,6 +8024,7 @@ "name": "Experiment", "hitpoints": 100, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 30, @@ -7426,6 +8035,7 @@ "name": "Experiment", "hitpoints": 100, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 30, @@ -7437,6 +8047,7 @@ "hitpoints": 38, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 30, "defenceLevel": 26, @@ -7447,6 +8058,7 @@ "hitpoints": 56, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 64, "strengthLevel": 47, "defenceLevel": 42 @@ -7456,6 +8068,7 @@ "hitpoints": 76, "combatLevel": 80, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 88, "strengthLevel": 55, "defenceLevel": 60 @@ -7465,6 +8078,7 @@ "hitpoints": 90, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 102, "strengthLevel": 84, "defenceLevel": 70 @@ -7474,6 +8088,7 @@ "hitpoints": 110, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 120, "strengthLevel": 100, "defenceLevel": 85, @@ -7483,6 +8098,7 @@ "name": "Afflicted", "hitpoints": 30, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 40, @@ -7493,6 +8109,7 @@ "name": "Afflicted", "hitpoints": 28, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 28, "defenceLevel": 38, @@ -7503,6 +8120,7 @@ "name": "Afflicted", "hitpoints": 26, "combatLevel": 32, + "attackSpeed": 4, "attackLevel": 26, "strengthLevel": 26, "defenceLevel": 36, @@ -7513,6 +8131,7 @@ "name": "Afflicted", "hitpoints": 24, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 34, @@ -7524,6 +8143,7 @@ "hitpoints": 6, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7535,6 +8155,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7546,6 +8167,7 @@ "hitpoints": 40, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 35, @@ -7560,6 +8182,7 @@ "hitpoints": 25, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 25, @@ -7574,6 +8197,7 @@ "hitpoints": 25, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 30, "strengthLevel": 60, "defenceLevel": 57, @@ -7587,6 +8211,7 @@ "name": "Slagilith", "hitpoints": 60, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 75, @@ -7603,6 +8228,7 @@ "name": "Slagilith", "hitpoints": 60, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 75, @@ -7619,6 +8245,7 @@ "name": "Fire elemental", "hitpoints": 30, "combatLevel": 35, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 35, "defenceLevel": 20, @@ -7629,6 +8256,7 @@ "name": "Earth elemental", "hitpoints": 35, "combatLevel": 35, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 35, "defenceLevel": 35, @@ -7639,6 +8267,7 @@ "name": "Earth elemental", "hitpoints": 35, "combatLevel": 35, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 35, "defenceLevel": 35, @@ -7649,6 +8278,7 @@ "name": "Air elemental", "hitpoints": 30, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 20, "defenceLevel": 30, @@ -7660,6 +8290,7 @@ "hitpoints": 30, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -7670,6 +8301,7 @@ "name": "The Kendal", "hitpoints": 50, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 60, @@ -7684,6 +8316,7 @@ "name": "The Kendal", "hitpoints": 50, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 60, @@ -7698,6 +8331,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7708,6 +8342,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7718,6 +8353,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7728,6 +8364,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7738,6 +8375,7 @@ "name": "Camp dweller", "hitpoints": 25, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 25, "defenceLevel": 20, @@ -7748,31 +8386,36 @@ "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1402": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1403": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1404": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1405": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 6, @@ -7787,25 +8430,29 @@ "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1407": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1408": { "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "1409": { "name": "Black Guard", "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7824,6 +8471,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7842,6 +8490,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7860,6 +8509,7 @@ "hitpoints": 30, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7877,6 +8527,7 @@ "name": "Foreman", "hitpoints": 20, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7887,6 +8538,7 @@ "name": "Shipyard worker", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -7898,6 +8550,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -7909,6 +8562,7 @@ "name": "Jungle Demon", "hitpoints": 170, "combatLevel": 195, + "attackSpeed": 6, "attackLevel": 170, "strengthLevel": 170, "defenceLevel": 170, @@ -7924,6 +8578,7 @@ "name": "Pirate", "hitpoints": 20, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -7937,6 +8592,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -7947,6 +8603,7 @@ "name": "Mugger", "hitpoints": 8, "combatLevel": 6, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -7963,6 +8620,7 @@ "name": "Kebbit", "hitpoints": 50, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -7974,6 +8632,7 @@ "hitpoints": 124, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 134, "defenceLevel": 110, @@ -7991,6 +8650,7 @@ "hitpoints": 124, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -8008,6 +8668,7 @@ "hitpoints": 124, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -8024,6 +8685,7 @@ "hitpoints": 124, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -8040,6 +8702,7 @@ "hitpoints": 124, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -8057,6 +8720,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 105, "defenceLevel": 107, @@ -8071,6 +8735,7 @@ "name": "Black knight", "hitpoints": 42, "combatLevel": 33, + "attackSpeed": 5, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -8087,6 +8752,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -8104,6 +8770,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -8121,6 +8788,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -8138,6 +8806,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -8155,6 +8824,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -8172,6 +8842,7 @@ "name": "Fire wizard", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 10, @@ -8182,6 +8853,7 @@ "name": "Water wizard", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 10, @@ -8192,6 +8864,7 @@ "name": "Earth wizard", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 10, @@ -8202,6 +8875,7 @@ "name": "Air wizard", "hitpoints": 25, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 10, @@ -8210,33 +8884,40 @@ }, "1603": { "name": "Kolodion", - "hitpoints": 3 + "hitpoints": 3, + "attackSpeed": 7 }, "1604": { "name": "Kolodion", - "hitpoints": 3 + "hitpoints": 3, + "attackSpeed": 7 }, "1605": { "name": "Kolodion", - "hitpoints": 3 + "hitpoints": 3, + "attackSpeed": 7 }, "1606": { "name": "Kolodion", - "hitpoints": 65 + "hitpoints": 65, + "attackSpeed": 7 }, "1607": { "name": "Kolodion", - "hitpoints": 65 + "hitpoints": 65, + "attackSpeed": 7 }, "1608": { "name": "Kolodion", - "hitpoints": 78 + "hitpoints": 78, + "attackSpeed": 7 }, "1609": { "name": "Kolodion", "hitpoints": 107, "combatLevel": 112, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 98, "defenceLevel": 105, @@ -8247,6 +8928,7 @@ "name": "Battle mage", "hitpoints": 120, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8257,6 +8939,7 @@ "name": "Battle mage", "hitpoints": 120, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8267,6 +8950,7 @@ "name": "Battle mage", "hitpoints": 120, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -8276,18 +8960,21 @@ "1667": { "name": "Penance Fighter", "hitpoints": 28, - "combatLevel": 30 + "combatLevel": 30, + "attackSpeed": 4 }, "1668": { "name": "Penance Ranger", "hitpoints": 20, - "combatLevel": 21 + "combatLevel": 21, + "attackSpeed": 4 }, "1672": { "name": "Ahrim the Blighted", "hitpoints": 100, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -8307,6 +8994,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -8325,6 +9013,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -8344,6 +9033,7 @@ "hitpoints": 100, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -8362,6 +9052,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -8380,6 +9071,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -8397,6 +9089,7 @@ "name": "Bloodworm", "hitpoints": 45, "combatLevel": 52, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 20, "defenceLevel": 35, @@ -8408,6 +9101,7 @@ "hitpoints": 35, "combatLevel": 43, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 20, "defenceLevel": 20, @@ -8419,6 +9113,7 @@ "hitpoints": 70, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 65, @@ -8430,6 +9125,7 @@ "hitpoints": 70, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 65, @@ -8441,6 +9137,7 @@ "hitpoints": 70, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 65, @@ -8452,6 +9149,7 @@ "hitpoints": 45, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 47, "defenceLevel": 45, @@ -8468,6 +9166,7 @@ "hitpoints": 80, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 67, "defenceLevel": 65, @@ -8479,6 +9178,7 @@ "hitpoints": 51, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 72, "defenceLevel": 72, @@ -8494,6 +9194,7 @@ "hitpoints": 51, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 72, "defenceLevel": 72, @@ -8509,6 +9210,7 @@ "hitpoints": 51, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 72, "defenceLevel": 72, @@ -8524,6 +9226,7 @@ "hitpoints": 51, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 72, "defenceLevel": 72, @@ -8562,77 +9265,92 @@ "1694": { "name": "Shifter", "hitpoints": 23, - "combatLevel": 38 + "combatLevel": 38, + "attackSpeed": 4 }, "1695": { "name": "Shifter", "hitpoints": 23, - "combatLevel": 38 + "combatLevel": 38, + "attackSpeed": 4 }, "1696": { "name": "Shifter", "hitpoints": 38, - "combatLevel": 57 + "combatLevel": 57, + "attackSpeed": 4 }, "1697": { "name": "Shifter", "hitpoints": 38, - "combatLevel": 57 + "combatLevel": 57, + "attackSpeed": 4 }, "1698": { "name": "Shifter", "hitpoints": 53, - "combatLevel": 76 + "combatLevel": 76, + "attackSpeed": 4 }, "1699": { "name": "Shifter", "hitpoints": 53, - "combatLevel": 76 + "combatLevel": 76, + "attackSpeed": 4 }, "1700": { "name": "Shifter", "hitpoints": 68, - "combatLevel": 90 + "combatLevel": 90, + "attackSpeed": 4 }, "1701": { "name": "Shifter", "hitpoints": 68, - "combatLevel": 90 + "combatLevel": 90, + "attackSpeed": 4 }, "1702": { "name": "Shifter", "hitpoints": 83, - "combatLevel": 104 + "combatLevel": 104, + "attackSpeed": 4 }, "1703": { "name": "Shifter", "hitpoints": 83, - "combatLevel": 104 + "combatLevel": 104, + "attackSpeed": 4 }, "1704": { "name": "Ravager", "hitpoints": 23, - "combatLevel": 36 + "combatLevel": 36, + "attackSpeed": 4 }, "1705": { "name": "Ravager", "hitpoints": 38, - "combatLevel": 53 + "combatLevel": 53, + "attackSpeed": 4 }, "1706": { "name": "Ravager", "hitpoints": 53, - "combatLevel": 71 + "combatLevel": 71, + "attackSpeed": 4 }, "1707": { "name": "Ravager", "hitpoints": 68, - "combatLevel": 89 + "combatLevel": 89, + "attackSpeed": 4 }, "1708": { "name": "Ravager", "hitpoints": 83, - "combatLevel": 106 + "combatLevel": 106, + "attackSpeed": 4 }, "1709": { "name": "Spinner", @@ -8662,132 +9380,158 @@ "1714": { "name": "Torcher", "hitpoints": 18, - "combatLevel": 33 + "combatLevel": 33, + "attackSpeed": 4 }, "1715": { "name": "Torcher", "hitpoints": 18, - "combatLevel": 33 + "combatLevel": 33, + "attackSpeed": 4 }, "1716": { "name": "Torcher", "hitpoints": 30, - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "1717": { "name": "Torcher", "hitpoints": 30, - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "1718": { "name": "Torcher", "hitpoints": 45, - "combatLevel": 66 + "combatLevel": 66, + "attackSpeed": 4 }, "1719": { "name": "Torcher", "hitpoints": 45, - "combatLevel": 66 + "combatLevel": 66, + "attackSpeed": 4 }, "1720": { "name": "Torcher", "hitpoints": 57, - "combatLevel": 79 + "combatLevel": 79, + "attackSpeed": 4 }, "1721": { "name": "Torcher", "hitpoints": 57, - "combatLevel": 79 + "combatLevel": 79, + "attackSpeed": 4 }, "1722": { "name": "Torcher", "hitpoints": 71, - "combatLevel": 91 + "combatLevel": 91, + "attackSpeed": 4 }, "1723": { "name": "Torcher", "hitpoints": 71, - "combatLevel": 92 + "combatLevel": 92, + "attackSpeed": 4 }, "1724": { "name": "Defiler", "hitpoints": 27, - "combatLevel": 33 + "combatLevel": 33, + "attackSpeed": 4 }, "1725": { "name": "Defiler", "hitpoints": 27, - "combatLevel": 33 + "combatLevel": 33, + "attackSpeed": 4 }, "1726": { "name": "Defiler", "hitpoints": 45, - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "1727": { "name": "Defiler", "hitpoints": 45, - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "1728": { "name": "Defiler", "hitpoints": 62, - "combatLevel": 66 + "combatLevel": 66, + "attackSpeed": 4 }, "1729": { "name": "Defiler", "hitpoints": 62, - "combatLevel": 79 + "combatLevel": 79, + "attackSpeed": 4 }, "1730": { "name": "Defiler", "hitpoints": 78, - "combatLevel": 91 + "combatLevel": 91, + "attackSpeed": 4 }, "1731": { "name": "Defiler", "hitpoints": 78, - "combatLevel": 91 + "combatLevel": 91, + "attackSpeed": 4 }, "1732": { "name": "Defiler", "hitpoints": 97, - "combatLevel": 92 + "combatLevel": 92, + "attackSpeed": 4 }, "1733": { "name": "Defiler", "hitpoints": 97, - "combatLevel": 92 + "combatLevel": 92, + "attackSpeed": 4 }, "1734": { "name": "Brawler", "hitpoints": 53, - "combatLevel": 51 + "combatLevel": 51, + "attackSpeed": 4 }, "1735": { "name": "Brawler", "hitpoints": 83, - "combatLevel": 76 + "combatLevel": 76, + "attackSpeed": 4 }, "1736": { "name": "Brawler", "hitpoints": 97, - "combatLevel": 101 + "combatLevel": 101, + "attackSpeed": 4 }, "1737": { "name": "Brawler", "hitpoints": 113, - "combatLevel": 129 + "combatLevel": 129, + "attackSpeed": 4 }, "1738": { "name": "Brawler", "hitpoints": 143, - "combatLevel": 158 + "combatLevel": 158, + "attackSpeed": 4 }, "1777": { "name": "Double agent", "hitpoints": 80, "combatLevel": 65, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 43, "defenceLevel": 24, @@ -8801,6 +9545,7 @@ "name": "Double agent", "hitpoints": 120, "combatLevel": 108, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 80, "defenceLevel": 80, @@ -8817,6 +9562,7 @@ "hitpoints": 25, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 1, "attackLevel": 255, "strengthLevel": 5, "defenceLevel": 30, @@ -8832,6 +9578,7 @@ "name": "Goat", "hitpoints": 21, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -8847,6 +9594,7 @@ "name": "Goat", "hitpoints": 21, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -8862,6 +9610,7 @@ "name": "Billy Goat", "hitpoints": 28, "combatLevel": 33, + "attackSpeed": 4, "attackLevel": 31, "strengthLevel": 29, "defenceLevel": 29, @@ -8877,6 +9626,7 @@ "name": "Goat", "hitpoints": 21, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -8892,6 +9642,7 @@ "name": "Goat", "hitpoints": 21, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -8907,6 +9658,7 @@ "name": "Billy Goat", "hitpoints": 28, "combatLevel": 33, + "attackSpeed": 4, "attackLevel": 31, "strengthLevel": 29, "defenceLevel": 29, @@ -8922,6 +9674,7 @@ "name": "White Knight", "hitpoints": 52, "combatLevel": 36, + "attackSpeed": 7, "attackLevel": 27, "strengthLevel": 29, "defenceLevel": 21, @@ -8938,6 +9691,7 @@ "name": "White Knight", "hitpoints": 52, "combatLevel": 38, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 29, "defenceLevel": 25, @@ -8954,6 +9708,7 @@ "name": "White Knight", "hitpoints": 52, "combatLevel": 39, + "attackSpeed": 7, "attackLevel": 32, "strengthLevel": 29, "defenceLevel": 27, @@ -8970,6 +9725,7 @@ "name": "White Knight", "hitpoints": 55, "combatLevel": 42, + "attackSpeed": 7, "attackLevel": 32, "strengthLevel": 35, "defenceLevel": 27, @@ -8986,6 +9742,7 @@ "name": "Gorak", "hitpoints": 112, "combatLevel": 145, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 131, @@ -8997,6 +9754,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -9008,6 +9766,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -9018,6 +9777,7 @@ "name": "Stag", "hitpoints": 19, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 13, "defenceLevel": 13, @@ -9028,6 +9788,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -9038,6 +9799,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -9047,6 +9809,7 @@ "1861": { "name": "Tree spirit", "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -9056,6 +9819,7 @@ "1862": { "name": "Tree spirit", "combatLevel": 29, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 32, @@ -9066,6 +9830,7 @@ "name": "Tree spirit", "hitpoints": 60, "combatLevel": 49, + "attackSpeed": 4, "attackLevel": 48, "strengthLevel": 48, "defenceLevel": 48, @@ -9076,6 +9841,7 @@ "name": "Tree spirit", "hitpoints": 86, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9086,6 +9852,7 @@ "name": "Tree spirit", "hitpoints": 120, "combatLevel": 120, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -9096,6 +9863,7 @@ "name": "Tree spirit", "hitpoints": 170, "combatLevel": 159, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -9106,6 +9874,7 @@ "name": "Evil Chicken", "hitpoints": 120, "combatLevel": 159, + "attackSpeed": 4, "defenceLevel": 126, "magicLevel": 200 }, @@ -9114,6 +9883,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -9131,6 +9901,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -9148,6 +9919,7 @@ "hitpoints": 60, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 70, @@ -9164,6 +9936,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -9180,6 +9953,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -9196,6 +9970,7 @@ "hitpoints": 80, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -9212,6 +9987,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -9223,6 +9999,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -9235,6 +10012,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -9247,6 +10025,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -9259,6 +10038,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -9271,6 +10051,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -9283,6 +10064,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -9295,6 +10077,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -9307,6 +10090,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -9319,6 +10103,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -9331,6 +10116,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -9343,6 +10129,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -9355,6 +10142,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -9367,6 +10155,7 @@ "hitpoints": 89, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 81, @@ -9379,6 +10168,7 @@ "hitpoints": 500, "combatLevel": 725, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 300, @@ -9395,6 +10185,7 @@ "hitpoints": 500, "combatLevel": 725, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 300, @@ -9411,6 +10202,7 @@ "hitpoints": 500, "combatLevel": 725, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 300, @@ -9426,6 +10218,7 @@ "name": "Snakeling", "hitpoints": 1, "combatLevel": 90, + "attackSpeed": 3, "attackLevel": 140, "strengthLevel": 138, "defenceLevel": 1, @@ -9437,6 +10230,7 @@ "name": "Snakeling", "hitpoints": 1, "combatLevel": 90, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -9449,6 +10243,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -9461,6 +10256,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -9473,6 +10269,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -9485,6 +10282,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -9497,6 +10295,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -9509,6 +10308,7 @@ "hitpoints": 250, "combatLevel": 305, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 270, "strengthLevel": 270, "defenceLevel": 270, @@ -9524,6 +10324,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -9535,6 +10336,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -9546,6 +10348,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -9557,6 +10360,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -9569,6 +10373,7 @@ "hitpoints": 40, "combatLevel": 46, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9580,6 +10385,7 @@ "hitpoints": 4, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 2, "defenceLevel": 2, @@ -9591,6 +10397,7 @@ "hitpoints": 34, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 19, @@ -9602,6 +10409,7 @@ "hitpoints": 34, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 19, @@ -9613,6 +10421,7 @@ "hitpoints": 34, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 19, @@ -9624,6 +10433,7 @@ "hitpoints": 36, "combatLevel": 31, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -9638,6 +10448,7 @@ "hitpoints": 55, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -9652,6 +10463,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9667,6 +10479,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9682,6 +10495,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9697,6 +10511,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9712,6 +10527,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9727,6 +10543,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9742,6 +10559,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9757,6 +10575,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9772,6 +10591,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9787,6 +10607,7 @@ "hitpoints": 111, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -9802,6 +10623,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9817,6 +10639,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9832,6 +10655,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9847,6 +10671,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9862,6 +10687,7 @@ "hitpoints": 70, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -9877,6 +10703,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -9890,6 +10717,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -9903,6 +10731,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -9916,6 +10745,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -9928,6 +10758,7 @@ "name": "Jogre", "hitpoints": 60, "combatLevel": 53, + "attackSpeed": 6, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -9942,6 +10773,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -9955,6 +10787,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -9968,6 +10801,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -9979,6 +10813,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -9992,6 +10827,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -10005,6 +10841,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -10018,6 +10855,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -10031,6 +10869,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -10044,6 +10883,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -10054,12 +10894,14 @@ }, "2115": { "name": "Thing under the bed", - "hitpoints": 25 + "hitpoints": 25, + "attackSpeed": 4 }, "2120": { "name": "Market Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 13, @@ -10078,6 +10920,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -10090,6 +10933,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -10102,6 +10946,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -10114,6 +10959,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -10126,6 +10972,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -10138,6 +10985,7 @@ "hitpoints": 150, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 55, @@ -10149,6 +10997,7 @@ "name": "Giant frog", "hitpoints": 23, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 8, "defenceLevel": 6, @@ -10159,6 +11008,7 @@ "name": "Big frog", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 4, @@ -10169,6 +11019,7 @@ "name": "Frog", "hitpoints": 8, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 4, "defenceLevel": 3, @@ -10180,6 +11031,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -10191,6 +11043,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -10202,6 +11055,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -10213,6 +11067,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -10224,6 +11079,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -10235,6 +11091,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -10246,6 +11103,7 @@ "hitpoints": 100, "combatLevel": 124, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -10257,6 +11115,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10268,6 +11127,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10279,6 +11139,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10290,6 +11151,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10301,6 +11163,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10312,6 +11175,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10323,6 +11187,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -10334,6 +11199,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -10345,6 +11211,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -10356,6 +11223,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -10367,6 +11235,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -10378,6 +11247,7 @@ "hitpoints": 120, "combatLevel": 133, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 100, @@ -10389,6 +11259,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -10400,6 +11271,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -10411,6 +11283,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -10422,6 +11295,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -10433,6 +11307,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -10444,6 +11319,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -10455,6 +11331,7 @@ "hitpoints": 140, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 140, "defenceLevel": 120, @@ -10466,6 +11343,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -10477,6 +11355,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -10488,6 +11367,7 @@ "hitpoints": 20, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 30, @@ -10499,6 +11379,7 @@ "hitpoints": 20, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 30, @@ -10510,6 +11391,7 @@ "hitpoints": 40, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 120, "defenceLevel": 60, @@ -10521,6 +11403,7 @@ "hitpoints": 40, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 120, "defenceLevel": 60, @@ -10532,6 +11415,7 @@ "hitpoints": 255, "combatLevel": 596, "slayerLevel": 1, + "attackSpeed": 2, "attackLevel": 280, "strengthLevel": 196, "defenceLevel": 300, @@ -10552,6 +11436,7 @@ "name": "Starlight", "hitpoints": 160, "combatLevel": 149, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 125, "defenceLevel": 120, @@ -10569,6 +11454,7 @@ "name": "Growler", "hitpoints": 146, "combatLevel": 139, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 101, "defenceLevel": 120, @@ -10586,6 +11472,7 @@ "name": "Bree", "hitpoints": 162, "combatLevel": 146, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 80, "defenceLevel": 130, @@ -10603,6 +11490,7 @@ "name": "Saradomin priest", "hitpoints": 89, "combatLevel": 113, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 46, "defenceLevel": 120, @@ -10621,6 +11509,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 68, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 106, "defenceLevel": 110, @@ -10639,6 +11528,7 @@ "hitpoints": 106, "combatLevel": 122, "slayerLevel": 63, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -10655,6 +11545,7 @@ "hitpoints": 85, "combatLevel": 120, "slayerLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 86, @@ -10670,6 +11561,7 @@ "name": "Knight of Saradomin", "hitpoints": 135, "combatLevel": 103, + "attackSpeed": 6, "attackLevel": 70, "strengthLevel": 85, "defenceLevel": 70, @@ -10686,6 +11578,7 @@ "name": "Knight of Saradomin", "hitpoints": 108, "combatLevel": 101, + "attackSpeed": 6, "attackLevel": 75, "strengthLevel": 90, "defenceLevel": 82, @@ -10703,6 +11596,7 @@ "hitpoints": 255, "combatLevel": 624, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 280, "strengthLevel": 350, "defenceLevel": 250, @@ -10725,6 +11619,7 @@ "hitpoints": 128, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 124, "strengthLevel": 118, "defenceLevel": 125, @@ -10737,6 +11632,7 @@ "hitpoints": 127, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 150, @@ -10749,6 +11645,7 @@ "hitpoints": 146, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 132, @@ -10762,6 +11659,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -10779,6 +11677,7 @@ "hitpoints": 70, "combatLevel": 58, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 46, "strengthLevel": 48, "defenceLevel": 43, @@ -10791,6 +11690,7 @@ "name": "Jogre", "hitpoints": 70, "combatLevel": 58, + "attackSpeed": 6, "attackLevel": 46, "strengthLevel": 48, "defenceLevel": 43, @@ -10805,6 +11705,7 @@ "hitpoints": 110, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 48, @@ -10817,6 +11718,7 @@ "hitpoints": 110, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 48, @@ -10828,6 +11730,7 @@ "name": "Ork", "hitpoints": 110, "combatLevel": 107, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -10845,6 +11748,7 @@ "name": "Ork", "hitpoints": 110, "combatLevel": 107, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -10862,6 +11766,7 @@ "name": "Ork", "hitpoints": 110, "combatLevel": 107, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -10879,6 +11784,7 @@ "name": "Ork", "hitpoints": 110, "combatLevel": 107, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -10897,6 +11803,7 @@ "hitpoints": 52, "combatLevel": 47, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 39, "strengthLevel": 39, "defenceLevel": 35, @@ -10908,6 +11815,7 @@ "hitpoints": 131, "combatLevel": 115, "slayerLevel": 63, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -10924,6 +11832,7 @@ "hitpoints": 131, "combatLevel": 134, "slayerLevel": 68, + "attackSpeed": 5, "attackLevel": 116, "strengthLevel": 120, "defenceLevel": 100, @@ -10942,6 +11851,7 @@ "hitpoints": 106, "combatLevel": 121, "slayerLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 103, @@ -10958,6 +11868,7 @@ "hitpoints": 18, "combatLevel": 17, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 14, "strengthLevel": 16, "defenceLevel": 14, @@ -10969,6 +11880,7 @@ "hitpoints": 3, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 15, "strengthLevel": 6, "defenceLevel": 19, @@ -10980,6 +11892,7 @@ "hitpoints": 15, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 12, "strengthLevel": 6, "defenceLevel": 13, @@ -10991,6 +11904,7 @@ "hitpoints": 16, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 16, "strengthLevel": 6, "defenceLevel": 19, @@ -11002,6 +11916,7 @@ "hitpoints": 13, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 11, "strengthLevel": 6, "defenceLevel": 20, @@ -11013,6 +11928,7 @@ "hitpoints": 85, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 75, @@ -11027,6 +11943,7 @@ "name": "Giant Rock Crab", "hitpoints": 180, "combatLevel": 137, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 80, "defenceLevel": 200, @@ -11041,6 +11958,7 @@ "name": "Bardur", "hitpoints": 99, "combatLevel": 94, + "attackSpeed": 6, "attackLevel": 99, "strengthLevel": 40, "defenceLevel": 99, @@ -11059,6 +11977,7 @@ "hitpoints": 100, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -11070,6 +11989,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 128, @@ -11086,6 +12006,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 255, @@ -11101,6 +12022,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 255, @@ -11116,6 +12038,7 @@ "hitpoints": 26, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 25, "strengthLevel": 18, "defenceLevel": 25, @@ -11134,6 +12057,7 @@ "hitpoints": 26, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 16, "defenceLevel": 22, @@ -11149,6 +12073,7 @@ "hitpoints": 61, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 42, "defenceLevel": 28, @@ -11166,6 +12091,7 @@ "name": "Animated Bronze Armour", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11183,6 +12109,7 @@ "name": "Animated Iron Armour", "hitpoints": 20, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -11200,6 +12127,7 @@ "name": "Animated Steel Armour", "hitpoints": 40, "combatLevel": 46, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -11217,6 +12145,7 @@ "name": "Animated Black Armour", "hitpoints": 60, "combatLevel": 69, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -11234,6 +12163,7 @@ "name": "Animated Mithril Armour", "hitpoints": 80, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -11251,6 +12181,7 @@ "name": "Animated Adamant Armour", "hitpoints": 99, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -11268,6 +12199,7 @@ "name": "Animated Rune Armour", "hitpoints": 120, "combatLevel": 138, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -11286,6 +12218,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -11297,6 +12230,7 @@ "hitpoints": 100, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -11308,6 +12242,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -11319,6 +12254,7 @@ "hitpoints": 100, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -11330,6 +12266,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -11341,6 +12278,7 @@ "hitpoints": 100, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -11352,6 +12290,7 @@ "hitpoints": 40, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 40, "defenceLevel": 40, @@ -11368,6 +12307,7 @@ "hitpoints": 70, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 50, "defenceLevel": 50, @@ -11384,6 +12324,7 @@ "hitpoints": 50, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 60, "defenceLevel": 60, @@ -11400,6 +12341,7 @@ "hitpoints": 50, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 41, "strengthLevel": 51, "defenceLevel": 31, @@ -11411,6 +12353,7 @@ "hitpoints": 22, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 21, "strengthLevel": 21, "defenceLevel": 21, @@ -11428,19 +12371,22 @@ "name": "Scorpion", "hitpoints": 55, "combatLevel": 59, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 6 }, "2480": { "name": "Scorpion", "hitpoints": 37, "combatLevel": 37, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 6 }, "2481": { "name": "Minotaur", "hitpoints": 10, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 12, "strengthLevel": 10, "defenceLevel": 10, @@ -11452,6 +12398,7 @@ "hitpoints": 22, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 25, "defenceLevel": 25, @@ -11463,6 +12410,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -11476,6 +12424,7 @@ "hitpoints": 16, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 12, "strengthLevel": 13, "defenceLevel": 7, @@ -11492,6 +12441,7 @@ "hitpoints": 7, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 3, "defenceLevel": 7, @@ -11505,6 +12455,7 @@ "hitpoints": 22, "combatLevel": 16, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 13, "strengthLevel": 11, "defenceLevel": 14, @@ -11518,6 +12469,7 @@ "hitpoints": 26, "combatLevel": 25, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 23, "defenceLevel": 17, @@ -11534,6 +12486,7 @@ "hitpoints": 22, "combatLevel": 16, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 13, "strengthLevel": 11, "defenceLevel": 14, @@ -11547,6 +12500,7 @@ "hitpoints": 15, "combatLevel": 14, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 15, "defenceLevel": 10, @@ -11558,6 +12512,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -11569,6 +12524,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1 }, "2498": { @@ -11576,6 +12532,7 @@ "hitpoints": 26, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 2, "defenceLevel": 10, @@ -11592,6 +12549,7 @@ "hitpoints": 26, "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 80, "strengthLevel": 2, "defenceLevel": 10, @@ -11608,6 +12566,7 @@ "hitpoints": 26, "combatLevel": 41, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 100, "strengthLevel": 2, "defenceLevel": 10, @@ -11624,6 +12583,7 @@ "hitpoints": 30, "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11643,6 +12603,7 @@ "hitpoints": 30, "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11662,6 +12623,7 @@ "hitpoints": 30, "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11681,6 +12643,7 @@ "hitpoints": 41, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11700,6 +12663,7 @@ "hitpoints": 41, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11719,6 +12683,7 @@ "hitpoints": 41, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11738,6 +12703,7 @@ "hitpoints": 71, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11757,6 +12723,7 @@ "hitpoints": 71, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11776,6 +12743,7 @@ "hitpoints": 71, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -11795,6 +12763,7 @@ "hitpoints": 25, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 23, "defenceLevel": 22, @@ -11806,6 +12775,7 @@ "hitpoints": 25, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 23, "defenceLevel": 22, @@ -11817,6 +12787,7 @@ "hitpoints": 25, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 23, "defenceLevel": 22, @@ -11828,6 +12799,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1 }, "2514": { @@ -11835,6 +12807,7 @@ "hitpoints": 60, "combatLevel": 75, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 60, @@ -11847,6 +12820,7 @@ "hitpoints": 65, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 70, @@ -11859,6 +12833,7 @@ "hitpoints": 70, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 80, @@ -11871,6 +12846,7 @@ "hitpoints": 60, "combatLevel": 75, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 60, @@ -11883,6 +12859,7 @@ "hitpoints": 65, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 70, @@ -11895,6 +12872,7 @@ "hitpoints": 70, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 80, @@ -11907,6 +12885,7 @@ "hitpoints": 70, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 50, "defenceLevel": 60, @@ -11922,6 +12901,7 @@ "hitpoints": 70, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -11937,6 +12917,7 @@ "hitpoints": 70, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -11952,6 +12933,7 @@ "hitpoints": 70, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 40, @@ -11967,6 +12949,7 @@ "hitpoints": 77, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 74, "strengthLevel": 74, "defenceLevel": 74, @@ -11986,6 +12969,7 @@ "hitpoints": 77, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 74, "strengthLevel": 74, "defenceLevel": 74, @@ -12005,6 +12989,7 @@ "hitpoints": 77, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 74, "strengthLevel": 74, "defenceLevel": 74, @@ -12024,6 +13009,7 @@ "hitpoints": 75, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 68, @@ -12040,6 +13026,7 @@ "hitpoints": 75, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 68, @@ -12056,6 +13043,7 @@ "hitpoints": 75, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 68, @@ -12072,6 +13060,7 @@ "hitpoints": 75, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 68, @@ -12088,6 +13077,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 20, @@ -12100,6 +13090,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 20, @@ -12112,6 +13103,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 20, @@ -12124,6 +13116,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 20, @@ -12135,6 +13128,7 @@ "name": "H.A.M. Guard", "hitpoints": 15, "combatLevel": 12, + "attackSpeed": 7, "attackLevel": 8, "strengthLevel": 12, "defenceLevel": 8, @@ -12148,6 +13142,7 @@ "name": "H.A.M. Guard", "hitpoints": 20, "combatLevel": 18, + "attackSpeed": 6, "attackLevel": 14, "strengthLevel": 18, "defenceLevel": 12, @@ -12161,6 +13156,7 @@ "name": "H.A.M. Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -12174,6 +13170,7 @@ "name": "Monk", "hitpoints": 15, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 3, @@ -12184,6 +13181,7 @@ "name": "Abyssal leech", "hitpoints": 10, "combatLevel": 41, + "attackSpeed": 2, "attackLevel": 95, "strengthLevel": 5, "defenceLevel": 25, @@ -12201,6 +13199,7 @@ "name": "Abyssal guardian", "hitpoints": 55, "combatLevel": 59, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 90, "defenceLevel": 30, @@ -12218,6 +13217,7 @@ "name": "Abyssal walker", "hitpoints": 95, "combatLevel": 81, + "attackSpeed": 5, "attackLevel": 5, "strengthLevel": 100, "defenceLevel": 95, @@ -12236,6 +13236,7 @@ "hitpoints": 48, "combatLevel": 60, "slayerLevel": 32, + "attackSpeed": 6, "attackLevel": 58, "strengthLevel": 55, "defenceLevel": 48, @@ -12251,6 +13252,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12263,6 +13265,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12275,6 +13278,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12287,6 +13291,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12299,6 +13304,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12311,6 +13317,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12323,6 +13330,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12335,6 +13343,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12347,6 +13356,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12359,6 +13369,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12371,6 +13382,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12383,6 +13395,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12395,6 +13408,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12407,6 +13421,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12419,6 +13434,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12431,6 +13447,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12443,6 +13460,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12455,6 +13473,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12467,6 +13486,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12479,6 +13499,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -12490,6 +13511,7 @@ "name": "Boris", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12500,6 +13522,7 @@ "name": "Imre", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12510,6 +13533,7 @@ "name": "Yuri", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12520,6 +13544,7 @@ "name": "Joseph", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12530,6 +13555,7 @@ "name": "Nikolai", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12540,6 +13566,7 @@ "name": "Eduard", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12550,6 +13577,7 @@ "name": "Lev", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12560,6 +13588,7 @@ "name": "Georgy", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12570,6 +13599,7 @@ "name": "Svetlana", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12580,6 +13610,7 @@ "name": "Irina", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12590,6 +13621,7 @@ "name": "Alexis", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12600,6 +13632,7 @@ "name": "Milla", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12610,6 +13643,7 @@ "name": "Galina", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12620,6 +13654,7 @@ "name": "Sofiya", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12630,6 +13665,7 @@ "name": "Ksenia", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12640,6 +13676,7 @@ "name": "Yadviga", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12650,6 +13687,7 @@ "name": "Nikita", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12660,6 +13698,7 @@ "name": "Vera", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12670,6 +13709,7 @@ "name": "Zoja", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12680,6 +13720,7 @@ "name": "Liliya", "hitpoints": 60, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -12690,6 +13731,7 @@ "name": "Myre Blamish Snail", "hitpoints": 8, "combatLevel": 9, + "attackSpeed": 4, "defenceLevel": 22, "rangeLevel": 5, "magicLevel": 1, @@ -12705,6 +13747,7 @@ "name": "Blood Blamish Snail", "hitpoints": 13, "combatLevel": 20, + "attackSpeed": 6, "defenceLevel": 45, "rangeLevel": 12, "magicLevel": 1, @@ -12719,6 +13762,7 @@ "name": "Ochre Blamish Snail", "hitpoints": 10, "combatLevel": 10, + "attackSpeed": 6, "defenceLevel": 18, "rangeLevel": 7, "magicLevel": 1, @@ -12734,6 +13778,7 @@ "name": "Bruise Blamish Snail", "hitpoints": 12, "combatLevel": 20, + "attackSpeed": 6, "defenceLevel": 40, "rangeLevel": 15, "magicLevel": 1, @@ -12749,6 +13794,7 @@ "name": "Bark Blamish Snail", "hitpoints": 22, "combatLevel": 15, + "attackSpeed": 6, "defenceLevel": 20, "rangeLevel": 10, "magicLevel": 1, @@ -12764,6 +13810,7 @@ "name": "Myre Blamish Snail", "hitpoints": 13, "combatLevel": 10, + "attackSpeed": 4, "defenceLevel": 12, "rangeLevel": 8, "magicLevel": 1, @@ -12779,6 +13826,7 @@ "name": "Blood Blamish Snail", "hitpoints": 10, "combatLevel": 20, + "attackSpeed": 6, "defenceLevel": 30, "rangeLevel": 21, "magicLevel": 1, @@ -12793,6 +13841,7 @@ "name": "Ochre Blamish Snail", "hitpoints": 20, "combatLevel": 15, + "attackSpeed": 6, "defenceLevel": 25, "rangeLevel": 8, "magicLevel": 1, @@ -12808,6 +13857,7 @@ "name": "Bruise Blamish Snail", "hitpoints": 15, "combatLevel": 20, + "attackSpeed": 6, "defenceLevel": 27, "rangeLevel": 20, "magicLevel": 1, @@ -12824,6 +13874,7 @@ "hitpoints": 7, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 1, @@ -12835,6 +13886,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12846,6 +13898,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12857,6 +13910,7 @@ "hitpoints": 6, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12868,6 +13922,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12879,6 +13934,7 @@ "hitpoints": 6, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12890,6 +13946,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12901,6 +13958,7 @@ "hitpoints": 6, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12912,6 +13970,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12923,6 +13982,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12934,6 +13994,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -12945,6 +14006,7 @@ "hitpoints": 8, "combatLevel": 6, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -12960,6 +14022,7 @@ "hitpoints": 32, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 22, @@ -12975,6 +14038,7 @@ "name": "Unicorn", "hitpoints": 19, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 13, "defenceLevel": 13, @@ -12986,6 +14050,7 @@ "hitpoints": 27, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 15, @@ -12997,6 +14062,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 16, "defenceLevel": 13 @@ -13006,6 +14072,7 @@ "hitpoints": 54, "combatLevel": 51, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 42, "defenceLevel": 42, @@ -13021,6 +14088,7 @@ "name": "Ice warrior", "hitpoints": 59, "combatLevel": 57, + "attackSpeed": 4, "attackLevel": 47, "strengthLevel": 47, "defenceLevel": 47, @@ -13036,6 +14104,7 @@ "name": "Ice warrior", "hitpoints": 59, "combatLevel": 57, + "attackSpeed": 4, "attackLevel": 47, "strengthLevel": 47, "defenceLevel": 47, @@ -13052,6 +14121,7 @@ "hitpoints": 66, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 56, "strengthLevel": 56, "defenceLevel": 46, @@ -13067,6 +14137,7 @@ "hitpoints": 45, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 29, @@ -13082,6 +14153,7 @@ "name": "Snake", "hitpoints": 6, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 4, "strengthLevel": 5, "defenceLevel": 3, @@ -13093,6 +14165,7 @@ "hitpoints": 6, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -13103,6 +14176,7 @@ "name": "Black unicorn", "hitpoints": 29, "combatLevel": 27, + "attackSpeed": 4, "attackLevel": 21, "strengthLevel": 23, "defenceLevel": 23, @@ -13113,6 +14187,7 @@ "name": "Ice warrior", "hitpoints": 59, "combatLevel": 57, + "attackSpeed": 4, "attackLevel": 47, "strengthLevel": 47, "defenceLevel": 47, @@ -13129,6 +14204,7 @@ "hitpoints": 67, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 36, "strengthLevel": 36, "defenceLevel": 33, @@ -13145,6 +14221,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1 }, "2855": { @@ -13152,6 +14229,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1 }, "2856": { @@ -13159,6 +14237,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -13170,6 +14249,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -13181,6 +14261,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -13192,6 +14273,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -13203,6 +14285,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -13214,6 +14297,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -13225,6 +14309,7 @@ "hitpoints": 10, "combatLevel": 6, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 2, @@ -13236,6 +14321,7 @@ "hitpoints": 10, "combatLevel": 6, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 2, @@ -13247,6 +14333,7 @@ "hitpoints": 10, "combatLevel": 6, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 2, @@ -13258,6 +14345,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -13269,6 +14357,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -13280,57 +14369,18 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, "rangeLevel": 1, "magicLevel": 1 }, - "2879": { - "name": "Dommik", - "hitpoints": 20, - "combatLevel": 23, - "attackLevel": 20, - "strengthLevel": 20, - "defenceLevel": 20, - "rangeLevel": 1, - "magicLevel": 1, - "slashDef": 1, - "bonusAttack": 9, - "bonusStrength": 10 - }, - "2880": { - "name": "Zaff", - "hitpoints": 20, - "combatLevel": 23, - "attackLevel": 21, - "strengthLevel": 21, - "defenceLevel": 21, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 3, - "slashDef": 2, - "bonusAttack": 8, - "bonusStrength": 10 - }, - "2881": { - "name": "Baraek", - "hitpoints": 23, - "combatLevel": 26, - "attackLevel": 23, - "strengthLevel": 23, - "defenceLevel": 23, - "rangeLevel": 1, - "magicLevel": 1, - "stabDef": 3, - "slashDef": 2, - "bonusAttack": 8, - "bonusStrength": 10 - }, "2885": { "name": "Monk of Zamorak", "hitpoints": 20, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 22, @@ -13341,6 +14391,7 @@ "name": "Monk of Zamorak", "hitpoints": 10, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, @@ -13351,6 +14402,7 @@ "name": "Fancy dress shop owner", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 42, @@ -13362,6 +14414,7 @@ "hitpoints": 27, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -13377,6 +14430,7 @@ "hitpoints": 130, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 4, "defenceLevel": 128, "rangeLevel": 105, "magicLevel": 105, @@ -13393,6 +14447,7 @@ "hitpoints": 130, "combatLevel": 115, "slayerLevel": 1, + "attackSpeed": 4, "defenceLevel": 128, "rangeLevel": 105, "magicLevel": 105, @@ -13409,6 +14464,7 @@ "hitpoints": 175, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 168, "defenceLevel": 168, @@ -13427,6 +14483,7 @@ "hitpoints": 254, "combatLevel": 304, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 268, "defenceLevel": 268, @@ -13444,6 +14501,7 @@ "name": "Confused barbarian", "hitpoints": 124, "combatLevel": 132, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -13459,6 +14517,7 @@ "name": "Lost barbarian", "hitpoints": 124, "combatLevel": 132, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 114, "defenceLevel": 110, @@ -13469,6 +14528,7 @@ "name": "Nail beast", "hitpoints": 55, "combatLevel": 69, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 6, "defenceLevel": 2, @@ -13479,6 +14539,7 @@ "name": "Nail beast", "hitpoints": 65, "combatLevel": 98, + "attackSpeed": 8, "attackLevel": 215, "strengthLevel": 16, "defenceLevel": 30, @@ -13489,6 +14550,7 @@ "name": "Nail beast", "hitpoints": 75, "combatLevel": 141, + "attackSpeed": 8, "attackLevel": 320, "strengthLevel": 26, "defenceLevel": 40, @@ -13499,6 +14561,7 @@ "name": "Zamorak wizard", "hitpoints": 73, "combatLevel": 65, + "attackSpeed": 4, "attackLevel": 24, "strengthLevel": 24, "defenceLevel": 24, @@ -13510,6 +14573,7 @@ "name": "Saradomin wizard", "hitpoints": 120, "combatLevel": 108, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 80, "defenceLevel": 80, @@ -13523,6 +14587,7 @@ "name": "Big Snake", "hitpoints": 120, "combatLevel": 84, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -13536,6 +14601,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13548,6 +14614,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13560,6 +14627,7 @@ "hitpoints": 32, "combatLevel": 32, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 26, "defenceLevel": 40, @@ -13575,6 +14643,7 @@ "hitpoints": 51, "combatLevel": 59, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 62, "defenceLevel": 38, @@ -13586,6 +14655,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -13603,6 +14673,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -13620,6 +14691,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13631,6 +14703,7 @@ "hitpoints": 55, "combatLevel": 52, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 44, "strengthLevel": 42, "defenceLevel": 44, @@ -13647,6 +14720,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13658,6 +14732,7 @@ "hitpoints": 32, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 24, "defenceLevel": 21, @@ -13669,6 +14744,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13680,6 +14756,7 @@ "hitpoints": 50, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 37, "defenceLevel": 35, @@ -13696,6 +14773,7 @@ "hitpoints": 35, "combatLevel": 34, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 25, "defenceLevel": 30, @@ -13712,6 +14790,7 @@ "hitpoints": 65, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 55, "defenceLevel": 43, @@ -13728,6 +14807,7 @@ "hitpoints": 64, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 52, "defenceLevel": 58, @@ -13744,6 +14824,7 @@ "hitpoints": 17, "combatLevel": 14, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 11, "strengthLevel": 12, "defenceLevel": 11, @@ -13759,6 +14840,7 @@ "hitpoints": 23, "combatLevel": 20, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 16, "strengthLevel": 17, "defenceLevel": 15, @@ -13774,6 +14856,7 @@ "hitpoints": 32, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 23, @@ -13787,6 +14870,7 @@ "hitpoints": 30, "combatLevel": 32, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 29, "defenceLevel": 23, @@ -13802,6 +14886,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13813,6 +14898,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13824,6 +14910,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13835,6 +14922,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13846,6 +14934,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13857,6 +14946,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13868,6 +14958,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13879,6 +14970,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13890,6 +14982,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13901,6 +14994,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13912,6 +15006,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13923,6 +15018,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13934,6 +15030,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13945,6 +15042,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13956,6 +15054,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13967,6 +15066,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13978,6 +15078,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -13989,6 +15090,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14002,6 +15104,7 @@ "hitpoints": 16, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 12, "strengthLevel": 13, "defenceLevel": 7, @@ -14018,6 +15121,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14031,6 +15135,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14044,6 +15149,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -14055,6 +15161,7 @@ "hitpoints": 49, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 33, "strengthLevel": 31, "defenceLevel": 36, @@ -14068,6 +15175,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14079,6 +15187,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14090,6 +15199,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14101,6 +15211,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14111,6 +15222,7 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 14, "defenceLevel": 10, @@ -14126,6 +15238,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14141,6 +15254,7 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 14, "defenceLevel": 10, @@ -14156,6 +15270,7 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 14, "defenceLevel": 10, @@ -14171,6 +15286,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14186,6 +15302,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14201,6 +15318,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14216,6 +15334,7 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 14, "defenceLevel": 10, @@ -14231,6 +15350,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14246,6 +15366,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14261,6 +15382,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14276,6 +15398,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14291,6 +15414,7 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 3, "defenceLevel": 10, @@ -14306,6 +15430,7 @@ "name": "Barbarian", "hitpoints": 24, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 14, "defenceLevel": 10, @@ -14321,6 +15446,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14336,6 +15462,7 @@ "name": "Barbarian", "hitpoints": 18, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 7, "defenceLevel": 3, @@ -14351,6 +15478,7 @@ "name": "Barbarian", "hitpoints": 20, "combatLevel": 9, + "attackSpeed": 4, "attackLevel": 6, "strengthLevel": 7, "defenceLevel": 3, @@ -14368,6 +15496,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14381,6 +15510,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14394,6 +15524,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14407,6 +15538,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 7, "strengthLevel": 2, "defenceLevel": 4, @@ -14419,6 +15551,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14429,6 +15562,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14439,6 +15573,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14449,6 +15584,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14459,6 +15595,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14469,6 +15606,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14479,6 +15617,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14489,6 +15628,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14499,6 +15639,7 @@ "name": "Farmer", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 4, "defenceLevel": 8, @@ -14511,6 +15652,7 @@ "name": "Farmer", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 4, "defenceLevel": 8, @@ -14523,6 +15665,7 @@ "name": "Farmer", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 4, "defenceLevel": 8, @@ -14535,6 +15678,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -14545,6 +15689,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -14555,6 +15700,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -14576,6 +15722,7 @@ "name": "Wizard", "hitpoints": 14, "combatLevel": 9, + "attackSpeed": 3, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 5, @@ -14587,6 +15734,7 @@ "name": "Druid", "hitpoints": 30, "combatLevel": 33, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 28, "defenceLevel": 32, @@ -14597,6 +15745,7 @@ "name": "Warrior woman", "hitpoints": 20, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 22, @@ -14607,6 +15756,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14617,6 +15767,7 @@ "name": "Barbarian", "hitpoints": 14, "combatLevel": 8, + "attackSpeed": 6, "attackLevel": 6, "strengthLevel": 5, "defenceLevel": 5, @@ -14631,6 +15782,7 @@ "name": "Al-Kharid warrior", "hitpoints": 19, "combatLevel": 9, + "attackSpeed": 4, "attackLevel": 7, "strengthLevel": 5, "defenceLevel": 4, @@ -14652,6 +15804,7 @@ "name": "Paladin", "hitpoints": 66, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -14668,6 +15821,7 @@ "name": "Paladin", "hitpoints": 66, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -14684,6 +15838,7 @@ "name": "Hero", "hitpoints": 82, "combatLevel": 69, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 55, "defenceLevel": 54, @@ -14700,6 +15855,7 @@ "name": "Knight of Ardougne", "hitpoints": 52, "combatLevel": 46, + "attackSpeed": 5, "attackLevel": 38, "strengthLevel": 40, "defenceLevel": 31, @@ -14716,6 +15872,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14726,6 +15883,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -14736,6 +15894,7 @@ "name": "Knight of Ardougne", "hitpoints": 52, "combatLevel": 46, + "attackSpeed": 5, "attackLevel": 38, "strengthLevel": 40, "defenceLevel": 31, @@ -14752,6 +15911,7 @@ "name": "Archer", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -14770,6 +15930,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -14781,6 +15942,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -14792,6 +15954,7 @@ "hitpoints": 20, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 30, @@ -14803,6 +15966,7 @@ "hitpoints": 20, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 30, @@ -14814,6 +15978,7 @@ "hitpoints": 10, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 30, "defenceLevel": 15, @@ -14825,6 +15990,7 @@ "hitpoints": 40, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 120, "defenceLevel": 60, @@ -14836,6 +16002,7 @@ "hitpoints": 40, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 120, "defenceLevel": 60, @@ -14847,6 +16014,7 @@ "hitpoints": 80, "combatLevel": 180, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 160, "strengthLevel": 240, "defenceLevel": 120, @@ -14858,6 +16026,7 @@ "hitpoints": 80, "combatLevel": 180, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 160, "strengthLevel": 240, "defenceLevel": 120, @@ -14869,6 +16038,7 @@ "hitpoints": 160, "combatLevel": 360, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 320, "strengthLevel": 480, "defenceLevel": 240, @@ -14881,6 +16051,7 @@ "hitpoints": 160, "combatLevel": 360, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 320, "strengthLevel": 480, "defenceLevel": 240, @@ -14893,6 +16064,7 @@ "hitpoints": 250, "combatLevel": 702, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 640, "strengthLevel": 960, "defenceLevel": 480, @@ -14905,6 +16077,7 @@ "hitpoints": 60, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 100, "defenceLevel": 60, @@ -14918,6 +16091,7 @@ "hitpoints": 255, "combatLevel": 650, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 340, "strengthLevel": 300, "defenceLevel": 270, @@ -14937,6 +16111,7 @@ "hitpoints": 142, "combatLevel": 145, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 124, "strengthLevel": 118, "defenceLevel": 125, @@ -14950,6 +16125,7 @@ "hitpoints": 150, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 83, "strengthLevel": 76, "defenceLevel": 127, @@ -14964,6 +16140,7 @@ "hitpoints": 161, "combatLevel": 151, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 115, "strengthLevel": 60, "defenceLevel": 153, @@ -14977,6 +16154,7 @@ "hitpoints": 116, "combatLevel": 127, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 107, "strengthLevel": 116, "defenceLevel": 106, @@ -14987,6 +16165,7 @@ "name": "Imp", "hitpoints": 10, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 6, @@ -14998,6 +16177,7 @@ "hitpoints": 92, "combatLevel": 93, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 77, "strengthLevel": 76, "defenceLevel": 85, @@ -15009,6 +16189,7 @@ "hitpoints": 92, "combatLevel": 93, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 77, "strengthLevel": 76, "defenceLevel": 85, @@ -15020,6 +16201,7 @@ "hitpoints": 60, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 66, "defenceLevel": 81, @@ -15031,6 +16213,7 @@ "hitpoints": 134, "combatLevel": 81, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 46, "defenceLevel": 30, @@ -15042,6 +16225,7 @@ "hitpoints": 48, "combatLevel": 48, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 36, "defenceLevel": 22, @@ -15057,6 +16241,7 @@ "hitpoints": 20, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 12, "strengthLevel": 16, "defenceLevel": 19, @@ -15067,6 +16252,7 @@ "name": "Gorak", "hitpoints": 128, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 133, "strengthLevel": 126, "defenceLevel": 135, @@ -15078,6 +16264,7 @@ "hitpoints": 100, "combatLevel": 115, "slayerLevel": 68, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -15089,6 +16276,7 @@ "hitpoints": 120, "combatLevel": 118, "slayerLevel": 63, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -15100,6 +16288,7 @@ "hitpoints": 75, "combatLevel": 121, "slayerLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 61, @@ -15111,6 +16300,7 @@ "hitpoints": 255, "combatLevel": 580, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 300, "strengthLevel": 200, "defenceLevel": 260, @@ -15131,6 +16321,7 @@ "hitpoints": 121, "combatLevel": 143, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 50, "defenceLevel": 160, @@ -15144,6 +16335,7 @@ "hitpoints": 132, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 175, @@ -15157,6 +16349,7 @@ "hitpoints": 133, "combatLevel": 159, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 124, "strengthLevel": 118, "defenceLevel": 175, @@ -15169,6 +16362,7 @@ "hitpoints": 98, "combatLevel": 123, "slayerLevel": 68, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 120, @@ -15185,6 +16379,7 @@ "hitpoints": 89, "combatLevel": 127, "slayerLevel": 63, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -15201,6 +16396,7 @@ "hitpoints": 75, "combatLevel": 123, "slayerLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 111, @@ -15217,6 +16413,7 @@ "hitpoints": 70, "combatLevel": 69, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -15228,6 +16425,7 @@ "hitpoints": 83, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -15239,6 +16437,7 @@ "hitpoints": 86, "combatLevel": 84, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -15250,6 +16449,7 @@ "hitpoints": 86, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -15261,6 +16461,7 @@ "hitpoints": 95, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -15272,6 +16473,7 @@ "hitpoints": 98, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -15283,6 +16485,7 @@ "hitpoints": 124, "combatLevel": 137, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 160, @@ -15294,6 +16497,7 @@ "hitpoints": 139, "combatLevel": 148, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 160, @@ -15305,6 +16509,7 @@ "hitpoints": 63, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 55, @@ -15316,6 +16521,7 @@ "hitpoints": 67, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 55, @@ -15327,6 +16533,7 @@ "hitpoints": 77, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 55, @@ -15338,6 +16545,7 @@ "hitpoints": 69, "combatLevel": 89, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 115, @@ -15349,6 +16557,7 @@ "hitpoints": 75, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 115, @@ -15360,6 +16569,7 @@ "hitpoints": 79, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 115, @@ -15371,6 +16581,7 @@ "hitpoints": 115, "combatLevel": 131, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 175, @@ -15382,6 +16593,7 @@ "hitpoints": 35, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 35, "defenceLevel": 25, @@ -15393,6 +16605,7 @@ "hitpoints": 95, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 65, @@ -15410,6 +16623,7 @@ "name": "Leech", "hitpoints": 45, "combatLevel": 52, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 20, "defenceLevel": 35, @@ -15421,6 +16635,7 @@ "hitpoints": 50, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 70, "defenceLevel": 65, @@ -15432,6 +16647,7 @@ "hitpoints": 40, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 60, "defenceLevel": 55, @@ -15442,6 +16658,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15459,6 +16676,7 @@ "name": "Watchman", "hitpoints": 22, "combatLevel": 33, + "attackSpeed": 6, "attackLevel": 31, "strengthLevel": 31, "defenceLevel": 31, @@ -15473,6 +16691,7 @@ "name": "Soldier", "hitpoints": 22, "combatLevel": 28, + "attackSpeed": 5, "attackLevel": 26, "strengthLevel": 25, "defenceLevel": 26, @@ -15489,6 +16708,7 @@ "name": "Shipyard worker", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -15499,6 +16719,7 @@ "name": "Shipyard worker", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -15509,6 +16730,7 @@ "name": "Market Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 13, @@ -15526,6 +16748,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15536,6 +16759,7 @@ "name": "Drunken man", "hitpoints": 7, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 3, "defenceLevel": 1, @@ -15546,6 +16770,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15556,6 +16781,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15566,6 +16792,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15576,6 +16803,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15586,6 +16814,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15596,6 +16825,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15613,6 +16843,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15630,6 +16861,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15647,6 +16879,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15664,6 +16897,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15681,6 +16915,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15698,6 +16933,7 @@ "name": "Gardener", "hitpoints": 7, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 7, @@ -15708,6 +16944,7 @@ "name": "Gardener", "hitpoints": 7, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 1, "defenceLevel": 5, @@ -15718,6 +16955,7 @@ "name": "Cuffs", "hitpoints": 7, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15733,6 +16971,7 @@ "name": "Narf", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15743,6 +16982,7 @@ "name": "Rusty", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15753,6 +16993,7 @@ "name": "Jeff", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15763,6 +17004,7 @@ "name": "Guard", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -15780,6 +17022,7 @@ "name": "Hengel", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15790,6 +17033,7 @@ "name": "Anja", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -15801,6 +17045,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -15812,6 +17057,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -15823,6 +17069,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -15834,6 +17081,7 @@ "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -15845,6 +17093,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -15856,6 +17105,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -15867,6 +17117,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -15877,6 +17128,7 @@ "name": "Earth Warrior Champion", "hitpoints": 108, "combatLevel": 102, + "attackSpeed": 4, "attackLevel": 84, "strengthLevel": 84, "defenceLevel": 84, @@ -15887,6 +17139,7 @@ "name": "Giant Champion", "hitpoints": 70, "combatLevel": 56, + "attackSpeed": 6, "attackLevel": 36, "strengthLevel": 44, "defenceLevel": 52, @@ -15896,12 +17149,14 @@ "3330": { "name": "Ghoul Champion", "hitpoints": 100, - "combatLevel": 85 + "combatLevel": 85, + "attackSpeed": 4 }, "3353": { "name": "Goblin Champion", "hitpoints": 32, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 14, @@ -15912,6 +17167,7 @@ "name": "Hobgoblin Champion", "hitpoints": 58, "combatLevel": 56, + "attackSpeed": 4, "attackLevel": 44, "strengthLevel": 48, "defenceLevel": 48, @@ -15922,6 +17178,7 @@ "name": "Imp Champion", "hitpoints": 40, "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -15932,6 +17189,7 @@ "name": "Jogre Champion", "hitpoints": 120, "combatLevel": 107, + "attackSpeed": 4, "attackLevel": 86, "strengthLevel": 86, "defenceLevel": 86, @@ -15942,6 +17200,7 @@ "name": "Lesser Demon Champion", "hitpoints": 148, "combatLevel": 162, + "attackSpeed": 4, "attackLevel": 136, "strengthLevel": 140, "defenceLevel": 142, @@ -15952,6 +17211,7 @@ "name": "Skeleton Champion", "hitpoints": 58, "combatLevel": 40, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 34, @@ -15962,6 +17222,7 @@ "name": "Zombies Champion", "hitpoints": 60, "combatLevel": 51, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 42, "defenceLevel": 42, @@ -15971,12 +17232,14 @@ "3360": { "name": "Leon d'Cour", "hitpoints": 123, - "combatLevel": 141 + "combatLevel": 141, + "attackSpeed": 4 }, "3361": { "name": "Kourend guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -15993,6 +17256,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -16003,6 +17267,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16013,6 +17278,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16023,6 +17289,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16034,6 +17301,7 @@ "hitpoints": 35, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 36, "defenceLevel": 35, @@ -16045,6 +17313,7 @@ "hitpoints": 35, "combatLevel": 33, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 26, "defenceLevel": 25, @@ -16056,6 +17325,7 @@ "hitpoints": 35, "combatLevel": 36, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 28, @@ -16067,6 +17337,7 @@ "hitpoints": 85, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 75, @@ -16078,6 +17349,7 @@ "hitpoints": 105, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 80, @@ -16094,6 +17366,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -16108,6 +17381,7 @@ "name": "Tyras guard", "hitpoints": 110, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 85, "strengthLevel": 95, "defenceLevel": 100, @@ -16123,6 +17397,7 @@ "name": "Tyras guard", "hitpoints": 110, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 85, "strengthLevel": 95, "defenceLevel": 100, @@ -16138,6 +17413,7 @@ "name": "Lucien", "hitpoints": 17, "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 12, "strengthLevel": 11, "defenceLevel": 10, @@ -16154,6 +17430,7 @@ "name": "Lucien", "hitpoints": 17, "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 12, "strengthLevel": 11, "defenceLevel": 10, @@ -16170,6 +17447,7 @@ "name": "Guardian of Armadyl", "hitpoints": 50, "combatLevel": 45, + "attackSpeed": 5, "attackLevel": 37, "strengthLevel": 37, "defenceLevel": 37, @@ -16186,6 +17464,7 @@ "name": "Guardian of Armadyl", "hitpoints": 40, "combatLevel": 43, + "attackSpeed": 5, "attackLevel": 37, "strengthLevel": 37, "defenceLevel": 37, @@ -16202,6 +17481,7 @@ "name": "Fire Warrior of Lesarkus", "hitpoints": 59, "combatLevel": 84, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 78, @@ -16217,6 +17497,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -16227,6 +17508,7 @@ "name": "Fareed", "hitpoints": 130, "combatLevel": 167, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 120, "defenceLevel": 135, @@ -16242,6 +17524,7 @@ "hitpoints": 130, "combatLevel": 154, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 80, "defenceLevel": 135, @@ -16257,6 +17540,7 @@ "name": "Dessous", "hitpoints": 200, "combatLevel": 139, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -16272,6 +17556,7 @@ "name": "Dessous", "hitpoints": 200, "combatLevel": 139, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -16287,6 +17572,7 @@ "name": "The Inadequacy", "hitpoints": 180, "combatLevel": 343, + "attackSpeed": 4, "attackLevel": 564, "strengthLevel": 170, "defenceLevel": 240, @@ -16297,6 +17583,7 @@ "name": "The Everlasting", "hitpoints": 230, "combatLevel": 223, + "attackSpeed": 6, "attackLevel": 187, "strengthLevel": 231, "defenceLevel": 120, @@ -16307,6 +17594,7 @@ "name": "The Untouchable", "hitpoints": 90, "combatLevel": 274, + "attackSpeed": 6, "attackLevel": 187, "strengthLevel": 255, "defenceLevel": 434, @@ -16316,22 +17604,26 @@ "3476": { "name": "The Illusive", "hitpoints": 140, - "combatLevel": 108 + "combatLevel": 108, + "attackSpeed": 6 }, "3477": { "name": "A Doubt", "hitpoints": 50, - "combatLevel": 78 + "combatLevel": 78, + "attackSpeed": 6 }, "3478": { "name": "The Illusive", "hitpoints": 140, - "combatLevel": 108 + "combatLevel": 108, + "attackSpeed": 6 }, "3481": { "name": "Count Draynor", "hitpoints": 35, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 25, "defenceLevel": 30, @@ -16345,6 +17637,7 @@ "name": "Count Draynor", "hitpoints": 35, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 25, "defenceLevel": 30, @@ -16358,6 +17651,7 @@ "name": "Monk of Zamorak", "hitpoints": 20, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 22, @@ -16368,6 +17662,7 @@ "name": "Monk of Zamorak", "hitpoints": 10, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, @@ -16378,6 +17673,7 @@ "name": "Monk of Zamorak", "hitpoints": 25, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -16388,6 +17684,7 @@ "name": "Bouncer", "hitpoints": 120, "combatLevel": 160, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 145, "defenceLevel": 145, @@ -16398,6 +17695,7 @@ "name": "Bouncer", "hitpoints": 120, "combatLevel": 160, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 145, "defenceLevel": 145, @@ -16408,6 +17706,7 @@ "name": "Renegade Knight", "hitpoints": 48, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 28, "defenceLevel": 28, @@ -16423,6 +17722,7 @@ "name": "Thrantax the Mighty", "hitpoints": 80, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -16433,6 +17733,7 @@ "name": "Sir Mordred", "hitpoints": 38, "combatLevel": 39, + "attackSpeed": 4, "attackLevel": 33, "strengthLevel": 33, "defenceLevel": 33, @@ -16448,6 +17749,7 @@ "name": "Desert snake", "hitpoints": 6, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 4, "strengthLevel": 5, "defenceLevel": 3, @@ -16458,6 +17760,7 @@ "name": "Menaphite Thug", "hitpoints": 60, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 50, "defenceLevel": 20, @@ -16471,6 +17774,7 @@ "name": "Menaphite Thug", "hitpoints": 60, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 50, "defenceLevel": 20, @@ -16484,6 +17788,7 @@ "name": "Tough Guy", "hitpoints": 75, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 50, "defenceLevel": 50, @@ -16498,12 +17803,14 @@ "name": "Skeleton", "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "undead": true }, "3600": { "name": "Frogeel", "hitpoints": 90, "combatLevel": 103, + "attackSpeed": 4, "attackLevel": 91, "strengthLevel": 89, "defenceLevel": 90, @@ -16514,6 +17821,7 @@ "name": "Unicow", "hitpoints": 24, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 26, "defenceLevel": 22, @@ -16524,6 +17832,7 @@ "name": "Spidine", "hitpoints": 35, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 37, "strengthLevel": 40, "defenceLevel": 36, @@ -16534,6 +17843,7 @@ "name": "Swordchick", "hitpoints": 35, "combatLevel": 46, + "attackSpeed": 4, "attackLevel": 41, "strengthLevel": 42, "defenceLevel": 45, @@ -16544,6 +17854,7 @@ "name": "Jubster", "hitpoints": 60, "combatLevel": 87, + "attackSpeed": 4, "attackLevel": 82, "strengthLevel": 78, "defenceLevel": 81, @@ -16554,6 +17865,7 @@ "name": "Newtroost", "hitpoints": 18, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 16, "defenceLevel": 17, @@ -16565,6 +17877,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -16576,6 +17889,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -16587,6 +17901,7 @@ "hitpoints": 12, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -16597,6 +17912,7 @@ "name": "Possessed pickaxe", "hitpoints": 40, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 55, "defenceLevel": 40, @@ -16613,6 +17929,7 @@ "hitpoints": 39, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 37, "defenceLevel": 38, @@ -16630,6 +17947,7 @@ "name": "Treus Dayth", "hitpoints": 100, "combatLevel": 95, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 100, @@ -16644,6 +17962,7 @@ "name": "Gardener", "hitpoints": 7, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 7, @@ -16655,6 +17974,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16666,6 +17986,7 @@ "hitpoints": 3, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16677,6 +17998,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16687,6 +18009,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16697,6 +18020,7 @@ "name": "Rabbit", "hitpoints": 5, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16707,6 +18031,7 @@ "name": "Ragnar", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16717,6 +18042,7 @@ "name": "Einar", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16727,6 +18053,7 @@ "name": "Alrik", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16737,6 +18064,7 @@ "name": "Thorhild", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16747,6 +18075,7 @@ "name": "Halla", "hitpoints": 1, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -16757,6 +18086,7 @@ "name": "Rannveig", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16767,6 +18097,7 @@ "name": "Thora", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16777,6 +18108,7 @@ "name": "Valgerd", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16787,6 +18119,7 @@ "name": "Skraeling", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16797,6 +18130,7 @@ "name": "Broddi", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16807,6 +18141,7 @@ "name": "Skraeling", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16817,6 +18152,7 @@ "name": "Ragnvald", "hitpoints": 1, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -16827,6 +18163,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16837,6 +18174,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16848,6 +18186,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -16859,6 +18198,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -16869,6 +18209,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16879,6 +18220,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16890,6 +18232,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -16901,6 +18244,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -16911,6 +18255,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16921,6 +18266,7 @@ "name": "Vampyre Juvinate", "hitpoints": 85, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -16932,6 +18278,7 @@ "hitpoints": 80, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 30, "defenceLevel": 60, @@ -16943,6 +18290,7 @@ "hitpoints": 80, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 30, "defenceLevel": 60, @@ -16954,6 +18302,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -16965,6 +18314,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -16976,6 +18326,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -16987,6 +18338,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -16998,6 +18350,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17009,6 +18362,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17020,6 +18374,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17031,6 +18386,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17042,6 +18398,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17053,6 +18410,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17064,6 +18422,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17075,6 +18434,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17086,6 +18446,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17097,6 +18458,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17108,6 +18470,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17119,6 +18482,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17130,6 +18494,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17141,6 +18506,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17152,6 +18518,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17163,6 +18530,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17174,6 +18542,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17185,6 +18554,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17196,6 +18566,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17207,6 +18578,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17217,6 +18589,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17229,6 +18602,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17241,6 +18615,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17253,6 +18628,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17265,6 +18641,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17277,6 +18654,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -17290,6 +18668,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17301,6 +18680,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17312,6 +18692,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17323,6 +18704,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17334,6 +18716,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17345,6 +18728,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17356,6 +18740,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17367,6 +18752,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17378,6 +18764,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17389,6 +18776,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17400,6 +18788,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17411,6 +18800,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17422,6 +18812,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -17433,6 +18824,7 @@ "hitpoints": 90, "combatLevel": 110, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 96, "defenceLevel": 85, @@ -17444,6 +18836,7 @@ "hitpoints": 105, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 106, "defenceLevel": 85, @@ -17455,6 +18848,7 @@ "hitpoints": 110, "combatLevel": 125, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 85, @@ -17466,6 +18860,7 @@ "hitpoints": 85, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -17479,6 +18874,7 @@ "hitpoints": 85, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -17491,6 +18887,7 @@ "name": "Jake", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 27, "strengthLevel": 31, "defenceLevel": 25, @@ -17501,6 +18898,7 @@ "name": "Wilson", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 27, "strengthLevel": 31, "defenceLevel": 25, @@ -17511,6 +18909,7 @@ "name": "Palmer", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 27, "strengthLevel": 31, "defenceLevel": 25, @@ -17519,24 +18918,29 @@ }, "3897": { "name": "Koschei the deathless", - "hitpoints": 79 + "hitpoints": 79, + "attackSpeed": 4 }, "3898": { "name": "Koschei the deathless", - "hitpoints": 79 + "hitpoints": 79, + "attackSpeed": 4 }, "3899": { "name": "Koschei the deathless", - "hitpoints": 79 + "hitpoints": 79, + "attackSpeed": 4 }, "3900": { "name": "Koschei the deathless", - "hitpoints": 79 + "hitpoints": 79, + "attackSpeed": 4 }, "3901": { "name": "Fox", "hitpoints": 30, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 20, "defenceLevel": 20, @@ -17555,6 +18959,7 @@ "hitpoints": 20, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 15, "defenceLevel": 10, @@ -17566,6 +18971,7 @@ "hitpoints": 20, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 15, "defenceLevel": 10, @@ -17576,6 +18982,7 @@ "name": "Unicorn Foal", "hitpoints": 15, "combatLevel": 12, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -17586,6 +18993,7 @@ "name": "Black unicorn Foal", "hitpoints": 25, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 18, @@ -17597,6 +19005,7 @@ "hitpoints": 69, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 55, "defenceLevel": 52, @@ -17607,6 +19016,7 @@ "name": "The Draugen", "hitpoints": 60, "combatLevel": 69, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -17625,6 +19035,7 @@ "name": "Freidir", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17636,6 +19047,7 @@ "name": "Borrokar", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17647,6 +19059,7 @@ "name": "Lanzig", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17658,6 +19071,7 @@ "name": "Freygerd", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17669,6 +19083,7 @@ "name": "Lensa", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17680,6 +19095,7 @@ "name": "Jennella", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17691,6 +19107,7 @@ "name": "Market Guard", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 3, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17708,6 +19125,7 @@ "name": "Warrior", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 3, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -17725,6 +19143,7 @@ "name": "Ungadulu", "hitpoints": 65, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 57, "strengthLevel": 65, "defenceLevel": 61, @@ -17736,6 +19155,7 @@ "name": "Ungadulu", "hitpoints": 150, "combatLevel": 169, + "attackSpeed": 4, "attackLevel": 147, "strengthLevel": 147, "defenceLevel": 147, @@ -17746,6 +19166,7 @@ "name": "Jungle savage", "hitpoints": 90, "combatLevel": 90, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 76, "defenceLevel": 76, @@ -17756,6 +19177,7 @@ "name": "Nezikchened", "hitpoints": 150, "combatLevel": 187, + "attackSpeed": 5, "attackLevel": 165, "strengthLevel": 168, "defenceLevel": 167, @@ -17767,6 +19189,7 @@ "name": "Viyeldi", "hitpoints": 80, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 62, "strengthLevel": 66, "defenceLevel": 70, @@ -17777,6 +19200,7 @@ "name": "San Tojalon", "hitpoints": 120, "combatLevel": 106, + "attackSpeed": 4, "attackLevel": 86, "strengthLevel": 84, "defenceLevel": 86, @@ -17791,6 +19215,7 @@ "name": "Irvig Senay", "hitpoints": 125, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 74, "defenceLevel": 81, @@ -17805,6 +19230,7 @@ "name": "Ranalph Devere", "hitpoints": 130, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 66, "strengthLevel": 67, "defenceLevel": 66, @@ -17820,6 +19246,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -17831,6 +19258,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -17842,6 +19270,7 @@ "hitpoints": 5, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 3, "defenceLevel": 2, @@ -17853,6 +19282,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -17871,6 +19301,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -17889,6 +19320,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -17907,6 +19339,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17923,6 +19356,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17939,6 +19373,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17955,6 +19390,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17971,6 +19407,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -17987,6 +19424,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -18006,6 +19444,7 @@ "hitpoints": 30, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 21, "defenceLevel": 16, @@ -18025,6 +19464,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -18036,6 +19476,7 @@ "name": "Witch's experiment", "hitpoints": 21, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 10, "defenceLevel": 19, @@ -18046,6 +19487,7 @@ "name": "Witch's experiment (second form)", "hitpoints": 31, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 20, "defenceLevel": 29, @@ -18056,6 +19498,7 @@ "name": "Witch's experiment (third form)", "hitpoints": 41, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 30, "defenceLevel": 39, @@ -18066,6 +19509,7 @@ "name": "Witch's experiment (fourth form)", "hitpoints": 51, "combatLevel": 53, + "attackSpeed": 4, "attackLevel": 48, "strengthLevel": 40, "defenceLevel": 49, @@ -18076,6 +19520,7 @@ "name": "Shadow", "hitpoints": 15, "combatLevel": 73, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 120, "defenceLevel": 5, @@ -18092,6 +19537,7 @@ "hitpoints": 220, "combatLevel": 182, "slayerLevel": 90, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 160, "defenceLevel": 120, @@ -18108,6 +19554,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -18162,6 +19609,7 @@ "name": "Black Knight Titan", "hitpoints": 142, "combatLevel": 120, + "attackSpeed": 7, "attackLevel": 91, "strengthLevel": 100, "defenceLevel": 91, @@ -18179,6 +19627,7 @@ "name": "Soldier", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -18194,12 +19643,14 @@ "4095": { "name": "Eadburg", "hitpoints": 10, - "combatLevel": 4 + "combatLevel": 4, + "attackSpeed": 4 }, "4096": { "name": "Archer", "hitpoints": 50, "combatLevel": 42, + "attackSpeed": 6, "defenceLevel": 40, "rangeLevel": 40, "magicLevel": 1, @@ -18214,6 +19665,7 @@ "name": "Archer", "hitpoints": 50, "combatLevel": 42, + "attackSpeed": 6, "defenceLevel": 40, "rangeLevel": 40, "magicLevel": 1, @@ -18228,6 +19680,7 @@ "name": "Archer", "hitpoints": 50, "combatLevel": 42, + "attackSpeed": 6, "defenceLevel": 40, "rangeLevel": 40, "magicLevel": 1, @@ -18242,6 +19695,7 @@ "name": "Guard", "hitpoints": 40, "combatLevel": 37, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -18257,6 +19711,7 @@ "name": "Guard", "hitpoints": 40, "combatLevel": 37, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -18272,6 +19727,7 @@ "name": "Breoca", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -18282,6 +19738,7 @@ "name": "Ocga", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -18292,6 +19749,7 @@ "name": "Penda", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 3, "defenceLevel": 3, @@ -18302,6 +19760,7 @@ "name": "Hygd", "hitpoints": 10, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 3, "strengthLevel": 2, "defenceLevel": 3, @@ -18312,6 +19771,7 @@ "name": "White Knight", "hitpoints": 55, "combatLevel": 42, + "attackSpeed": 7, "attackLevel": 32, "strengthLevel": 35, "defenceLevel": 27, @@ -18328,6 +19788,7 @@ "name": "Fareed (hard)", "hitpoints": 255, "combatLevel": 299, + "attackSpeed": 4, "attackLevel": 380, "strengthLevel": 240, "defenceLevel": 135, @@ -18343,6 +19804,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -18359,6 +19821,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -18375,6 +19838,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -18391,6 +19855,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18405,6 +19870,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18419,6 +19885,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18433,6 +19900,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18447,6 +19915,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18461,6 +19930,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18475,6 +19945,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18489,6 +19960,7 @@ "hitpoints": 120, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 50, @@ -18504,6 +19976,7 @@ "name": "Twig", "hitpoints": 90, "combatLevel": 71, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18518,6 +19991,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18531,6 +20005,7 @@ "name": "Twig", "hitpoints": 90, "combatLevel": 71, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18545,6 +20020,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18559,6 +20035,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18571,6 +20048,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18583,6 +20061,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18595,6 +20074,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18607,6 +20087,7 @@ "hitpoints": 95, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 30, "strengthLevel": 95, "defenceLevel": 15, @@ -18619,6 +20100,7 @@ "hitpoints": 90, "combatLevel": 71, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 40, "strengthLevel": 90, "defenceLevel": 25, @@ -18632,6 +20114,7 @@ "name": "King Roald", "hitpoints": 60, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 30, "defenceLevel": 30, @@ -18642,6 +20125,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18652,6 +20136,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18662,6 +20147,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18672,6 +20158,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18682,6 +20169,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18692,6 +20180,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18702,6 +20191,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18712,6 +20202,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18722,6 +20213,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18732,6 +20224,7 @@ "name": "Outlaw", "hitpoints": 20, "combatLevel": 32, + "attackSpeed": 6, "attackLevel": 35, "strengthLevel": 25, "defenceLevel": 30, @@ -18743,6 +20236,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -18754,6 +20248,7 @@ "hitpoints": 27, "combatLevel": 21, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 15, @@ -18764,6 +20259,7 @@ "name": "Locust", "hitpoints": 27, "combatLevel": 18, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 18, "defenceLevel": 1, @@ -18774,6 +20270,7 @@ "name": "Plague frog", "hitpoints": 10, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 10, "defenceLevel": 1, @@ -18785,6 +20282,7 @@ "hitpoints": 25, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 1, "attackLevel": 255, "strengthLevel": 5, "defenceLevel": 30, @@ -18798,12 +20296,14 @@ }, "4195": { "name": "Het", - "combatLevel": 81 + "combatLevel": 81, + "attackSpeed": 4 }, "4196": { "name": "Apmeken", "hitpoints": 70, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 40, "defenceLevel": 60, @@ -18816,12 +20316,14 @@ }, "4197": { "name": "Scabaras", - "combatLevel": 75 + "combatLevel": 75, + "attackSpeed": 4 }, "4198": { "name": "Crondis", "hitpoints": 60, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 35, @@ -18837,6 +20339,7 @@ "name": "Possessed Priest", "hitpoints": 90, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 40, @@ -18850,6 +20353,7 @@ "name": "Monk", "hitpoints": 5, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 3, @@ -18859,6 +20363,7 @@ "4247": { "name": "Thief", "combatLevel": 14, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -18869,6 +20374,7 @@ "name": "Head Thief", "hitpoints": 37, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 24, "strengthLevel": 18, "defenceLevel": 16, @@ -18884,6 +20390,7 @@ "name": "Jail guard", "hitpoints": 32, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 23, "defenceLevel": 21, @@ -18901,6 +20408,7 @@ "name": "Jail guard", "hitpoints": 32, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 23, "defenceLevel": 21, @@ -18918,6 +20426,7 @@ "name": "Jail guard", "hitpoints": 32, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 23, "defenceLevel": 21, @@ -18935,6 +20444,7 @@ "name": "Jail guard", "hitpoints": 32, "combatLevel": 26, + "attackSpeed": 5, "attackLevel": 19, "strengthLevel": 23, "defenceLevel": 21, @@ -18953,6 +20463,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -18969,6 +20480,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -18984,6 +20496,7 @@ "name": "Sea troll", "hitpoints": 100, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -18994,6 +20507,7 @@ "name": "Sea troll", "hitpoints": 80, "combatLevel": 65, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -19004,6 +20518,7 @@ "name": "Sea troll", "hitpoints": 80, "combatLevel": 87, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 75, @@ -19014,6 +20529,7 @@ "name": "Sea troll", "hitpoints": 80, "combatLevel": 101, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 90, @@ -19024,6 +20540,7 @@ "name": "Sea Troll Queen", "hitpoints": 200, "combatLevel": 170, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 70, "defenceLevel": 100, @@ -19041,6 +20558,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 60, @@ -19053,6 +20571,7 @@ "name": "Renegade Knight", "hitpoints": 48, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 28, "defenceLevel": 28, @@ -19068,6 +20587,7 @@ "name": "Sigmund", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 45, "defenceLevel": 24, @@ -19080,6 +20600,7 @@ "name": "Black Knight", "hitpoints": 42, "combatLevel": 33, + "attackSpeed": 5, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -19096,6 +20617,7 @@ "name": "Sir Lucan", "hitpoints": 105, "combatLevel": 120, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 110, "defenceLevel": 99, @@ -19111,6 +20633,7 @@ "name": "Sir Palomedes", "hitpoints": 100, "combatLevel": 118, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 105, "defenceLevel": 100, @@ -19126,6 +20649,7 @@ "name": "Sir Lancelot", "hitpoints": 115, "combatLevel": 127, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -19141,6 +20665,7 @@ "name": "Sir Bedivere", "hitpoints": 90, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 95, "defenceLevel": 99, @@ -19155,6 +20680,7 @@ "name": "Sir Tristram", "hitpoints": 105, "combatLevel": 115, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -19168,6 +20694,7 @@ "name": "Sir Pelleas", "hitpoints": 99, "combatLevel": 112, + "attackSpeed": 5, "attackLevel": 95, "strengthLevel": 99, "defenceLevel": 98, @@ -19182,6 +20709,7 @@ "name": "Sir Gawain", "hitpoints": 110, "combatLevel": 122, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 105, "defenceLevel": 100, @@ -19197,6 +20725,7 @@ "name": "Sir Kay", "hitpoints": 110, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 100, @@ -19212,6 +20741,7 @@ "name": "Sir Lancelot", "hitpoints": 115, "combatLevel": 127, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -19227,6 +20757,7 @@ "name": "Sir Kay", "hitpoints": 110, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 100, @@ -19242,6 +20773,7 @@ "name": "Sir Gawain", "hitpoints": 110, "combatLevel": 122, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 105, "defenceLevel": 100, @@ -19257,6 +20789,7 @@ "name": "Sir Lucan", "hitpoints": 105, "combatLevel": 120, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 110, "defenceLevel": 99, @@ -19272,6 +20805,7 @@ "name": "Sir Palomedes", "hitpoints": 100, "combatLevel": 118, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 105, "defenceLevel": 100, @@ -19287,6 +20821,7 @@ "name": "Sir Tristram", "hitpoints": 105, "combatLevel": 115, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -19300,6 +20835,7 @@ "name": "Sir Pelleas", "hitpoints": 99, "combatLevel": 112, + "attackSpeed": 5, "attackLevel": 95, "strengthLevel": 99, "defenceLevel": 98, @@ -19314,6 +20850,7 @@ "name": "Sir Bedivere", "hitpoints": 90, "combatLevel": 110, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 95, "defenceLevel": 99, @@ -19329,6 +20866,7 @@ "hitpoints": 60, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 71, "defenceLevel": 75, @@ -19345,6 +20883,7 @@ "hitpoints": 60, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 71, "defenceLevel": 75, @@ -19361,6 +20900,7 @@ "hitpoints": 80, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -19377,6 +20917,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -19393,6 +20934,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -19408,6 +20950,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19418,6 +20961,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19428,6 +20972,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19439,6 +20984,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -19455,6 +21001,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19465,6 +21012,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19475,6 +21023,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19485,6 +21034,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19495,6 +21045,7 @@ "name": "Ogre shaman", "hitpoints": 1, "combatLevel": 113, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19505,6 +21056,7 @@ "name": "Tower guard", "hitpoints": 22, "combatLevel": 28, + "attackSpeed": 4, "attackLevel": 26, "strengthLevel": 26, "defenceLevel": 26, @@ -19520,6 +21072,7 @@ "name": "Colonel Radick", "hitpoints": 65, "combatLevel": 38, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -19536,6 +21089,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -19547,6 +21101,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19557,6 +21112,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19567,6 +21123,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19577,6 +21134,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19588,6 +21146,7 @@ "hitpoints": 80, "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 30, "defenceLevel": 60, @@ -19598,6 +21157,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19609,6 +21169,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -19620,6 +21181,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -19631,6 +21193,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -19642,6 +21205,7 @@ "hitpoints": 60, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 30, @@ -19652,6 +21216,7 @@ "name": "Vampyre Juvinate", "hitpoints": 110, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 50, "defenceLevel": 35, @@ -19662,6 +21227,7 @@ "name": "Vampyre Juvinate", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 37, "defenceLevel": 30, @@ -19672,6 +21238,7 @@ "name": "Gadderanks", "hitpoints": 20, "combatLevel": 35, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 70, @@ -19689,6 +21256,7 @@ "name": "Gadderanks", "hitpoints": 20, "combatLevel": 35, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 70, @@ -19706,6 +21274,7 @@ "name": "Gadderanks", "hitpoints": 20, "combatLevel": 35, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 70, @@ -19723,6 +21292,7 @@ "name": "Vampyre Juvinate", "hitpoints": 60, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 37, "defenceLevel": 30, @@ -19733,6 +21303,7 @@ "name": "Vampyre Juvinate", "hitpoints": 65, "combatLevel": 54, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 40, "defenceLevel": 30, @@ -19744,6 +21315,7 @@ "hitpoints": 25, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 53, "strengthLevel": 30, "defenceLevel": 30, @@ -19761,6 +21333,7 @@ "hitpoints": 25, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 53, "strengthLevel": 30, "defenceLevel": 30, @@ -19778,6 +21351,7 @@ "hitpoints": 25, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 53, "strengthLevel": 30, "defenceLevel": 30, @@ -19795,6 +21369,7 @@ "hitpoints": 35, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 43, "defenceLevel": 35, @@ -19812,6 +21387,7 @@ "hitpoints": 35, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 43, "defenceLevel": 35, @@ -19829,6 +21405,7 @@ "hitpoints": 35, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 43, "defenceLevel": 35, @@ -19846,6 +21423,7 @@ "hitpoints": 40, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 72, "strengthLevel": 54, "defenceLevel": 40, @@ -19863,6 +21441,7 @@ "hitpoints": 40, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 72, "strengthLevel": 54, "defenceLevel": 40, @@ -19880,6 +21459,7 @@ "hitpoints": 40, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 72, "strengthLevel": 54, "defenceLevel": 40, @@ -19896,6 +21476,7 @@ "name": "Ulfric", "hitpoints": 60, "combatLevel": 100, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 82, "defenceLevel": 100, @@ -19907,6 +21488,7 @@ "hitpoints": 50, "combatLevel": 70, "slayerLevel": 47, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 79, "defenceLevel": 40, @@ -19918,6 +21500,7 @@ "hitpoints": 32, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 22, @@ -19933,6 +21516,7 @@ "name": "Ulfric", "hitpoints": 60, "combatLevel": 100, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 82, "defenceLevel": 100, @@ -19943,6 +21527,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19956,6 +21541,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19969,6 +21555,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19982,6 +21569,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -19995,6 +21583,7 @@ "name": "Guard", "hitpoints": 30, "combatLevel": 22, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 20, "defenceLevel": 12, @@ -20009,6 +21598,7 @@ "hitpoints": 32, "combatLevel": 39, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 35, "defenceLevel": 35, @@ -20025,6 +21615,7 @@ "hitpoints": 30, "combatLevel": 9, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 1, "defenceLevel": 1, @@ -20036,6 +21627,7 @@ "hitpoints": 30, "combatLevel": 9, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 1, "defenceLevel": 1, @@ -20046,6 +21638,7 @@ "name": "Sir Jerro", "hitpoints": 57, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -20062,6 +21655,7 @@ "name": "Sir Carl", "hitpoints": 57, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -20078,6 +21672,7 @@ "name": "Sir Harry", "hitpoints": 57, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -20094,6 +21689,7 @@ "name": "Kalrag", "hitpoints": 78, "combatLevel": 89, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 78, @@ -20109,6 +21705,7 @@ "name": "Othainian", "hitpoints": 87, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 77, @@ -20119,6 +21716,7 @@ "name": "Doomion", "hitpoints": 87, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 77, @@ -20129,6 +21727,7 @@ "name": "Holthion", "hitpoints": 87, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 77, @@ -20139,6 +21738,7 @@ "name": "Disciple of Iban", "hitpoints": 20, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, @@ -20150,6 +21750,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -20160,6 +21761,7 @@ "name": "Rowdy slave", "hitpoints": 16, "combatLevel": 10, + "attackSpeed": 4, "attackLevel": 7, "strengthLevel": 7, "defenceLevel": 7 @@ -20168,6 +21770,7 @@ "name": "Mercenary Captain", "hitpoints": 80, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 29, "defenceLevel": 32, @@ -20182,6 +21785,7 @@ "name": "Shantay Guard", "hitpoints": 32, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 16, @@ -20197,6 +21801,7 @@ "name": "Shantay Guard", "hitpoints": 32, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 16, @@ -20213,6 +21818,7 @@ "hitpoints": 34, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 21, "defenceLevel": 22 @@ -20222,6 +21828,7 @@ "hitpoints": 34, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 21, "defenceLevel": 22 @@ -20231,6 +21838,7 @@ "hitpoints": 34, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 21, "defenceLevel": 22 @@ -20239,6 +21847,7 @@ "name": "Ugthanki", "hitpoints": 45, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 35, "defenceLevel": 35 @@ -20247,6 +21856,7 @@ "name": "Bedabin Nomad Fighter", "hitpoints": 50, "combatLevel": 56, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 50, "defenceLevel": 60, @@ -20257,6 +21867,7 @@ "name": "Mercenary", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20271,6 +21882,7 @@ "name": "Mercenary", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20285,6 +21897,7 @@ "name": "Mercenary", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20299,6 +21912,7 @@ "name": "Mercenary", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20313,6 +21927,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20327,6 +21942,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20341,6 +21957,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20355,6 +21972,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20369,6 +21987,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20383,6 +22002,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20397,6 +22017,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20411,6 +22032,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20425,6 +22047,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20439,6 +22062,7 @@ "name": "Guard", "hitpoints": 60, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 39, @@ -20452,12 +22076,14 @@ "4682": { "name": "Sir Leye", "hitpoints": 20, - "combatLevel": 20 + "combatLevel": 20, + "attackSpeed": 5 }, "4688": { "name": "Angry unicorn", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20468,6 +22094,7 @@ "name": "Angry giant rat", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20478,6 +22105,7 @@ "name": "Angry giant rat", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20488,6 +22116,7 @@ "name": "Angry goblin", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20498,6 +22127,7 @@ "name": "Angry bear", "hitpoints": 50, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 41, "defenceLevel": 38, @@ -20508,6 +22138,7 @@ "name": "Fear reaper", "hitpoints": 57, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 48, "defenceLevel": 45, @@ -20518,6 +22149,7 @@ "name": "Confusion beast", "hitpoints": 64, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 52, "strengthLevel": 55, "defenceLevel": 52, @@ -20528,6 +22160,7 @@ "name": "Hopeless creature", "hitpoints": 71, "combatLevel": 71, + "attackSpeed": 4, "attackLevel": 59, "strengthLevel": 62, "defenceLevel": 59, @@ -20538,6 +22171,7 @@ "name": "The Shaikahan", "hitpoints": 100, "combatLevel": 83, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 25, @@ -20550,6 +22184,7 @@ "name": "The Shaikahan", "hitpoints": 100, "combatLevel": 83, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 25, @@ -20562,6 +22197,7 @@ "name": "Black golem", "hitpoints": 80, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 80, @@ -20577,6 +22213,7 @@ "name": "White golem", "hitpoints": 80, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 80, @@ -20592,6 +22229,7 @@ "name": "Grey golem", "hitpoints": 80, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 80, @@ -20607,6 +22245,7 @@ "name": "Poltenip", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -20623,6 +22262,7 @@ "name": "Radat", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -20639,6 +22279,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20655,6 +22296,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20671,6 +22313,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20687,6 +22330,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20703,6 +22347,7 @@ "name": "Fortress Guard", "hitpoints": 22, "combatLevel": 20, + "attackSpeed": 6, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 15, @@ -20719,6 +22364,7 @@ "name": "Slug Prince", "hitpoints": 70, "combatLevel": 62, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -20734,6 +22380,7 @@ "name": "Slug Prince", "hitpoints": 70, "combatLevel": 62, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -20749,19 +22396,22 @@ "name": "Giant lobster", "hitpoints": 50, "combatLevel": 45, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "4800": { "name": "Giant lobster", "hitpoints": 50, "combatLevel": 45, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "4805": { "name": "Hobgoblin", "hitpoints": 29, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 24, "defenceLevel": 24, @@ -20773,6 +22423,7 @@ "hitpoints": 15, "combatLevel": 13, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 12, @@ -20783,6 +22434,7 @@ "name": "Crab", "hitpoints": 19, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 20, "defenceLevel": 26, @@ -20793,6 +22445,7 @@ "name": "Mudskipper", "hitpoints": 20, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 29, "strengthLevel": 29, "defenceLevel": 26, @@ -20803,6 +22456,7 @@ "name": "Mudskipper", "hitpoints": 20, "combatLevel": 31, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 29, @@ -20813,6 +22467,7 @@ "name": "Crab", "hitpoints": 18, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 22, @@ -20823,6 +22478,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20845,6 +22501,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20855,6 +22512,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20865,6 +22523,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20875,6 +22534,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20885,6 +22545,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20895,6 +22556,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20905,6 +22567,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20915,6 +22578,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -20925,6 +22589,7 @@ "name": "Agrith-Na-Na", "hitpoints": 200, "combatLevel": 146, + "attackSpeed": 4, "attackLevel": 83, "strengthLevel": 150, "defenceLevel": 82, @@ -20941,6 +22606,7 @@ "name": "Flambeed", "hitpoints": 210, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 75, @@ -20957,6 +22623,7 @@ "name": "Karamel", "hitpoints": 250, "combatLevel": 136, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -20977,6 +22644,7 @@ "name": "Dessourt", "hitpoints": 130, "combatLevel": 121, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -20992,6 +22660,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -21007,6 +22676,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -21022,6 +22692,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -21037,6 +22708,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -21052,6 +22724,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -21067,6 +22740,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -21082,6 +22756,7 @@ "name": "Grip", "hitpoints": 25, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 17, "defenceLevel": 18, @@ -21097,6 +22772,7 @@ "name": "Ice Queen", "hitpoints": 105, "combatLevel": 111, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 94, "defenceLevel": 95, @@ -21112,6 +22788,7 @@ "name": "Pirate Guard", "hitpoints": 25, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 16, "defenceLevel": 10, @@ -21128,6 +22805,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21136,21 +22814,25 @@ }, "4930": { "name": "Solus Dellagar", - "hitpoints": 40 + "hitpoints": 40, + "attackSpeed": 3 }, "4933": { "name": "Solus Dellagar", - "hitpoints": 40 + "hitpoints": 40, + "attackSpeed": 3 }, "4934": { "name": "Black Knight", "hitpoints": 42, - "combatLevel": 32 + "combatLevel": 32, + "attackSpeed": 5 }, "4958": { "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21160,21 +22842,25 @@ "4959": { "name": "Black Knight", "hitpoints": 42, - "combatLevel": 32 + "combatLevel": 32, + "attackSpeed": 5 }, "4960": { "name": "Black Knight", "hitpoints": 42, - "combatLevel": 32 + "combatLevel": 32, + "attackSpeed": 5 }, "4962": { "name": "Solus Dellagar", - "hitpoints": 40 + "hitpoints": 40, + "attackSpeed": 3 }, "4969": { "name": "Khazard trooper", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 13, @@ -21190,6 +22876,7 @@ "name": "Khazard trooper", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 13, @@ -21205,6 +22892,7 @@ "name": "Khazard commander", "hitpoints": 22, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 45, "defenceLevel": 50, @@ -21215,6 +22903,7 @@ "name": "Gnome troop", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21233,6 +22922,7 @@ "name": "Gnome troop", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21251,6 +22941,7 @@ "name": "Chronozon", "hitpoints": 60, "combatLevel": 170, + "attackSpeed": 4, "attackLevel": 173, "strengthLevel": 172, "defenceLevel": 173, @@ -21262,6 +22953,7 @@ "name": "Imp", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21272,6 +22964,7 @@ "name": "Suit of armour", "hitpoints": 29, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 16, "strengthLevel": 14, "defenceLevel": 9, @@ -21289,6 +22982,7 @@ "hitpoints": 55, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 110, "defenceLevel": 100, @@ -21305,6 +22999,7 @@ "name": "Dark wizard", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -21316,6 +23011,7 @@ "name": "Dark wizard", "hitpoints": 12, "combatLevel": 7, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -21327,6 +23023,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 20, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -21338,6 +23035,7 @@ "name": "Dark wizard", "hitpoints": 24, "combatLevel": 20, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 2, "defenceLevel": 5, @@ -21349,6 +23047,7 @@ "name": "Experiment No.2", "hitpoints": 95, "combatLevel": 109, + "attackSpeed": 4, "attackLevel": 104, "strengthLevel": 92, "defenceLevel": 90, @@ -21364,6 +23063,7 @@ "name": "Glod", "hitpoints": 160, "combatLevel": 138, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 120, "defenceLevel": 110, @@ -21379,6 +23079,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21392,6 +23093,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21405,6 +23107,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21418,6 +23121,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21431,6 +23135,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21444,6 +23149,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21457,6 +23163,7 @@ "name": "H.A.M. Archer", "hitpoints": 35, "combatLevel": 30, + "attackSpeed": 10, "defenceLevel": 30, "rangeLevel": 30, "stabDef": 5, @@ -21467,6 +23174,7 @@ "name": "H.A.M. Mage", "hitpoints": 35, "combatLevel": 30, + "attackSpeed": 6, "defenceLevel": 30, "rangeLevel": 1, "magicLevel": 30, @@ -21480,6 +23188,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21498,6 +23207,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21516,6 +23226,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21534,6 +23245,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21552,6 +23264,7 @@ "hitpoints": 16, "combatLevel": 10, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 6, "defenceLevel": 9, @@ -21570,6 +23283,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21581,6 +23295,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21592,6 +23307,7 @@ "hitpoints": 52, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -21609,6 +23325,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21620,6 +23337,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21631,6 +23349,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21642,6 +23361,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21653,6 +23373,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21664,6 +23385,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21675,6 +23397,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21686,6 +23409,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21697,6 +23421,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21708,6 +23433,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21719,6 +23445,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21730,6 +23457,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21741,6 +23469,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21752,6 +23481,7 @@ "hitpoints": 5, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21762,6 +23492,7 @@ "name": "Weaponsmaster", "hitpoints": 20, "combatLevel": 23, + "attackSpeed": 5, "attackLevel": 21, "strengthLevel": 21, "defenceLevel": 21, @@ -21778,6 +23509,7 @@ "name": "Jonny the beard", "hitpoints": 8, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21788,6 +23520,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -21798,6 +23531,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -21808,6 +23542,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -21818,6 +23553,7 @@ "name": "Thief", "hitpoints": 17, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -21828,6 +23564,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -21842,6 +23579,7 @@ "hitpoints": 110, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 90, "defenceLevel": 110, @@ -21855,6 +23593,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21870,6 +23609,7 @@ "hitpoints": 2, "combatLevel": 1, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -21885,6 +23625,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -21896,6 +23637,7 @@ "hitpoints": 5, "combatLevel": 5, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -21906,13 +23648,15 @@ "name": "Scorpion", "hitpoints": 15, "combatLevel": 38, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 6 }, "5243": { "name": "Jungle spider", "hitpoints": 35, "combatLevel": 37, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 30, "defenceLevel": 10, @@ -21925,6 +23669,7 @@ "name": "Snake", "hitpoints": 36, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 25, "defenceLevel": 10, @@ -21937,6 +23682,7 @@ "name": "Padulah", "hitpoints": 130, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -21949,6 +23695,7 @@ "hitpoints": 130, "combatLevel": 149, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -21960,6 +23707,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -21971,6 +23719,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -21982,6 +23731,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -21993,6 +23743,7 @@ "hitpoints": 130, "combatLevel": 167, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 200, @@ -22005,6 +23756,7 @@ "hitpoints": 130, "combatLevel": 167, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 200, @@ -22017,6 +23769,7 @@ "hitpoints": 60, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 60, "defenceLevel": 60, @@ -22030,6 +23783,7 @@ "hitpoints": 90, "combatLevel": 129, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 110, "defenceLevel": 90, @@ -22043,6 +23797,7 @@ "hitpoints": 60, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 60, "defenceLevel": 60, @@ -22055,6 +23810,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 8, @@ -22070,6 +23826,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 8, @@ -22085,6 +23842,7 @@ "name": "Mourner", "hitpoints": 19, "combatLevel": 11, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 8, @@ -22101,6 +23859,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -22116,6 +23875,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -22131,6 +23891,7 @@ "hitpoints": 105, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 80, @@ -22147,6 +23908,7 @@ "hitpoints": 105, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 80, @@ -22163,6 +23925,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -22178,6 +23941,7 @@ "hitpoints": 105, "combatLevel": 108, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 80, @@ -22192,6 +23956,7 @@ "name": "Sigmund", "hitpoints": 70, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 44, @@ -22206,6 +23971,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22217,6 +23983,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22228,6 +23995,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22239,6 +24007,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22250,6 +24019,7 @@ "hitpoints": 26, "combatLevel": 26, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 16, "defenceLevel": 22, @@ -22264,6 +24034,7 @@ "hitpoints": 26, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 22, "strengthLevel": 16, "defenceLevel": 22, @@ -22278,6 +24049,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22289,6 +24061,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22300,6 +24073,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22311,6 +24085,7 @@ "hitpoints": 10, "combatLevel": 11, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 12, "defenceLevel": 7, @@ -22322,6 +24097,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22332,6 +24108,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22342,6 +24119,7 @@ "hitpoints": 47, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 55, @@ -22359,6 +24137,7 @@ "hitpoints": 47, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 55, "strengthLevel": 55, "defenceLevel": 55, @@ -22376,6 +24155,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22386,6 +24166,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22396,6 +24177,7 @@ "hitpoints": 47, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 63, "defenceLevel": 63, @@ -22406,6 +24188,7 @@ "hitpoints": 59, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -22418,6 +24201,7 @@ "hitpoints": 59, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -22430,6 +24214,7 @@ "hitpoints": 59, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -22441,6 +24226,7 @@ "name": "Nazastarool", "hitpoints": 70, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 80 @@ -22449,6 +24235,7 @@ "name": "Nazastarool", "hitpoints": 70, "combatLevel": 68, + "attackSpeed": 4, "attackLevel": 58, "strengthLevel": 54, "defenceLevel": 58, @@ -22464,6 +24251,7 @@ "name": "Nazastarool", "hitpoints": 80, "combatLevel": 93, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 80, @@ -22479,6 +24267,7 @@ "name": "Goblin guard", "hitpoints": 43, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 37, "defenceLevel": 37, @@ -22495,6 +24284,7 @@ "hitpoints": 20, "combatLevel": 24, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 23, "defenceLevel": 20, @@ -22507,6 +24297,7 @@ "hitpoints": 7, "combatLevel": 12, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 11, "strengthLevel": 12, "defenceLevel": 14, @@ -22519,12 +24310,14 @@ "name": "Poison spider", "hitpoints": 64, "combatLevel": 31, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 6 }, "5512": { "name": "Gardener", "hitpoints": 7, "combatLevel": 4, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 7, @@ -22535,6 +24328,7 @@ "name": "Whirlpool", "combatLevel": 127, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -22548,6 +24342,7 @@ "hitpoints": 120, "combatLevel": 112, "slayerLevel": 87, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -22561,6 +24356,7 @@ "name": "Angry barbarian spirit", "hitpoints": 190, "combatLevel": 166, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 100, @@ -22576,6 +24372,7 @@ "name": "Enraged barbarian spirit", "hitpoints": 190, "combatLevel": 166, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 100, @@ -22591,6 +24388,7 @@ "name": "Berserk barbarian spirit", "hitpoints": 190, "combatLevel": 166, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 100, @@ -22606,6 +24404,7 @@ "name": "Ferocious barbarian spirit", "hitpoints": 190, "combatLevel": 166, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 100, @@ -22621,6 +24420,7 @@ "name": "Swamp snake", "hitpoints": 120, "combatLevel": 80, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 70, @@ -22631,6 +24431,7 @@ "name": "Swamp snake", "hitpoints": 125, "combatLevel": 109, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 110, "defenceLevel": 80, @@ -22641,6 +24442,7 @@ "name": "Swamp snake", "hitpoints": 130, "combatLevel": 139, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 170, "defenceLevel": 90, @@ -22651,6 +24453,7 @@ "name": "Ghast", "hitpoints": 115, "combatLevel": 79, + "attackSpeed": 8, "attackLevel": 80, "strengthLevel": 30, "defenceLevel": 60, @@ -22662,6 +24465,7 @@ "name": "Ghast", "hitpoints": 135, "combatLevel": 109, + "attackSpeed": 8, "attackLevel": 110, "strengthLevel": 70, "defenceLevel": 70, @@ -22673,6 +24477,7 @@ "name": "Ghast", "hitpoints": 160, "combatLevel": 139, + "attackSpeed": 8, "attackLevel": 135, "strengthLevel": 110, "defenceLevel": 80, @@ -22684,6 +24489,7 @@ "name": "Giant snail", "hitpoints": 125, "combatLevel": 80, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 60, @@ -22694,6 +24500,7 @@ "name": "Giant snail", "hitpoints": 150, "combatLevel": 109, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 75, @@ -22704,6 +24511,7 @@ "name": "Giant snail", "hitpoints": 160, "combatLevel": 139, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 86, @@ -22715,6 +24523,7 @@ "hitpoints": 115, "combatLevel": 140, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 136, "defenceLevel": 100, @@ -22726,6 +24535,7 @@ "name": "Vampyre Juvinate", "hitpoints": 50, "combatLevel": 59, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 16, "defenceLevel": 45, @@ -22736,6 +24546,7 @@ "name": "Vampyre Juvinate", "hitpoints": 100, "combatLevel": 90, + "attackSpeed": 4, "attackLevel": 113, "strengthLevel": 46, "defenceLevel": 55, @@ -22746,6 +24557,7 @@ "name": "Vampyre Juvinate", "hitpoints": 150, "combatLevel": 119, + "attackSpeed": 4, "attackLevel": 127, "strengthLevel": 76, "defenceLevel": 65, @@ -22756,6 +24568,7 @@ "name": "Vampyre Juvinate", "hitpoints": 50, "combatLevel": 59, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 16, "defenceLevel": 45, @@ -22766,6 +24579,7 @@ "name": "Vampyre Juvinate", "hitpoints": 100, "combatLevel": 90, + "attackSpeed": 4, "attackLevel": 113, "strengthLevel": 46, "defenceLevel": 55, @@ -22776,6 +24590,7 @@ "name": "Vampyre Juvinate", "hitpoints": 150, "combatLevel": 119, + "attackSpeed": 4, "attackLevel": 127, "strengthLevel": 76, "defenceLevel": 65, @@ -22787,6 +24602,7 @@ "hitpoints": 75, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 46, "defenceLevel": 30 @@ -22796,6 +24612,7 @@ "hitpoints": 135, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 76, "defenceLevel": 30 @@ -22805,6 +24622,7 @@ "hitpoints": 185, "combatLevel": 130, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 116, "defenceLevel": 30 @@ -22813,6 +24631,7 @@ "name": "Tentacle", "hitpoints": 75, "combatLevel": 99, + "attackSpeed": 6, "attackLevel": 115, "strengthLevel": 76, "defenceLevel": 75, @@ -22823,6 +24642,7 @@ "name": "Head", "hitpoints": 150, "combatLevel": 140, + "attackSpeed": 10, "attackLevel": 73, "strengthLevel": 186, "defenceLevel": 75, @@ -22833,6 +24653,7 @@ "name": "Head", "hitpoints": 150, "combatLevel": 140, + "attackSpeed": 10, "attackLevel": 73, "strengthLevel": 186, "defenceLevel": 75, @@ -22843,6 +24664,7 @@ "name": "Tentacle", "hitpoints": 75, "combatLevel": 99, + "attackSpeed": 6, "attackLevel": 115, "strengthLevel": 76, "defenceLevel": 75, @@ -22865,6 +24687,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22873,6 +24696,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22881,6 +24705,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22889,6 +24714,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22897,6 +24723,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22905,6 +24732,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22913,6 +24741,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22921,6 +24750,7 @@ "name": "Undead Lumberjack", "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22929,6 +24759,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22937,6 +24768,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22945,6 +24777,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22953,6 +24786,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22961,6 +24795,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22969,6 +24804,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22977,6 +24813,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22985,6 +24822,7 @@ "name": "Undead Lumberjack", "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -22994,6 +24832,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -23006,6 +24845,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -23018,6 +24858,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -23030,6 +24871,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -23042,6 +24884,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -23054,6 +24897,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -23066,6 +24910,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -23078,6 +24923,7 @@ "hitpoints": 12, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 101, "strengthLevel": 6, "defenceLevel": 12, @@ -23090,6 +24936,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -23102,6 +24949,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -23114,6 +24962,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -23126,6 +24975,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -23138,6 +24988,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -23150,6 +25001,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -23162,6 +25014,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -23174,6 +25027,7 @@ "hitpoints": 13, "combatLevel": 45, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 16, "defenceLevel": 13, @@ -23186,6 +25040,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23198,6 +25053,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23210,6 +25066,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23222,6 +25079,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23234,6 +25092,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23246,6 +25105,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23258,6 +25118,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23270,6 +25131,7 @@ "hitpoints": 14, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 117, "strengthLevel": 16, "defenceLevel": 14, @@ -23281,6 +25143,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23289,6 +25152,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23297,6 +25161,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23305,6 +25170,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23313,6 +25179,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23321,6 +25188,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23329,6 +25197,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23337,6 +25206,7 @@ "name": "Undead Lumberjack", "combatLevel": 55, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23346,6 +25216,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23358,6 +25229,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23370,6 +25242,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23382,6 +25255,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23394,6 +25268,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23406,6 +25281,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23418,6 +25294,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23430,6 +25307,7 @@ "hitpoints": 16, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 137, "strengthLevel": 26, "defenceLevel": 16, @@ -23441,6 +25319,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23449,6 +25328,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23457,6 +25337,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23465,6 +25346,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23473,6 +25355,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23481,6 +25364,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23489,6 +25373,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23497,6 +25382,7 @@ "name": "Undead Lumberjack", "combatLevel": 64, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23505,6 +25391,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23513,6 +25400,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23521,6 +25409,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23529,6 +25418,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23537,6 +25427,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23545,6 +25436,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23553,6 +25445,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23561,6 +25454,7 @@ "name": "Undead Lumberjack", "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magicLevel": 1, "undead": true @@ -23568,97 +25462,116 @@ "5739": { "name": "Penance Fighter", "hitpoints": 28, - "combatLevel": 30 + "combatLevel": 30, + "attackSpeed": 4 }, "5740": { "name": "Penance Fighter", "hitpoints": 29, - "combatLevel": 32 + "combatLevel": 32, + "attackSpeed": 4 }, "5741": { "name": "Penance Fighter", "hitpoints": 32, - "combatLevel": 37 + "combatLevel": 37, + "attackSpeed": 4 }, "5742": { "name": "Penance Fighter", "hitpoints": 37, - "combatLevel": 42 + "combatLevel": 42, + "attackSpeed": 4 }, "5743": { "name": "Penance Fighter", "hitpoints": 38, - "combatLevel": 47 + "combatLevel": 47, + "attackSpeed": 4 }, "5744": { "name": "Penance Fighter", "hitpoints": 49, - "combatLevel": 56 + "combatLevel": 56, + "attackSpeed": 4 }, "5745": { "name": "Penance Fighter", "hitpoints": 50, - "combatLevel": 61 + "combatLevel": 61, + "attackSpeed": 4 }, "5746": { "name": "Penance Fighter", "hitpoints": 55, - "combatLevel": 68 + "combatLevel": 68, + "attackSpeed": 4 }, "5747": { "name": "Penance Fighter", "hitpoints": 56, - "combatLevel": 77 + "combatLevel": 77, + "attackSpeed": 4 }, "5757": { "name": "Penance Ranger", "hitpoints": 20, - "combatLevel": 21 + "combatLevel": 21, + "attackSpeed": 4 }, "5758": { "name": "Penance Ranger", "hitpoints": 29, - "combatLevel": 25 + "combatLevel": 25, + "attackSpeed": 4 }, "5759": { "name": "Penance Ranger", "hitpoints": 32, - "combatLevel": 32 + "combatLevel": 32, + "attackSpeed": 4 }, "5760": { "name": "Penance Ranger", "hitpoints": 34, - "combatLevel": 38 + "combatLevel": 38, + "attackSpeed": 4 }, "5761": { "name": "Penance Ranger", "hitpoints": 41, - "combatLevel": 43 + "combatLevel": 43, + "attackSpeed": 4 }, "5762": { "name": "Penance Ranger", "hitpoints": 50, - "combatLevel": 51 + "combatLevel": 51, + "attackSpeed": 4 }, "5763": { "name": "Penance Ranger", "hitpoints": 50, - "combatLevel": 57 + "combatLevel": 57, + "attackSpeed": 4 }, "5764": { "name": "Penance Ranger", "hitpoints": 55, - "combatLevel": 64 + "combatLevel": 64, + "attackSpeed": 4 }, "5765": { "name": "Penance Ranger", "hitpoints": 58, - "combatLevel": 72 + "combatLevel": 72, + "attackSpeed": 4 }, "5775": { "name": "Penance Queen", "hitpoints": 250, "combatLevel": 209, + "attackSpeed": 4, "attackLevel": 260, "strengthLevel": 92, "defenceLevel": 132, @@ -23669,6 +25582,7 @@ "name": "Queen spawn", "hitpoints": 45, "combatLevel": 63, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 62, "defenceLevel": 50, @@ -23681,6 +25595,7 @@ "hitpoints": 200, "combatLevel": 230, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -23696,6 +25611,7 @@ "name": "Yak", "hitpoints": 50, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 20, "strengthLevel": 10, "defenceLevel": 1, @@ -23708,6 +25624,7 @@ "hitpoints": 150, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 80, @@ -23726,6 +25643,7 @@ "hitpoints": 60, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 70, @@ -23742,6 +25660,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -23758,6 +25677,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -23774,6 +25694,7 @@ "hitpoints": 60, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 70, "defenceLevel": 70, @@ -23790,6 +25711,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -23806,6 +25728,7 @@ "hitpoints": 80, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 40, @@ -23822,6 +25745,7 @@ "hitpoints": 80, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -23838,6 +25762,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -23848,6 +25773,7 @@ "name": "Tanglefoot", "hitpoints": 102, "combatLevel": 111, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 97, "defenceLevel": 91, @@ -23858,6 +25784,7 @@ "name": "Baby tanglefoot", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 38, "defenceLevel": 40, @@ -23868,6 +25795,7 @@ "name": "Baby tanglefoot", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 38, "defenceLevel": 40, @@ -23879,6 +25807,7 @@ "hitpoints": 600, "combatLevel": 318, "slayerLevel": 91, + "attackSpeed": 6, "attackLevel": 220, "strengthLevel": 220, "defenceLevel": 100, @@ -23901,6 +25830,7 @@ "hitpoints": 600, "combatLevel": 318, "slayerLevel": 91, + "attackSpeed": 6, "attackLevel": 220, "strengthLevel": 220, "defenceLevel": 100, @@ -23923,6 +25853,7 @@ "hitpoints": 600, "combatLevel": 318, "slayerLevel": 91, + "attackSpeed": 6, "attackLevel": 220, "strengthLevel": 220, "defenceLevel": 100, @@ -23945,6 +25876,7 @@ "hitpoints": 52, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -23962,6 +25894,7 @@ "hitpoints": 52, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -23979,6 +25912,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -23991,6 +25925,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -24003,6 +25938,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -24015,6 +25951,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -24027,6 +25964,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -24044,6 +25982,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -24061,6 +26000,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -24078,6 +26018,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -24095,6 +26036,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -24112,6 +26054,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -24130,6 +26073,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -24148,6 +26092,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -24166,6 +26111,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -24184,6 +26130,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -24202,6 +26149,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -24220,6 +26168,7 @@ "hitpoints": 400, "combatLevel": 350, "slayerLevel": 85, + "attackSpeed": 7, "attackLevel": 180, "strengthLevel": 136, "defenceLevel": 250, @@ -24237,6 +26186,7 @@ "name": "Spawn", "hitpoints": 15, "combatLevel": 60, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 30, "defenceLevel": 30, @@ -24249,6 +26199,7 @@ "name": "Spawn", "hitpoints": 15, "combatLevel": 60, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 30, "defenceLevel": 30, @@ -24261,6 +26212,7 @@ "name": "Scion", "hitpoints": 50, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 80, @@ -24276,6 +26228,7 @@ "name": "Sand Crab", "hitpoints": 60, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24286,6 +26239,7 @@ "name": "Sandy rocks", "hitpoints": 60, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24296,6 +26250,7 @@ "name": "Wallasalki", "hitpoints": 120, "combatLevel": 98, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -24310,6 +26265,7 @@ "name": "Wallasalki", "hitpoints": 120, "combatLevel": 98, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -24324,6 +26280,7 @@ "name": "Giant Rock Crab", "hitpoints": 180, "combatLevel": 137, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 80, "defenceLevel": 200, @@ -24339,6 +26296,7 @@ "hitpoints": 85, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 75, @@ -24354,6 +26312,7 @@ "hitpoints": 95, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 78, "defenceLevel": 65, @@ -24371,6 +26330,7 @@ "name": "Rock lobster", "hitpoints": 150, "combatLevel": 127, + "attackSpeed": 2, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -24385,6 +26345,7 @@ "5947": { "name": "Spinolyp", "hitpoints": 100, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24399,6 +26360,7 @@ "5961": { "name": "Spinolyp", "hitpoints": 100, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24413,6 +26375,7 @@ "5963": { "name": "Spinolyp", "hitpoints": 100, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24428,6 +26391,7 @@ "name": "Khazard trooper", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 13, @@ -24443,6 +26407,7 @@ "name": "Khazard trooper", "hitpoints": 22, "combatLevel": 19, + "attackSpeed": 5, "attackLevel": 17, "strengthLevel": 16, "defenceLevel": 13, @@ -24458,6 +26423,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 3, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24469,6 +26435,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24480,6 +26447,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 3, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24492,6 +26460,7 @@ "hitpoints": 55, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -24506,6 +26475,7 @@ "hitpoints": 55, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -24520,6 +26490,7 @@ "hitpoints": 55, "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 25, @@ -24533,6 +26504,7 @@ "name": "Justiciar Zachariah", "hitpoints": 320, "combatLevel": 348, + "attackSpeed": 6, "attackLevel": 500, "strengthLevel": 250, "defenceLevel": 100, @@ -24553,6 +26525,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -24570,6 +26543,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -24587,6 +26561,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -24604,6 +26579,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -24621,6 +26597,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -24638,6 +26615,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -24655,6 +26633,7 @@ "hitpoints": 50, "combatLevel": 66, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -24671,6 +26650,7 @@ "name": "Guard", "hitpoints": 50, "combatLevel": 37, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -24689,6 +26669,7 @@ "name": "Tower Archer", "hitpoints": 30, "combatLevel": 19, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24702,6 +26683,7 @@ "name": "Tower Archer", "hitpoints": 50, "combatLevel": 34, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24715,6 +26697,7 @@ "name": "Tower Archer", "hitpoints": 70, "combatLevel": 49, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24728,6 +26711,7 @@ "name": "Tower Archer", "hitpoints": 90, "combatLevel": 64, + "attackSpeed": 6, "attackLevel": 10, "strengthLevel": 10, "defenceLevel": 10, @@ -24741,6 +26725,7 @@ "name": "Tortoise", "hitpoints": 100, "combatLevel": 79, + "attackSpeed": 6, "attackLevel": 15, "strengthLevel": 90, "defenceLevel": 80, @@ -24751,6 +26736,7 @@ "name": "Tortoise", "hitpoints": 120, "combatLevel": 92, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 100, "defenceLevel": 80, @@ -24761,6 +26747,7 @@ "name": "Gnome child", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24771,6 +26758,7 @@ "name": "Gnome child", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24781,6 +26769,7 @@ "name": "Gnome child", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24791,6 +26780,7 @@ "name": "Gnome guard", "hitpoints": 31, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -24803,6 +26793,7 @@ "name": "Gnome guard", "hitpoints": 31, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -24815,6 +26806,7 @@ "name": "Gnome woman", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24825,6 +26817,7 @@ "name": "Gnome woman", "hitpoints": 2, "combatLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24835,6 +26828,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24846,6 +26840,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24857,6 +26852,7 @@ "name": "Gnome", "hitpoints": 3, "combatLevel": 1, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24868,6 +26864,7 @@ "name": "Gnome Archer", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -24878,6 +26875,7 @@ "name": "Gnome Driver", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 6, "attackLevel": 3, "strengthLevel": 5, "defenceLevel": 3, @@ -24888,6 +26886,7 @@ "name": "Gnome Mage", "hitpoints": 10, "combatLevel": 5, + "attackSpeed": 6, "attackLevel": 3, "strengthLevel": 1, "defenceLevel": 1, @@ -24898,6 +26897,7 @@ "name": "Bush snake", "hitpoints": 25, "combatLevel": 35, + "attackSpeed": 3, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 50, @@ -24908,6 +26908,7 @@ "name": "Bush snake", "hitpoints": 25, "combatLevel": 35, + "attackSpeed": 3, "attackLevel": 25, "strengthLevel": 25, "defenceLevel": 50, @@ -24919,6 +26920,7 @@ "hitpoints": 240, "combatLevel": 214, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 210, "strengthLevel": 210, "defenceLevel": 70, @@ -24934,6 +26936,7 @@ "name": "The Inadequacy (hard)", "hitpoints": 255, "combatLevel": 600, + "attackSpeed": 4, "attackLevel": 1128, "strengthLevel": 340, "defenceLevel": 240, @@ -24944,6 +26947,7 @@ "name": "The Everlasting (hard)", "hitpoints": 255, "combatLevel": 365, + "attackSpeed": 6, "attackLevel": 374, "strengthLevel": 462, "defenceLevel": 120, @@ -24954,6 +26958,7 @@ "name": "The Untouchable (hard)", "hitpoints": 180, "combatLevel": 440, + "attackSpeed": 6, "attackLevel": 374, "strengthLevel": 510, "defenceLevel": 434, @@ -24964,6 +26969,7 @@ "name": "Scion", "hitpoints": 50, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 80, @@ -24980,6 +26986,7 @@ "hitpoints": 50, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 37, "defenceLevel": 35, @@ -24996,6 +27003,7 @@ "hitpoints": 50, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 37, "defenceLevel": 35, @@ -25011,6 +27019,7 @@ "name": "Large mosquito", "hitpoints": 3, "combatLevel": 13, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 1, "defenceLevel": 45, @@ -25025,6 +27034,7 @@ "name": "Mosquito swarm", "hitpoints": 9, "combatLevel": 17, + "attackSpeed": 3, "attackLevel": 10, "strengthLevel": 1, "defenceLevel": 45, @@ -25039,6 +27049,7 @@ "name": "Tanglefoot (hard)", "hitpoints": 204, "combatLevel": 199, + "attackSpeed": 4, "attackLevel": 194, "strengthLevel": 194, "defenceLevel": 91, @@ -25049,6 +27060,7 @@ "name": "Chronozon (hard)", "hitpoints": 120, "combatLevel": 297, + "attackSpeed": 4, "attackLevel": 346, "strengthLevel": 344, "defenceLevel": 173, @@ -25060,6 +27072,7 @@ "name": "Bouncer (hard)", "hitpoints": 232, "combatLevel": 244, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 240, "defenceLevel": 120, @@ -25071,6 +27084,7 @@ "hitpoints": 255, "combatLevel": 213, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 80, @@ -25089,6 +27103,7 @@ "hitpoints": 157, "combatLevel": 292, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 290, "strengthLevel": 296, "defenceLevel": 152, @@ -25100,6 +27115,7 @@ "name": "Glod (hard)", "hitpoints": 255, "combatLevel": 276, + "attackSpeed": 4, "attackLevel": 230, "strengthLevel": 240, "defenceLevel": 110, @@ -25115,6 +27131,7 @@ "name": "Treus Dayth (hard)", "hitpoints": 240, "combatLevel": 194, + "attackSpeed": 4, "attackLevel": 168, "strengthLevel": 168, "defenceLevel": 100, @@ -25129,6 +27146,7 @@ "name": "Black Knight Titan (hard)", "hitpoints": 255, "combatLevel": 210, + "attackSpeed": 7, "attackLevel": 182, "strengthLevel": 200, "defenceLevel": 91, @@ -25146,6 +27164,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25161,6 +27180,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25176,6 +27196,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25191,6 +27212,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25206,6 +27228,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25221,6 +27244,7 @@ "name": "Dagannoth mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25236,6 +27260,7 @@ "name": "Culinaromancer (hard)", "hitpoints": 255, "combatLevel": 209, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 400, "defenceLevel": 10, @@ -25246,6 +27271,7 @@ "name": "Agrith-Na-Na (hard)", "hitpoints": 255, "combatLevel": 235, + "attackSpeed": 4, "attackLevel": 166, "strengthLevel": 300, "defenceLevel": 82, @@ -25262,6 +27288,7 @@ "name": "Flambeed (hard)", "hitpoints": 255, "combatLevel": 238, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 240, "defenceLevel": 75, @@ -25278,6 +27305,7 @@ "name": "Karamel (hard)", "hitpoints": 255, "combatLevel": 186, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -25298,6 +27326,7 @@ "name": "Dessourt (hard)", "hitpoints": 255, "combatLevel": 217, + "attackSpeed": 3, "attackLevel": 198, "strengthLevel": 198, "defenceLevel": 198, @@ -25313,6 +27342,7 @@ "name": "Gelatinnoth Mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25328,6 +27358,7 @@ "name": "Gelatinnoth Mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25343,6 +27374,7 @@ "name": "Gelatinnoth Mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25358,6 +27390,7 @@ "name": "Gelatinnoth Mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25373,6 +27406,7 @@ "name": "Gelatinnoth Mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25388,6 +27422,7 @@ "name": "Gelatinnoth Mother (hard)", "hitpoints": 240, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 186, "strengthLevel": 186, "defenceLevel": 81, @@ -25403,6 +27438,7 @@ "name": "Nezikchened (hard)", "hitpoints": 150, "combatLevel": 295, + "attackSpeed": 5, "attackLevel": 330, "strengthLevel": 336, "defenceLevel": 167, @@ -25415,6 +27451,7 @@ "hitpoints": 187, "combatLevel": 199, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 209, "defenceLevel": 80, @@ -25425,6 +27462,7 @@ "name": "Me (hard)", "hitpoints": 135, "combatLevel": 201, + "attackSpeed": 4, "attackLevel": 225, "strengthLevel": 234, "defenceLevel": 74, @@ -25435,6 +27473,7 @@ "name": "Jungle Demon (hard)", "hitpoints": 255, "combatLevel": 327, + "attackSpeed": 6, "attackLevel": 340, "strengthLevel": 340, "defenceLevel": 170, @@ -25450,6 +27489,7 @@ "name": "The Kendal (hard)", "hitpoints": 150, "combatLevel": 210, + "attackSpeed": 4, "attackLevel": 195, "strengthLevel": 195, "defenceLevel": 60, @@ -25464,6 +27504,7 @@ "name": "Giant Roc (hard)", "hitpoints": 255, "combatLevel": 257, + "attackSpeed": 6, "attackLevel": 260, "strengthLevel": 260, "defenceLevel": 100, @@ -25475,6 +27516,7 @@ "name": "Slagilith (hard)", "hitpoints": 150, "combatLevel": 202, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 300, "defenceLevel": 75, @@ -25491,6 +27533,7 @@ "name": "Moss giant (hard)", "hitpoints": 240, "combatLevel": 182, + "attackSpeed": 6, "attackLevel": 165, "strengthLevel": 165, "defenceLevel": 60, @@ -25508,6 +27551,7 @@ "name": "Skeleton Hellhound (hard)", "hitpoints": 132, "combatLevel": 198, + "attackSpeed": 4, "attackLevel": 168, "strengthLevel": 264, "defenceLevel": 100, @@ -25518,6 +27562,7 @@ "name": "Agrith Naar (hard)", "hitpoints": 209, "combatLevel": 196, + "attackSpeed": 4, "attackLevel": 182, "strengthLevel": 198, "defenceLevel": 82, @@ -25529,6 +27574,7 @@ "name": "King Roald (hard)", "hitpoints": 150, "combatLevel": 188, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 120, "defenceLevel": 30, @@ -25539,6 +27585,7 @@ "name": "Khazard warlord (hard)", "hitpoints": 255, "combatLevel": 192, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 170, "defenceLevel": 80, @@ -25550,6 +27597,7 @@ "hitpoints": 240, "combatLevel": 201, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 132, "strengthLevel": 264, "defenceLevel": 50, @@ -25566,6 +27614,7 @@ "hitpoints": 255, "combatLevel": 210, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 280, "defenceLevel": 40, @@ -25582,6 +27631,7 @@ "name": "Count Draynor (hard)", "hitpoints": 210, "combatLevel": 177, + "attackSpeed": 4, "attackLevel": 198, "strengthLevel": 165, "defenceLevel": 30, @@ -25595,6 +27645,7 @@ "name": "Witch's experiment (hard)", "hitpoints": 63, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 54, "strengthLevel": 30, "defenceLevel": 19, @@ -25605,6 +27656,7 @@ "name": "Witch's experiment (second form) (hard)", "hitpoints": 93, "combatLevel": 77, + "attackSpeed": 4, "attackLevel": 84, "strengthLevel": 60, "defenceLevel": 29, @@ -25615,6 +27667,7 @@ "name": "Witch's experiment (third form) (hard)", "hitpoints": 103, "combatLevel": 90, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 75, "defenceLevel": 39, @@ -25625,6 +27678,7 @@ "name": "Witch's experiment (fourth form) (hard)", "hitpoints": 113, "combatLevel": 103, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 88, "defenceLevel": 49, @@ -25635,6 +27689,7 @@ "name": "Nazastarool (hard)", "hitpoints": 154, "combatLevel": 176, + "attackSpeed": 4, "attackLevel": 187, "strengthLevel": 176, "defenceLevel": 80, @@ -25650,6 +27705,7 @@ "name": "Nazastarool (hard)", "hitpoints": 180, "combatLevel": 153, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 140, "defenceLevel": 58, @@ -25665,6 +27721,7 @@ "name": "Nazastarool (hard)", "hitpoints": 176, "combatLevel": 181, + "attackSpeed": 4, "attackLevel": 187, "strengthLevel": 176, "defenceLevel": 80, @@ -25680,12 +27737,14 @@ "name": "Cow (hard)", "hitpoints": 8, "combatLevel": 170, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "6342": { "name": "Barrelchest", "hitpoints": 134, "combatLevel": 190, + "attackSpeed": 5, "attackLevel": 170, "strengthLevel": 145, "defenceLevel": 140, @@ -25699,6 +27758,7 @@ "hitpoints": 130, "combatLevel": 191, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 169, "strengthLevel": 190, "defenceLevel": 169, @@ -25714,6 +27774,7 @@ "name": "Dessous", "hitpoints": 200, "combatLevel": 139, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -25730,6 +27791,7 @@ "hitpoints": 130, "combatLevel": 154, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 80, "defenceLevel": 135, @@ -25745,6 +27807,7 @@ "name": "Damis", "hitpoints": 90, "combatLevel": 103, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 90, @@ -25761,6 +27824,7 @@ "name": "Damis", "hitpoints": 200, "combatLevel": 174, + "attackSpeed": 4, "attackLevel": 160, "strengthLevel": 100, "defenceLevel": 160, @@ -25777,6 +27841,7 @@ "name": "Fareed", "hitpoints": 130, "combatLevel": 167, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 120, "defenceLevel": 135, @@ -25792,6 +27857,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -25807,6 +27873,7 @@ "name": "The Inadequacy", "hitpoints": 180, "combatLevel": 343, + "attackSpeed": 4, "attackLevel": 564, "strengthLevel": 170, "defenceLevel": 240, @@ -25817,6 +27884,7 @@ "name": "The Everlasting", "hitpoints": 230, "combatLevel": 223, + "attackSpeed": 6, "attackLevel": 187, "strengthLevel": 231, "defenceLevel": 120, @@ -25827,6 +27895,7 @@ "name": "The Untouchable", "hitpoints": 90, "combatLevel": 274, + "attackSpeed": 6, "attackLevel": 187, "strengthLevel": 255, "defenceLevel": 434, @@ -25837,6 +27906,7 @@ "name": "Tanglefoot", "hitpoints": 102, "combatLevel": 111, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 97, "defenceLevel": 91, @@ -25847,6 +27917,7 @@ "name": "Chronozon", "hitpoints": 60, "combatLevel": 170, + "attackSpeed": 4, "attackLevel": 173, "strengthLevel": 172, "defenceLevel": 173, @@ -25859,6 +27930,7 @@ "hitpoints": 116, "combatLevel": 137, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -25870,6 +27942,7 @@ "hitpoints": 150, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 80, @@ -25888,6 +27961,7 @@ "hitpoints": 157, "combatLevel": 172, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 152, "defenceLevel": 148, @@ -25899,6 +27973,7 @@ "name": "Glod", "hitpoints": 160, "combatLevel": 138, + "attackSpeed": 4, "attackLevel": 115, "strengthLevel": 120, "defenceLevel": 110, @@ -25914,6 +27989,7 @@ "name": "Treus Dayth", "hitpoints": 100, "combatLevel": 95, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 100, @@ -25928,6 +28004,7 @@ "name": "Black Knight Titan", "hitpoints": 142, "combatLevel": 120, + "attackSpeed": 7, "attackLevel": 91, "strengthLevel": 100, "defenceLevel": 91, @@ -25945,6 +28022,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25960,6 +28038,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25975,6 +28054,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -25990,6 +28070,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26005,6 +28086,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26020,6 +28102,7 @@ "name": "Dagannoth mother", "hitpoints": 120, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26035,6 +28118,7 @@ "name": "Evil Chicken", "hitpoints": 120, "combatLevel": 159, + "attackSpeed": 4, "defenceLevel": 126, "magicLevel": 200 }, @@ -26042,6 +28126,7 @@ "name": "Culinaromancer", "hitpoints": 150, "combatLevel": 75, + "attackSpeed": 4, "attackLevel": 10, "strengthLevel": 100, "defenceLevel": 10, @@ -26052,6 +28137,7 @@ "name": "Agrith-Na-Na", "hitpoints": 200, "combatLevel": 146, + "attackSpeed": 4, "attackLevel": 83, "strengthLevel": 150, "defenceLevel": 82, @@ -26068,6 +28154,7 @@ "name": "Flambeed", "hitpoints": 210, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 75, @@ -26084,6 +28171,7 @@ "name": "Karamel", "hitpoints": 250, "combatLevel": 136, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -26104,6 +28192,7 @@ "name": "Dessourt", "hitpoints": 130, "combatLevel": 121, + "attackSpeed": 3, "attackLevel": 99, "strengthLevel": 99, "defenceLevel": 99, @@ -26119,6 +28208,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26134,6 +28224,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26149,6 +28240,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26164,6 +28256,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26179,6 +28272,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26194,6 +28288,7 @@ "name": "Gelatinnoth Mother", "hitpoints": 240, "combatLevel": 130, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 78, "defenceLevel": 81, @@ -26209,6 +28304,7 @@ "name": "Nezikchened", "hitpoints": 150, "combatLevel": 187, + "attackSpeed": 5, "attackLevel": 165, "strengthLevel": 168, "defenceLevel": 167, @@ -26221,6 +28317,7 @@ "hitpoints": 85, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 95, "defenceLevel": 80, @@ -26231,6 +28328,7 @@ "name": "Me", "hitpoints": 45, "combatLevel": 79, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 74, @@ -26241,6 +28339,7 @@ "name": "Jungle Demon", "hitpoints": 170, "combatLevel": 195, + "attackSpeed": 6, "attackLevel": 170, "strengthLevel": 170, "defenceLevel": 170, @@ -26256,6 +28355,7 @@ "name": "The Kendal", "hitpoints": 50, "combatLevel": 70, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 60, @@ -26270,6 +28370,7 @@ "name": "Giant Roc", "hitpoints": 250, "combatLevel": 172, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 100, @@ -26281,6 +28382,7 @@ "name": "Slagilith", "hitpoints": 60, "combatLevel": 92, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 75, @@ -26297,6 +28399,7 @@ "name": "Moss giant", "hitpoints": 120, "combatLevel": 84, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -26315,6 +28418,7 @@ "hitpoints": 55, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 110, "defenceLevel": 100, @@ -26325,6 +28429,7 @@ "name": "Agrith Naar", "hitpoints": 100, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 83, "strengthLevel": 90, "defenceLevel": 82, @@ -26336,6 +28441,7 @@ "name": "King Roald", "hitpoints": 60, "combatLevel": 47, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 30, "defenceLevel": 30, @@ -26346,6 +28452,7 @@ "name": "Khazard warlord", "hitpoints": 170, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 80, @@ -26357,6 +28464,7 @@ "hitpoints": 120, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 60, "strengthLevel": 120, "defenceLevel": 50, @@ -26373,6 +28481,7 @@ "hitpoints": 140, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 140, "defenceLevel": 40, @@ -26389,6 +28498,7 @@ "name": "Count Draynor", "hitpoints": 35, "combatLevel": 34, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 25, "defenceLevel": 30, @@ -26402,6 +28512,7 @@ "name": "Witch's experiment", "hitpoints": 21, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 10, "defenceLevel": 19, @@ -26412,6 +28523,7 @@ "name": "Witch's experiment (second form)", "hitpoints": 31, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 28, "strengthLevel": 20, "defenceLevel": 29, @@ -26422,6 +28534,7 @@ "name": "Witch's experiment (third form)", "hitpoints": 41, "combatLevel": 42, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 30, "defenceLevel": 39, @@ -26432,6 +28545,7 @@ "name": "Witch's experiment (fourth form)", "hitpoints": 51, "combatLevel": 53, + "attackSpeed": 4, "attackLevel": 48, "strengthLevel": 40, "defenceLevel": 49, @@ -26442,6 +28556,7 @@ "name": "Nazastarool", "hitpoints": 70, "combatLevel": 91, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 80 @@ -26450,6 +28565,7 @@ "name": "Nazastarool", "hitpoints": 70, "combatLevel": 68, + "attackSpeed": 4, "attackLevel": 58, "strengthLevel": 54, "defenceLevel": 58, @@ -26465,6 +28581,7 @@ "name": "Nazastarool", "hitpoints": 80, "combatLevel": 93, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 80, @@ -26481,6 +28598,7 @@ "hitpoints": 8, "combatLevel": 2, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26491,6 +28609,7 @@ "name": "Mosquito swarm", "hitpoints": 15, "combatLevel": 20, + "attackSpeed": 3, "attackLevel": 15, "strengthLevel": 1, "defenceLevel": 45, @@ -26505,6 +28624,7 @@ "name": "Tribesman", "hitpoints": 39, "combatLevel": 32, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 27, "defenceLevel": 26, @@ -26520,6 +28640,7 @@ "name": "Tribesman", "hitpoints": 39, "combatLevel": 32, + "attackSpeed": 4, "attackLevel": 23, "strengthLevel": 27, "defenceLevel": 26, @@ -26535,6 +28656,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26547,6 +28669,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26559,6 +28682,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26571,6 +28695,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26583,6 +28708,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26595,6 +28721,7 @@ "name": "Broodoo victim", "hitpoints": 100, "combatLevel": 60, + "attackSpeed": 6, "defenceLevel": 26, "rangeLevel": 1, "magicLevel": 60, @@ -26608,6 +28735,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26619,6 +28747,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26630,6 +28759,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26641,6 +28771,7 @@ "hitpoints": 10, "combatLevel": 3, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -26651,6 +28782,7 @@ "name": "Animated steel armour", "hitpoints": 50, "combatLevel": 53, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 2, @@ -26671,6 +28803,7 @@ "hitpoints": 70, "combatLevel": 80, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -26683,6 +28816,7 @@ "hitpoints": 85, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 70, "strengthLevel": 80, "defenceLevel": 60, @@ -26699,6 +28833,7 @@ "hitpoints": 80, "combatLevel": 77, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 60, "defenceLevel": 60, @@ -26715,6 +28850,7 @@ "hitpoints": 71, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 64, "defenceLevel": 80, @@ -26730,6 +28866,7 @@ "hitpoints": 40, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 40, @@ -26745,6 +28882,7 @@ "hitpoints": 53, "combatLevel": 59, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 46, "defenceLevel": 62, @@ -26760,6 +28898,7 @@ "hitpoints": 42, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 36, "strengthLevel": 38, "defenceLevel": 30, @@ -26775,6 +28914,7 @@ "hitpoints": 58, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 56, "strengthLevel": 61, "defenceLevel": 45, @@ -26790,6 +28930,7 @@ "hitpoints": 26, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 33, "strengthLevel": 31, "defenceLevel": 52, @@ -26805,6 +28946,7 @@ "hitpoints": 38, "combatLevel": 40, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 36, "strengthLevel": 35, "defenceLevel": 33, @@ -26821,6 +28963,7 @@ "hitpoints": 40, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 39, "strengthLevel": 35, "defenceLevel": 35, @@ -26837,6 +28980,7 @@ "hitpoints": 42, "combatLevel": 47, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 42, "strengthLevel": 39, "defenceLevel": 42, @@ -26853,6 +28997,7 @@ "hitpoints": 48, "combatLevel": 50, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 44, "strengthLevel": 42, "defenceLevel": 44, @@ -26869,6 +29014,7 @@ "hitpoints": 50, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 47, @@ -26885,6 +29031,7 @@ "hitpoints": 57, "combatLevel": 61, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 55, "defenceLevel": 50, @@ -26901,6 +29048,7 @@ "hitpoints": 63, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 56, "strengthLevel": 58, "defenceLevel": 60, @@ -26917,6 +29065,7 @@ "hitpoints": 65, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 61, "strengthLevel": 60, "defenceLevel": 61, @@ -26933,6 +29082,7 @@ "hitpoints": 68, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 61, "strengthLevel": 63, "defenceLevel": 62, @@ -26949,6 +29099,7 @@ "hitpoints": 71, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 69, "strengthLevel": 65, "defenceLevel": 62, @@ -26965,6 +29116,7 @@ "hitpoints": 73, "combatLevel": 80, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 72, "strengthLevel": 73, "defenceLevel": 62, @@ -26981,6 +29133,7 @@ "hitpoints": 75, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 71, "strengthLevel": 81, "defenceLevel": 70, @@ -26997,6 +29150,7 @@ "hitpoints": 76, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 74, "strengthLevel": 80, "defenceLevel": 71, @@ -27013,6 +29167,7 @@ "hitpoints": 81, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 82, "strengthLevel": 80, "defenceLevel": 72, @@ -27029,6 +29184,7 @@ "hitpoints": 92, "combatLevel": 95, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 80, "defenceLevel": 75, @@ -27045,6 +29201,7 @@ "hitpoints": 96, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 83, "defenceLevel": 81, @@ -27061,6 +29218,7 @@ "hitpoints": 102, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 86, "strengthLevel": 83, "defenceLevel": 81, @@ -27077,6 +29235,7 @@ "hitpoints": 76, "combatLevel": 81, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 69, "strengthLevel": 70, "defenceLevel": 71, @@ -27093,6 +29252,7 @@ "hitpoints": 69, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 61, "defenceLevel": 45, @@ -27109,6 +29269,7 @@ "hitpoints": 92, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 80, "defenceLevel": 55, @@ -27124,6 +29285,7 @@ "name": "Possessed pickaxe", "hitpoints": 40, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 55, "defenceLevel": 40, @@ -27139,6 +29301,7 @@ "name": "Animated spade", "hitpoints": 40, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 55, "defenceLevel": 40, @@ -27155,6 +29318,7 @@ "hitpoints": 87, "combatLevel": 110, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 104, "defenceLevel": 78, @@ -27167,6 +29331,7 @@ "hitpoints": 82, "combatLevel": 100, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 90, "defenceLevel": 74, @@ -27179,6 +29344,7 @@ "hitpoints": 80, "combatLevel": 69, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 80, "defenceLevel": 40, @@ -27195,6 +29361,7 @@ "hitpoints": 80, "combatLevel": 69, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 80, "defenceLevel": 40, @@ -27211,6 +29378,7 @@ "hitpoints": 255, "combatLevel": 580, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 300, "strengthLevel": 200, "defenceLevel": 260, @@ -27231,6 +29399,7 @@ "hitpoints": 255, "combatLevel": 596, "slayerLevel": 1, + "attackSpeed": 2, "attackLevel": 280, "strengthLevel": 196, "defenceLevel": 300, @@ -27252,6 +29421,7 @@ "hitpoints": 255, "combatLevel": 624, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 280, "strengthLevel": 350, "defenceLevel": 250, @@ -27274,6 +29444,7 @@ "hitpoints": 255, "combatLevel": 650, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 340, "strengthLevel": 300, "defenceLevel": 270, @@ -27293,6 +29464,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 128, @@ -27309,6 +29481,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 255, @@ -27324,6 +29497,7 @@ "hitpoints": 255, "combatLevel": 303, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 255, "strengthLevel": 255, "defenceLevel": 255, @@ -27339,6 +29513,7 @@ "hitpoints": 200, "combatLevel": 230, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -27355,6 +29530,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -27371,6 +29547,7 @@ "hitpoints": 255, "combatLevel": 333, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 300, "defenceLevel": 300, @@ -27387,6 +29564,7 @@ "hitpoints": 255, "combatLevel": 470, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 350, "strengthLevel": 370, "defenceLevel": 440, @@ -27423,6 +29601,7 @@ "hitpoints": 250, "combatLevel": 305, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 270, "strengthLevel": 270, "defenceLevel": 270, @@ -27439,6 +29618,7 @@ "hitpoints": 250, "combatLevel": 702, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 640, "strengthLevel": 960, "defenceLevel": 480, @@ -27450,6 +29630,7 @@ "name": "Gnome guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27466,6 +29647,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27482,6 +29664,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27498,6 +29681,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27514,6 +29698,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27530,6 +29715,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27546,6 +29732,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27562,6 +29749,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27579,6 +29767,7 @@ "hitpoints": 132, "combatLevel": 97, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 82, @@ -27590,6 +29779,7 @@ "name": "Bandosian guard", "hitpoints": 130, "combatLevel": 125, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 115, "defenceLevel": 80, @@ -27608,6 +29798,7 @@ "hitpoints": 230, "combatLevel": 252, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 220, "defenceLevel": 220, @@ -27625,6 +29816,7 @@ "hitpoints": 105, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 95, "defenceLevel": 75, @@ -27641,6 +29833,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27653,6 +29846,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27665,6 +29859,7 @@ "hitpoints": 24, "combatLevel": 18, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -27676,6 +29871,7 @@ "name": "Runite Golem", "hitpoints": 170, "combatLevel": 178, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 150, "defenceLevel": 165, @@ -27687,6 +29883,7 @@ "hitpoints": 125, "combatLevel": 135, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 150, @@ -27698,6 +29895,7 @@ "hitpoints": 130, "combatLevel": 80, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 55, "strengthLevel": 60, "defenceLevel": 50, @@ -27709,6 +29907,7 @@ "hitpoints": 155, "combatLevel": 130, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 57, "strengthLevel": 57, "defenceLevel": 57, @@ -27724,6 +29923,7 @@ "hitpoints": 137, "combatLevel": 145, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 55, @@ -27738,6 +29938,7 @@ "hitpoints": 150, "combatLevel": 129, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 98, "strengthLevel": 65, "defenceLevel": 98, @@ -27749,6 +29950,7 @@ "hitpoints": 70, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 80, @@ -27761,6 +29963,7 @@ "hitpoints": 255, "combatLevel": 470, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 350, "strengthLevel": 370, "defenceLevel": 440, @@ -27797,6 +30000,7 @@ "hitpoints": 255, "combatLevel": 454, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 430, "strengthLevel": 430, "defenceLevel": 395, @@ -27813,6 +30017,7 @@ "hitpoints": 255, "combatLevel": 454, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 430, "strengthLevel": 430, "defenceLevel": 395, @@ -27829,6 +30034,7 @@ "hitpoints": 110, "combatLevel": 214, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 210, "strengthLevel": 250, "defenceLevel": 150, @@ -27846,6 +30052,7 @@ "hitpoints": 190, "combatLevel": 281, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 310, "defenceLevel": 220, @@ -27863,6 +30070,7 @@ "hitpoints": 200, "combatLevel": 225, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 180, @@ -27880,6 +30088,7 @@ "hitpoints": 2, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -27903,6 +30112,7 @@ "hitpoints": 225, "combatLevel": 204, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 160, "strengthLevel": 90, "defenceLevel": 240, @@ -27922,6 +30132,7 @@ "hitpoints": 225, "combatLevel": 202, "slayerLevel": 1, + "attackSpeed": 2, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 220, @@ -27942,6 +30153,7 @@ "name": "Ghost guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27958,6 +30170,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27974,6 +30187,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -27990,6 +30204,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -28006,6 +30221,7 @@ "name": "Guard", "hitpoints": 800, "combatLevel": 1337, + "attackSpeed": 4, "attackLevel": 800, "strengthLevel": 400, "defenceLevel": 300, @@ -28022,6 +30238,7 @@ "name": "Chaotic death spawn", "hitpoints": 50, "combatLevel": 215, + "attackSpeed": 3, "attackLevel": 380, "strengthLevel": 1, "defenceLevel": 70, @@ -28033,6 +30250,7 @@ "name": "Chaotic death spawn", "hitpoints": 50, "combatLevel": 215, + "attackSpeed": 3, "attackLevel": 380, "strengthLevel": 1, "defenceLevel": 70, @@ -28042,24 +30260,29 @@ }, "6725": { "name": "Rock Golem", - "combatLevel": 14 + "combatLevel": 14, + "attackSpeed": 4 }, "6726": { "name": "Rock Golem", - "combatLevel": 29 + "combatLevel": 29, + "attackSpeed": 4 }, "6727": { "name": "Rock Golem", - "combatLevel": 49 + "combatLevel": 49, + "attackSpeed": 4 }, "6728": { "name": "Rock Golem", - "combatLevel": 79 + "combatLevel": 79, + "attackSpeed": 4 }, "6729": { "name": "Rock Golem", "hitpoints": 120, "combatLevel": 120, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -28070,6 +30293,7 @@ "name": "Rock Golem", "hitpoints": 170, "combatLevel": 159, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -28080,6 +30304,7 @@ "name": "River troll", "combatLevel": 14, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 17, "strengthLevel": 17, "defenceLevel": 17, @@ -28090,6 +30315,7 @@ "name": "River troll", "combatLevel": 29, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 32, "strengthLevel": 32, "defenceLevel": 32, @@ -28100,6 +30326,7 @@ "name": "River troll", "combatLevel": 49, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 48, "strengthLevel": 48, "defenceLevel": 48, @@ -28111,6 +30338,7 @@ "hitpoints": 85, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -28122,6 +30350,7 @@ "hitpoints": 120, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -28133,6 +30362,7 @@ "hitpoints": 170, "combatLevel": 159, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -28143,6 +30373,7 @@ "name": "Evil Chicken", "hitpoints": 120, "combatLevel": 159, + "attackSpeed": 4, "defenceLevel": 126, "magicLevel": 200 }, @@ -28151,6 +30382,7 @@ "hitpoints": 170, "combatLevel": 159, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -28163,6 +30395,7 @@ "hitpoints": 170, "combatLevel": 159, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -28175,6 +30408,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -28193,6 +30427,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -28211,6 +30446,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -28221,6 +30457,7 @@ "name": "Kruk", "hitpoints": 210, "combatLevel": 149, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 150, @@ -28241,6 +30478,7 @@ "hitpoints": 50, "combatLevel": 86, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -28252,6 +30490,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28268,6 +30507,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28284,6 +30524,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28300,6 +30541,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28316,6 +30558,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28332,6 +30575,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28348,6 +30592,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28364,6 +30609,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -28380,6 +30626,7 @@ "hitpoints": 32, "combatLevel": 27, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 22, "defenceLevel": 22, @@ -28395,6 +30642,7 @@ "name": "Gangster", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 50, @@ -28408,6 +30656,7 @@ "name": "Gangster", "hitpoints": 40, "combatLevel": 45, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 30, "defenceLevel": 50, @@ -28421,6 +30670,7 @@ "name": "Gangster", "hitpoints": 50, "combatLevel": 50, + "attackSpeed": 5, "attackLevel": 50, "strengthLevel": 40, "defenceLevel": 40, @@ -28434,6 +30684,7 @@ "name": "Gangster", "hitpoints": 50, "combatLevel": 50, + "attackSpeed": 5, "attackLevel": 50, "strengthLevel": 40, "defenceLevel": 40, @@ -28447,6 +30698,7 @@ "name": "Gang boss", "hitpoints": 80, "combatLevel": 83, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -28459,6 +30711,7 @@ "name": "Gang boss", "hitpoints": 80, "combatLevel": 83, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -28471,6 +30724,7 @@ "name": "Gang boss", "hitpoints": 80, "combatLevel": 76, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -28483,6 +30737,7 @@ "name": "Gang boss", "hitpoints": 80, "combatLevel": 76, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 70, @@ -28495,6 +30750,7 @@ "name": "Soldier (tier 1)", "hitpoints": 50, "combatLevel": 39, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -28509,6 +30765,7 @@ "name": "Soldier (tier 1)", "hitpoints": 50, "combatLevel": 39, + "attackSpeed": 6, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -28523,6 +30780,7 @@ "name": "Soldier (tier 2)", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -28537,6 +30795,7 @@ "name": "Soldier (tier 2)", "hitpoints": 50, "combatLevel": 48, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 40, "defenceLevel": 40, @@ -28551,6 +30810,7 @@ "name": "Soldier (tier 3)", "hitpoints": 55, "combatLevel": 58, + "attackSpeed": 5, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -28565,6 +30825,7 @@ "name": "Soldier (tier 3)", "hitpoints": 55, "combatLevel": 58, + "attackSpeed": 5, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 50, @@ -28579,6 +30840,7 @@ "name": "Soldier (tier 4)", "hitpoints": 65, "combatLevel": 70, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -28595,6 +30857,7 @@ "name": "Soldier (tier 4)", "hitpoints": 65, "combatLevel": 70, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -28611,6 +30874,7 @@ "name": "Soldier (tier 5)", "hitpoints": 90, "combatLevel": 99, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 85, "defenceLevel": 86, @@ -28625,6 +30889,7 @@ "name": "Soldier (tier 5)", "hitpoints": 90, "combatLevel": 99, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 85, "defenceLevel": 86, @@ -28640,6 +30905,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -28656,6 +30922,7 @@ "hitpoints": 60, "combatLevel": 53, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 43, "strengthLevel": 43, "defenceLevel": 43, @@ -28672,6 +30939,7 @@ "hitpoints": 60, "combatLevel": 62, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 53, "defenceLevel": 52, @@ -28689,6 +30957,7 @@ "hitpoints": 60, "combatLevel": 62, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 53, "defenceLevel": 52, @@ -28706,6 +30975,7 @@ "hitpoints": 60, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -28723,6 +30993,7 @@ "hitpoints": 60, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -28739,6 +31010,7 @@ "name": "Monk", "hitpoints": 5, "combatLevel": 3, + "attackSpeed": 4, "attackLevel": 2, "strengthLevel": 2, "defenceLevel": 3, @@ -28749,6 +31021,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28759,6 +31032,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28769,6 +31043,7 @@ "name": "Man", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28779,6 +31054,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28789,6 +31065,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28799,6 +31076,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -28809,6 +31087,7 @@ "name": "Mugger", "hitpoints": 8, "combatLevel": 6, + "attackSpeed": 4, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 5, @@ -28819,6 +31098,7 @@ "name": "Kourend guard", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 19, "strengthLevel": 18, "defenceLevel": 14, @@ -28830,6 +31110,7 @@ "name": "Kourend head guard", "hitpoints": 86, "combatLevel": 84, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 73, "defenceLevel": 61, @@ -28844,100 +31125,122 @@ }, "7018": { "name": "Reanimated goblin", - "hitpoints": 5 + "hitpoints": 5, + "attackSpeed": 4 }, "7019": { "name": "Reanimated monkey", - "hitpoints": 5 + "hitpoints": 5, + "attackSpeed": 4 }, "7020": { "name": "Reanimated imp", - "hitpoints": 5 + "hitpoints": 5, + "attackSpeed": 4 }, "7021": { "name": "Reanimated minotaur", - "hitpoints": 10 + "hitpoints": 10, + "attackSpeed": 4 }, "7022": { "name": "Reanimated scorpion", - "hitpoints": 15 + "hitpoints": 15, + "attackSpeed": 4 }, "7023": { "name": "Reanimated bear", - "hitpoints": 15 + "hitpoints": 15, + "attackSpeed": 4 }, "7024": { "name": "Reanimated unicorn", - "hitpoints": 15 + "hitpoints": 15, + "attackSpeed": 4 }, "7025": { "name": "Reanimated dog", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 4 }, "7026": { "name": "Reanimated chaos druid", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 4 }, "7027": { "name": "Reanimated giant", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7028": { "name": "Reanimated ogre", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 5 }, "7029": { "name": "Reanimated elf", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7030": { "name": "Reanimated troll", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7031": { "name": "Reanimated horror", "hitpoints": 35, - "slayerLevel": 58 + "slayerLevel": 58, + "attackSpeed": 4 }, "7032": { "name": "Reanimated kalphite", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7033": { "name": "Reanimated dagannoth", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7034": { "name": "Reanimated bloodveld", "hitpoints": 35, - "slayerLevel": 50 + "slayerLevel": 50, + "attackSpeed": 4 }, "7035": { "name": "Reanimated TzHaar", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 5 }, "7036": { "name": "Reanimated demon", - "hitpoints": 35 + "hitpoints": 35, + "attackSpeed": 4 }, "7037": { "name": "Reanimated aviansie", "hitpoints": 35, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 4 }, "7038": { "name": "Reanimated abyssal", "hitpoints": 35, - "slayerLevel": 85 + "slayerLevel": 85, + "attackSpeed": 4 }, "7039": { "name": "Reanimated dragon", "hitpoints": 35, + "attackSpeed": 4, "dragon": true }, "7095": { @@ -28945,6 +31248,7 @@ "hitpoints": 110, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 90, "defenceLevel": 110, @@ -28958,6 +31262,7 @@ "hitpoints": 110, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 90, "defenceLevel": 110, @@ -28971,6 +31276,7 @@ "hitpoints": 110, "combatLevel": 142, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 90, "defenceLevel": 110, @@ -28983,6 +31289,7 @@ "name": "Glough", "hitpoints": 575, "combatLevel": 378, + "attackSpeed": 6, "attackLevel": 260, "strengthLevel": 270, "defenceLevel": 248, @@ -28999,6 +31306,7 @@ "name": "Glough", "hitpoints": 575, "combatLevel": 378, + "attackSpeed": 6, "attackLevel": 260, "strengthLevel": 270, "defenceLevel": 248, @@ -29015,6 +31323,7 @@ "name": "Glough", "hitpoints": 575, "combatLevel": 378, + "attackSpeed": 6, "attackLevel": 260, "strengthLevel": 270, "defenceLevel": 248, @@ -29031,6 +31340,7 @@ "name": "Keef", "hitpoints": 180, "combatLevel": 178, + "attackSpeed": 5, "attackLevel": 165, "strengthLevel": 120, "defenceLevel": 165, @@ -29046,6 +31356,7 @@ "name": "Keef", "hitpoints": 180, "combatLevel": 178, + "attackSpeed": 5, "attackLevel": 165, "strengthLevel": 120, "defenceLevel": 165, @@ -29061,6 +31372,7 @@ "name": "Kob", "hitpoints": 200, "combatLevel": 185, + "attackSpeed": 5, "attackLevel": 180, "strengthLevel": 175, "defenceLevel": 80, @@ -29078,6 +31390,7 @@ "name": "Kob", "hitpoints": 200, "combatLevel": 185, + "attackSpeed": 5, "attackLevel": 180, "strengthLevel": 175, "defenceLevel": 80, @@ -29095,6 +31408,7 @@ "name": "Maniacal monkey", "hitpoints": 65, "combatLevel": 140, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 175, "defenceLevel": 10, @@ -29105,6 +31419,7 @@ "name": "Maniacal Monkey Archer", "hitpoints": 60, "combatLevel": 132, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 80, "defenceLevel": 80, @@ -29116,6 +31431,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -29134,6 +31450,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -29152,6 +31469,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -29170,6 +31488,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -29188,6 +31507,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -29206,6 +31526,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -29224,6 +31545,7 @@ "hitpoints": 210, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 95, "defenceLevel": 95, @@ -29242,6 +31564,7 @@ "hitpoints": 210, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 95, "defenceLevel": 95, @@ -29260,6 +31583,7 @@ "hitpoints": 380, "combatLevel": 275, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 205, "strengthLevel": 195, "defenceLevel": 200, @@ -29278,6 +31602,7 @@ "hitpoints": 210, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 105, "strengthLevel": 95, "defenceLevel": 95, @@ -29295,6 +31620,7 @@ "name": "Sand Crab", "hitpoints": 60, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -29305,6 +31631,7 @@ "name": "Sandy rocks", "hitpoints": 60, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -29316,6 +31643,7 @@ "hitpoints": 49, "combatLevel": 44, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 35, "strengthLevel": 36, "defenceLevel": 37, @@ -29326,6 +31654,7 @@ "name": "Ent", "hitpoints": 75, "combatLevel": 86, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 75, @@ -29343,6 +31672,7 @@ "name": "Forester", "hitpoints": 17, "combatLevel": 15, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 8, @@ -29357,6 +31687,7 @@ "hitpoints": 150, "combatLevel": 124, "slayerLevel": 85, + "attackSpeed": 4, "attackLevel": 97, "strengthLevel": 67, "defenceLevel": 135, @@ -29373,6 +31704,7 @@ "hitpoints": 170, "combatLevel": 184, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 155, "strengthLevel": 158, "defenceLevel": 162, @@ -29385,6 +31717,7 @@ "hitpoints": 160, "combatLevel": 178, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 148, "defenceLevel": 175, @@ -29397,6 +31730,7 @@ "hitpoints": 120, "combatLevel": 101, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 90, "defenceLevel": 50, @@ -29409,6 +31743,7 @@ "hitpoints": 115, "combatLevel": 100, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 70, "defenceLevel": 80, @@ -29421,6 +31756,7 @@ "hitpoints": 130, "combatLevel": 113, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 50, @@ -29433,6 +31769,7 @@ "hitpoints": 87, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 71, @@ -29445,6 +31782,7 @@ "hitpoints": 98, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 85, @@ -29457,6 +31795,7 @@ "hitpoints": 130, "combatLevel": 110, "slayerLevel": 65, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 40, @@ -29468,6 +31807,7 @@ "hitpoints": 220, "combatLevel": 182, "slayerLevel": 90, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 160, "defenceLevel": 120, @@ -29484,6 +31824,7 @@ "hitpoints": 150, "combatLevel": 109, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 90, "strengthLevel": 80, "defenceLevel": 65, @@ -29499,6 +31840,7 @@ "hitpoints": 130, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 120, @@ -29516,6 +31858,7 @@ "hitpoints": 122, "combatLevel": 143, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 112, @@ -29533,6 +31876,7 @@ "hitpoints": 195, "combatLevel": 215, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 185, "strengthLevel": 185, "defenceLevel": 185, @@ -29550,6 +31894,7 @@ "hitpoints": 250, "combatLevel": 274, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 235, "strengthLevel": 235, "defenceLevel": 235, @@ -29567,6 +31912,7 @@ "hitpoints": 116, "combatLevel": 122, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 104, "defenceLevel": 102, @@ -29578,6 +31924,7 @@ "hitpoints": 60, "combatLevel": 95, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 70, "defenceLevel": 100, @@ -29590,6 +31937,7 @@ "hitpoints": 115, "combatLevel": 140, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 136, "defenceLevel": 100, @@ -29602,6 +31950,7 @@ "hitpoints": 70, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 50, @@ -29613,6 +31962,7 @@ "hitpoints": 120, "combatLevel": 92, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -29626,6 +31976,7 @@ "hitpoints": 35, "combatLevel": 28, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 22, "defenceLevel": 26, @@ -29639,6 +31990,7 @@ "hitpoints": 60, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 30, "defenceLevel": 30, @@ -29652,6 +32004,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -29668,6 +32021,7 @@ "hitpoints": 25, "combatLevel": 19, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 13, "strengthLevel": 13, "defenceLevel": 18, @@ -29684,6 +32038,7 @@ "hitpoints": 29, "combatLevel": 22, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 18, "defenceLevel": 17, @@ -29698,6 +32053,7 @@ "name": "King Sand Crab", "hitpoints": 200, "combatLevel": 107, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 100, @@ -29708,6 +32064,7 @@ "name": "Sandy Boulder", "hitpoints": 200, "combatLevel": 107, + "attackSpeed": 6, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 100, @@ -29718,6 +32075,7 @@ "name": "Possessed pickaxe", "hitpoints": 40, "combatLevel": 50, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 55, "defenceLevel": 40, @@ -29734,6 +32092,7 @@ "hitpoints": 45, "combatLevel": 42, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 29, @@ -29750,6 +32109,7 @@ "hitpoints": 100, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -29761,6 +32121,7 @@ "hitpoints": 75, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 35, @@ -29772,6 +32133,7 @@ "hitpoints": 109, "combatLevel": 89, "slayerLevel": 15, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 85, "defenceLevel": 50, @@ -29788,6 +32150,7 @@ "hitpoints": 245, "combatLevel": 271, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 298, "strengthLevel": 198, "defenceLevel": 198, @@ -29806,6 +32169,7 @@ "hitpoints": 285, "combatLevel": 289, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 310, "strengthLevel": 210, "defenceLevel": 198, @@ -29824,6 +32188,7 @@ "hitpoints": 315, "combatLevel": 318, "slayerLevel": 77, + "attackSpeed": 4, "attackLevel": 330, "strengthLevel": 210, "defenceLevel": 258, @@ -29843,6 +32208,7 @@ "hitpoints": 170, "combatLevel": 123, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 110, "strengthLevel": 115, "defenceLevel": 30, @@ -29854,6 +32220,7 @@ "hitpoints": 140, "combatLevel": 112, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 90, "defenceLevel": 70, @@ -29865,6 +32232,7 @@ "hitpoints": 205, "combatLevel": 200, "slayerLevel": 80, + "attackSpeed": 4, "attackLevel": 197, "strengthLevel": 197, "defenceLevel": 85, @@ -29881,6 +32249,7 @@ "hitpoints": 190, "combatLevel": 169, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 90, @@ -29897,6 +32266,7 @@ "hitpoints": 450, "combatLevel": 321, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 240, "strengthLevel": 250, "defenceLevel": 200, @@ -29918,6 +32288,7 @@ "hitpoints": 85, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 71, @@ -29950,6 +32321,7 @@ "hitpoints": 60, "combatLevel": 95, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 70, "defenceLevel": 100, @@ -29960,6 +32332,7 @@ "name": "Ancient Wizard", "hitpoints": 80, "combatLevel": 98, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 30, "defenceLevel": 20, @@ -29970,6 +32343,7 @@ "name": "Ancient Wizard", "hitpoints": 80, "combatLevel": 98, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 30, "defenceLevel": 20, @@ -29981,6 +32355,7 @@ "name": "Ancient Wizard", "hitpoints": 80, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 150, "defenceLevel": 20, @@ -29993,6 +32368,7 @@ "name": "Brassican Mage", "hitpoints": 150, "combatLevel": 140, + "attackSpeed": 3, "attackLevel": 80, "strengthLevel": 70, "defenceLevel": 80, @@ -30003,6 +32379,7 @@ "name": "Double agent", "hitpoints": 160, "combatLevel": 141, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 105, "defenceLevel": 100, @@ -30019,6 +32396,7 @@ "hitpoints": 62, "combatLevel": 63, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 54, "defenceLevel": 54, @@ -30030,6 +32408,7 @@ "hitpoints": 55, "combatLevel": 45, "slayerLevel": 5, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 42, "defenceLevel": 14, @@ -30043,6 +32422,7 @@ "hitpoints": 64, "combatLevel": 68, "slayerLevel": 10, + "attackSpeed": 4, "attackLevel": 22, "strengthLevel": 18, "defenceLevel": 18, @@ -30059,6 +32439,7 @@ "hitpoints": 61, "combatLevel": 70, "slayerLevel": 15, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 61, "defenceLevel": 56, @@ -30077,6 +32458,7 @@ "hitpoints": 220, "combatLevel": 144, "slayerLevel": 15, + "attackSpeed": 4, "attackLevel": 103, "strengthLevel": 110, "defenceLevel": 80, @@ -30095,6 +32477,7 @@ "hitpoints": 77, "combatLevel": 86, "slayerLevel": 20, + "attackSpeed": 6, "attackLevel": 72, "strengthLevel": 77, "defenceLevel": 77, @@ -30106,6 +32489,7 @@ "hitpoints": 95, "combatLevel": 89, "slayerLevel": 25, + "attackSpeed": 4, "attackLevel": 63, "strengthLevel": 78, "defenceLevel": 78, @@ -30122,6 +32506,7 @@ "hitpoints": 126, "combatLevel": 97, "slayerLevel": 30, + "attackSpeed": 4, "attackLevel": 98, "strengthLevel": 65, "defenceLevel": 52, @@ -30139,6 +32524,7 @@ "hitpoints": 170, "combatLevel": 135, "slayerLevel": 40, + "attackSpeed": 4, "attackLevel": 88, "strengthLevel": 98, "defenceLevel": 130, @@ -30155,6 +32541,7 @@ "hitpoints": 175, "combatLevel": 162, "slayerLevel": 45, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 135, @@ -30168,6 +32555,7 @@ "hitpoints": 380, "combatLevel": 202, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 145, "defenceLevel": 85, @@ -30180,6 +32568,7 @@ "hitpoints": 410, "combatLevel": 278, "slayerLevel": 50, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 190, "defenceLevel": 130, @@ -30192,6 +32581,7 @@ "hitpoints": 190, "combatLevel": 206, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 170, "strengthLevel": 150, "defenceLevel": 220, @@ -30203,6 +32593,7 @@ "hitpoints": 220, "combatLevel": 241, "slayerLevel": 52, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 180, "defenceLevel": 250, @@ -30225,6 +32616,7 @@ "hitpoints": 250, "combatLevel": 253, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 180, @@ -30242,6 +32634,7 @@ "hitpoints": 390, "combatLevel": 335, "slayerLevel": 60, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 220, @@ -30259,6 +32652,7 @@ "hitpoints": 300, "combatLevel": 264, "slayerLevel": 65, + "attackSpeed": 4, "attackLevel": 260, "strengthLevel": 230, "defenceLevel": 120, @@ -30270,6 +32664,7 @@ "hitpoints": 420, "combatLevel": 295, "slayerLevel": 70, + "attackSpeed": 4, "attackLevel": 190, "strengthLevel": 320, "defenceLevel": 250, @@ -30285,6 +32680,7 @@ "hitpoints": 240, "combatLevel": 280, "slayerLevel": 93, + "attackSpeed": 4, "attackLevel": 240, "strengthLevel": 230, "defenceLevel": 390, @@ -30300,6 +32696,7 @@ "hitpoints": 270, "combatLevel": 349, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 230, "strengthLevel": 250, "defenceLevel": 190, @@ -30317,6 +32714,7 @@ "hitpoints": 270, "combatLevel": 349, "slayerLevel": 75, + "attackSpeed": 4, "attackLevel": 230, "strengthLevel": 250, "defenceLevel": 190, @@ -30334,6 +32732,7 @@ "hitpoints": 550, "combatLevel": 374, "slayerLevel": 90, + "attackSpeed": 4, "attackLevel": 270, "strengthLevel": 290, "defenceLevel": 220, @@ -30351,6 +32750,7 @@ "hitpoints": 400, "combatLevel": 342, "slayerLevel": 85, + "attackSpeed": 4, "attackLevel": 300, "strengthLevel": 260, "defenceLevel": 240, @@ -30368,6 +32768,7 @@ "hitpoints": 320, "combatLevel": 300, "slayerLevel": 80, + "attackSpeed": 4, "attackLevel": 310, "strengthLevel": 260, "defenceLevel": 140, @@ -30384,6 +32785,7 @@ "hitpoints": 120, "combatLevel": 106, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 90, "strengthLevel": 100, "defenceLevel": 60, @@ -30403,6 +32805,7 @@ "name": "Zamorak warrior", "hitpoints": 50, "combatLevel": 84, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 70, "defenceLevel": 90, @@ -30413,6 +32816,7 @@ "name": "Zamorak warrior", "hitpoints": 50, "combatLevel": 85, + "attackSpeed": 4, "attackLevel": 90, "strengthLevel": 70, "defenceLevel": 90, @@ -30423,6 +32827,7 @@ "name": "Zamorak ranger", "hitpoints": 50, "combatLevel": 81, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 75, "defenceLevel": 80, @@ -30433,6 +32838,7 @@ "name": "Zamorak ranger", "hitpoints": 50, "combatLevel": 82, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 80, "defenceLevel": 80, @@ -30443,6 +32849,7 @@ "name": "Zamorak mage", "hitpoints": 50, "combatLevel": 84, + "attackSpeed": 4, "attackLevel": 78, "strengthLevel": 81, "defenceLevel": 82, @@ -30453,6 +32860,7 @@ "name": "Zamorak mage", "hitpoints": 50, "combatLevel": 82, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 80, "defenceLevel": 80, @@ -30463,6 +32871,7 @@ "name": "Cave lizard", "hitpoints": 20, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 36, "defenceLevel": 35, @@ -30477,6 +32886,7 @@ "name": "Zamorak crafter", "hitpoints": 25, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 15, "defenceLevel": 12, @@ -30487,6 +32897,7 @@ "name": "Zamorak crafter", "hitpoints": 25, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 15, "defenceLevel": 12, @@ -30498,6 +32909,7 @@ "hitpoints": 65, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 61, "strengthLevel": 60, "defenceLevel": 61, @@ -30514,6 +32926,7 @@ "hitpoints": 50, "combatLevel": 56, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 47, @@ -30530,6 +32943,7 @@ "hitpoints": 71, "combatLevel": 76, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 69, "strengthLevel": 65, "defenceLevel": 62, @@ -30546,6 +32960,7 @@ "hitpoints": 68, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 61, "strengthLevel": 63, "defenceLevel": 62, @@ -30561,6 +32976,7 @@ "name": "Derwen", "hitpoints": 320, "combatLevel": 235, + "attackSpeed": 6, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 100, @@ -30580,6 +32996,7 @@ "hitpoints": 320, "combatLevel": 235, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 100, @@ -30597,6 +33014,7 @@ "7527": { "name": "Vanguard", "hitpoints": 225, + "attackSpeed": 4, "attackLevel": 225, "strengthLevel": 225, "defenceLevel": 315, @@ -30613,6 +33031,7 @@ "7528": { "name": "Vanguard", "hitpoints": 225, + "attackSpeed": 4, "attackLevel": 225, "strengthLevel": 225, "defenceLevel": 315, @@ -30629,6 +33048,7 @@ "7529": { "name": "Vanguard", "hitpoints": 225, + "attackSpeed": 4, "attackLevel": 225, "strengthLevel": 225, "defenceLevel": 315, @@ -30645,24 +33065,28 @@ "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, @@ -30672,18 +33096,21 @@ "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, @@ -30698,6 +33125,7 @@ "7541": { "name": "Tekton", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30712,6 +33140,7 @@ "7542": { "name": "Tekton", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30726,6 +33155,7 @@ "7543": { "name": "Tekton (enraged)", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30740,6 +33170,7 @@ "7544": { "name": "Tekton (enraged)", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30754,6 +33185,7 @@ "7545": { "name": "Tekton", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 390, "strengthLevel": 390, "defenceLevel": 205, @@ -30768,6 +33200,7 @@ "7548": { "name": "Scavenger beast", "hitpoints": 30, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 45, @@ -30777,6 +33210,7 @@ "7549": { "name": "Scavenger beast", "hitpoints": 45, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 180, "defenceLevel": 67, @@ -30787,6 +33221,7 @@ "name": "Great Olm (Right claw)", "hitpoints": 600, "combatLevel": 549, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 175, @@ -30804,6 +33239,7 @@ "name": "Great Olm", "hitpoints": 800, "combatLevel": 1043, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 150, @@ -30821,6 +33257,7 @@ "name": "Great Olm (Left claw)", "hitpoints": 600, "combatLevel": 750, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 175, @@ -30838,6 +33275,7 @@ "name": "Great Olm (Right claw)", "hitpoints": 600, "combatLevel": 549, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 175, @@ -30855,6 +33293,7 @@ "name": "Great Olm", "hitpoints": 800, "combatLevel": 1043, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 150, @@ -30872,6 +33311,7 @@ "name": "Great Olm (Left claw)", "hitpoints": 600, "combatLevel": 750, + "attackSpeed": 4, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 175, @@ -30888,6 +33328,7 @@ "7559": { "name": "Deathly ranger", "hitpoints": 120, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "range": 120, @@ -30896,6 +33337,7 @@ "7560": { "name": "Deathly mage", "hitpoints": 120, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "rangeLevel": 1, @@ -30903,19 +33345,23 @@ }, "7561": { "name": "Muttadile", - "hitpoints": 250 + "hitpoints": 250, + "attackSpeed": 4 }, "7562": { "name": "Muttadile", - "hitpoints": 250 + "hitpoints": 250, + "attackSpeed": 4 }, "7563": { "name": "Muttadile", - "hitpoints": 250 + "hitpoints": 250, + "attackSpeed": 4 }, "7566": { "name": "Vasa Nistirio", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "range": 100, @@ -30928,6 +33374,7 @@ "7567": { "name": "Vasa Nistirio", "hitpoints": 300, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "range": 100, @@ -30940,6 +33387,7 @@ "7568": { "name": "Glowing crystal", "hitpoints": 120, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "rangeLevel": 1, @@ -30950,6 +33398,7 @@ "name": "Lizardman shaman", "hitpoints": 190, "slayerLevel": 1, + "attackSpeed": 4, "range": 56, "stabDef": 102, "slashDef": 160, @@ -30963,6 +33412,7 @@ "name": "Lizardman shaman", "hitpoints": 190, "slayerLevel": 1, + "attackSpeed": 4, "range": 56, "stabDef": 102, "slashDef": 160, @@ -30975,6 +33425,7 @@ "7584": { "name": "Ice demon", "hitpoints": 140, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 160, @@ -30990,6 +33441,7 @@ "7585": { "name": "Ice demon", "hitpoints": 210, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 240, @@ -31006,6 +33458,7 @@ "name": "Skeletal Mystic", "hitpoints": 160, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magic": 40, "stabDef": 155, @@ -31021,6 +33474,7 @@ "name": "Skeletal Mystic", "hitpoints": 160, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magic": 40, "stabDef": 155, @@ -31036,6 +33490,7 @@ "name": "Skeletal Mystic", "hitpoints": 160, "slayerLevel": 1, + "attackSpeed": 4, "rangeLevel": 1, "magic": 40, "stabDef": 155, @@ -31052,6 +33507,7 @@ "hitpoints": 45, "combatLevel": 30, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 20, "strengthLevel": 20, "defenceLevel": 20, @@ -31062,6 +33518,7 @@ "name": "Khazard warlord", "hitpoints": 170, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 80, @@ -31072,6 +33529,7 @@ "name": "Khazard warlord", "hitpoints": 170, "combatLevel": 112, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 78, "defenceLevel": 80, @@ -31082,6 +33540,7 @@ "name": "Chaotic death spawn", "hitpoints": 50, "combatLevel": 215, + "attackSpeed": 3, "attackLevel": 380, "strengthLevel": 1, "defenceLevel": 70, @@ -31094,6 +33553,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -31106,6 +33566,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -31117,30 +33578,35 @@ "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7659": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7660": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7661": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7662": { "name": "Mummy", "hitpoints": 68, "combatLevel": 84, + "attackSpeed": 4, "undead": true }, "7664": { @@ -31148,6 +33614,7 @@ "hitpoints": 81, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 71, @@ -31160,6 +33627,7 @@ "hitpoints": 200, "combatLevel": 221, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 180, "defenceLevel": 190, @@ -31171,6 +33639,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -31182,6 +33651,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -31193,6 +33663,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -31204,6 +33675,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -31215,6 +33687,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -31226,6 +33699,7 @@ "hitpoints": 80, "combatLevel": 74, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 60, "defenceLevel": 60, @@ -31237,6 +33711,7 @@ "hitpoints": 10, "combatLevel": 32, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 15, @@ -31248,6 +33723,7 @@ "hitpoints": 25, "combatLevel": 85, "slayerLevel": 1, + "attackSpeed": 3, "defenceLevel": 55, "rangeLevel": 120, "magicLevel": 120, @@ -31263,6 +33739,7 @@ "hitpoints": 40, "combatLevel": 165, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 160, "strengthLevel": 160, "defenceLevel": 95, @@ -31286,6 +33763,7 @@ "hitpoints": 15, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 95, @@ -31299,6 +33777,7 @@ "hitpoints": 15, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 95, @@ -31313,6 +33792,7 @@ "hitpoints": 15, "combatLevel": 70, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 95, @@ -31331,6 +33811,7 @@ "hitpoints": 75, "combatLevel": 240, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 210, "strengthLevel": 290, "defenceLevel": 120, @@ -31351,6 +33832,7 @@ "hitpoints": 130, "combatLevel": 370, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 180, "defenceLevel": 60, @@ -31364,6 +33846,7 @@ "hitpoints": 220, "combatLevel": 490, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 370, "strengthLevel": 510, "defenceLevel": 260, @@ -31376,6 +33859,7 @@ "hitpoints": 350, "combatLevel": 900, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 750, "strengthLevel": 1020, "defenceLevel": 480, @@ -31393,6 +33877,7 @@ "hitpoints": 90, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 125, "defenceLevel": 100, @@ -31408,6 +33893,7 @@ "hitpoints": 130, "combatLevel": 370, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 180, "defenceLevel": 60, @@ -31421,6 +33907,7 @@ "hitpoints": 220, "combatLevel": 490, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 370, "strengthLevel": 510, "defenceLevel": 260, @@ -31433,6 +33920,7 @@ "hitpoints": 350, "combatLevel": 900, "slayerLevel": 1, + "attackSpeed": 8, "attackLevel": 750, "strengthLevel": 1020, "defenceLevel": 480, @@ -31450,6 +33938,7 @@ "hitpoints": 90, "combatLevel": 141, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 125, "defenceLevel": 100, @@ -31465,6 +33954,7 @@ "hitpoints": 1200, "combatLevel": 1400, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 350, "strengthLevel": 600, "defenceLevel": 260, @@ -31483,6 +33973,7 @@ "hitpoints": 80, "combatLevel": 250, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -31494,6 +33985,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -31512,6 +34004,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -31530,6 +34023,7 @@ "hitpoints": 200, "combatLevel": 152, "slayerLevel": 66, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 120, "defenceLevel": 90, @@ -31547,6 +34041,7 @@ "hitpoints": 200, "combatLevel": 147, "slayerLevel": 66, + "attackSpeed": 6, "attackLevel": 120, "strengthLevel": 110, "defenceLevel": 90, @@ -31564,6 +34059,7 @@ "hitpoints": 200, "combatLevel": 139, "slayerLevel": 66, + "attackSpeed": 6, "attackLevel": 125, "strengthLevel": 80, "defenceLevel": 90, @@ -31581,6 +34077,7 @@ "hitpoints": 300, "combatLevel": 210, "slayerLevel": 82, + "attackSpeed": 5, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 150, @@ -31598,6 +34095,7 @@ "hitpoints": 50, "combatLevel": 68, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 60, "strengthLevel": 80, "defenceLevel": 40, @@ -31614,6 +34112,7 @@ "hitpoints": 150, "combatLevel": 109, "slayerLevel": 57, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 80, @@ -31631,6 +34130,7 @@ "name": "Ammonite Crab", "hitpoints": 100, "combatLevel": 25, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -31641,6 +34141,7 @@ "name": "Hoop Snake", "hitpoints": 25, "combatLevel": 19, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 10, "defenceLevel": 20, @@ -31651,6 +34152,7 @@ "name": "Tar Monster", "hitpoints": 200, "combatLevel": 132, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 80, "defenceLevel": 70, @@ -31662,6 +34164,7 @@ "hitpoints": 200, "combatLevel": 276, "slayerLevel": 1, + "attackSpeed": 3, "attackLevel": 280, "strengthLevel": 160, "defenceLevel": 280, @@ -31679,13 +34182,15 @@ }, "7817": { "name": "Lava beast", - "hitpoints": 65 + "hitpoints": 65, + "attackSpeed": 4 }, "7851": { "name": "Dusk", "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31697,6 +34202,7 @@ "hitpoints": 450, "combatLevel": 228, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 100, @@ -31711,6 +34217,7 @@ "hitpoints": 450, "combatLevel": 228, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 100, @@ -31725,6 +34232,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31736,6 +34244,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -31746,6 +34255,7 @@ "name": "Justiciar Zachariah", "hitpoints": 320, "combatLevel": 348, + "attackSpeed": 6, "attackLevel": 500, "strengthLevel": 250, "defenceLevel": 100, @@ -31765,6 +34275,7 @@ "name": "Derwen", "hitpoints": 320, "combatLevel": 235, + "attackSpeed": 6, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 100, @@ -31784,6 +34295,7 @@ "hitpoints": 320, "combatLevel": 235, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 250, "strengthLevel": 150, "defenceLevel": 100, @@ -31803,6 +34315,7 @@ "hitpoints": 250, "combatLevel": 247, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 215, "defenceLevel": 200, @@ -31820,6 +34333,7 @@ "hitpoints": 250, "combatLevel": 247, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 215, "defenceLevel": 200, @@ -31837,6 +34351,7 @@ "hitpoints": 250, "combatLevel": 247, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 215, "defenceLevel": 200, @@ -31854,6 +34369,7 @@ "hitpoints": 100, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 75, "strengthLevel": 90, "defenceLevel": 100, @@ -31866,6 +34382,7 @@ "hitpoints": 110, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 85, "defenceLevel": 71, @@ -31878,6 +34395,7 @@ "hitpoints": 110, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 85, "defenceLevel": 71, @@ -31890,6 +34408,7 @@ "hitpoints": 110, "combatLevel": 94, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 85, "defenceLevel": 71, @@ -31902,6 +34421,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 75, "defenceLevel": 68, @@ -31919,6 +34439,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 75, "defenceLevel": 68, @@ -31936,6 +34457,7 @@ "hitpoints": 100, "combatLevel": 88, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 75, "defenceLevel": 68, @@ -31953,6 +34475,7 @@ "hitpoints": 120, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 90, "defenceLevel": 81, @@ -31965,6 +34488,7 @@ "hitpoints": 120, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 90, "defenceLevel": 81, @@ -31977,6 +34501,7 @@ "hitpoints": 120, "combatLevel": 104, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 76, "strengthLevel": 90, "defenceLevel": 81, @@ -31989,6 +34514,7 @@ "hitpoints": 200, "combatLevel": 188, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 165, "defenceLevel": 152, @@ -32001,6 +34527,7 @@ "hitpoints": 200, "combatLevel": 188, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 165, "defenceLevel": 152, @@ -32013,6 +34540,7 @@ "hitpoints": 200, "combatLevel": 188, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 145, "strengthLevel": 165, "defenceLevel": 152, @@ -32025,6 +34553,7 @@ "hitpoints": 150, "combatLevel": 136, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 120, "defenceLevel": 102, @@ -32036,6 +34565,7 @@ "hitpoints": 100, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 40, @@ -32051,6 +34581,7 @@ "hitpoints": 100, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 40, @@ -32066,6 +34597,7 @@ "hitpoints": 100, "combatLevel": 67, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 40, "strengthLevel": 60, "defenceLevel": 40, @@ -32081,6 +34613,7 @@ "hitpoints": 10, "combatLevel": 7, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 5, "strengthLevel": 5, "defenceLevel": 4, @@ -32095,6 +34628,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -32106,6 +34640,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -32117,6 +34652,7 @@ "hitpoints": 450, "combatLevel": 228, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 100, @@ -32131,6 +34667,7 @@ "hitpoints": 450, "combatLevel": 228, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 140, "strengthLevel": 140, "defenceLevel": 100, @@ -32145,6 +34682,7 @@ "hitpoints": 450, "combatLevel": 248, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 200, "strengthLevel": 140, "defenceLevel": 100, @@ -32156,6 +34694,7 @@ "hitpoints": 450, "combatLevel": 328, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 300, "strengthLevel": 250, "defenceLevel": 150, @@ -32167,6 +34706,7 @@ "hitpoints": 450, "combatLevel": 328, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 300, "strengthLevel": 250, "defenceLevel": 150, @@ -32178,6 +34718,7 @@ "hitpoints": 450, "combatLevel": 328, "slayerLevel": 75, + "attackSpeed": 6, "attackLevel": 300, "strengthLevel": 250, "defenceLevel": 150, @@ -32188,6 +34729,7 @@ "name": "Sand Snake (hard)", "hitpoints": 180, "combatLevel": 154, + "attackSpeed": 4, "attackLevel": 180, "strengthLevel": 140, "defenceLevel": 20, @@ -32198,6 +34740,7 @@ "name": "Sand Snake", "hitpoints": 60, "combatLevel": 36, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 20, "defenceLevel": 20, @@ -32208,6 +34751,7 @@ "name": "Sand Snake", "hitpoints": 60, "combatLevel": 36, + "attackSpeed": 4, "attackLevel": 30, "strengthLevel": 20, "defenceLevel": 20, @@ -32218,6 +34762,7 @@ "name": "Thief", "hitpoints": 22, "combatLevel": 21, + "attackSpeed": 4, "attackLevel": 14, "strengthLevel": 13, "defenceLevel": 12, @@ -32228,6 +34773,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -32238,6 +34784,7 @@ "name": "Woman", "hitpoints": 7, "combatLevel": 2, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 1, @@ -32249,6 +34796,7 @@ "hitpoints": 14, "combatLevel": 15, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 13, "strengthLevel": 14, "defenceLevel": 14, @@ -32272,6 +34820,7 @@ "hitpoints": 48, "combatLevel": 52, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 60, "strengthLevel": 40, "defenceLevel": 33, @@ -32289,6 +34838,7 @@ "hitpoints": 72, "combatLevel": 60, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 50, "defenceLevel": 41, @@ -32310,6 +34860,7 @@ "hitpoints": 110, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 60, "strengthLevel": 73, "defenceLevel": 49, @@ -32329,6 +34880,7 @@ "hitpoints": 80, "combatLevel": 90, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 76, "strengthLevel": 80, "defenceLevel": 80, @@ -32349,6 +34901,7 @@ "hitpoints": 80, "combatLevel": 98, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 83, "strengthLevel": 76, "defenceLevel": 80, @@ -32372,6 +34925,7 @@ "hitpoints": 105, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 99, "strengthLevel": 100, "defenceLevel": 60, @@ -32392,6 +34946,7 @@ "hitpoints": 140, "combatLevel": 120, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 93, "strengthLevel": 110, "defenceLevel": 80, @@ -32412,6 +34967,7 @@ "hitpoints": 143, "combatLevel": 126, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 100, "strengthLevel": 119, "defenceLevel": 80, @@ -32435,6 +34991,7 @@ "hitpoints": 155, "combatLevel": 135, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 106, "strengthLevel": 126, "defenceLevel": 87, @@ -32457,6 +35014,7 @@ "name": "Corsair Traitor (hard)", "hitpoints": 160, "combatLevel": 103, + "attackSpeed": 3, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -32467,6 +35025,7 @@ "name": "Corsair Traitor", "hitpoints": 55, "combatLevel": 35, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 30, @@ -32478,6 +35037,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -32494,6 +35054,7 @@ "name": "Ithoi the Navigator", "hitpoints": 55, "combatLevel": 35, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 30, @@ -32505,6 +35066,7 @@ "hitpoints": 82, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 82, @@ -32521,6 +35083,7 @@ "hitpoints": 82, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 70, "defenceLevel": 82, @@ -32537,6 +35100,7 @@ "hitpoints": 82, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 20, "defenceLevel": 82, @@ -32553,6 +35117,7 @@ "hitpoints": 82, "combatLevel": 82, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 20, "defenceLevel": 82, @@ -32569,6 +35134,7 @@ "hitpoints": 150, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 162, "strengthLevel": 162, "defenceLevel": 38, @@ -32585,6 +35151,7 @@ "hitpoints": 50, "combatLevel": 46, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 38, @@ -32601,6 +35168,7 @@ "hitpoints": 50, "combatLevel": 46, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 38, "strengthLevel": 38, "defenceLevel": 38, @@ -32616,6 +35184,7 @@ "name": "Rune dragon", "hitpoints": 330, "combatLevel": 380, + "attackSpeed": 4, "attackLevel": 284, "strengthLevel": 284, "defenceLevel": 276, @@ -32635,6 +35204,7 @@ "hitpoints": 295, "combatLevel": 338, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 280, "strengthLevel": 280, "defenceLevel": 272, @@ -32652,6 +35222,7 @@ "hitpoints": 330, "combatLevel": 380, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 284, "strengthLevel": 284, "defenceLevel": 276, @@ -32670,6 +35241,7 @@ "hitpoints": 80, "combatLevel": 83, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 70, "strengthLevel": 70, "defenceLevel": 70, @@ -32685,6 +35257,7 @@ "name": "Spawn", "hitpoints": 80, "combatLevel": 100, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 60, @@ -32704,6 +35277,7 @@ "name": "Robert the Strong", "hitpoints": 280, "combatLevel": 194, + "attackSpeed": 4, "defenceLevel": 140, "rangeLevel": 328, "magicLevel": 128, @@ -32721,6 +35295,7 @@ "hitpoints": 460, "combatLevel": 392, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 560, "strengthLevel": 268, "defenceLevel": 164, @@ -32742,6 +35317,7 @@ "hitpoints": 750, "combatLevel": 732, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 560, "strengthLevel": 308, "defenceLevel": 214, @@ -32763,6 +35339,7 @@ "hitpoints": 460, "combatLevel": 392, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 560, "strengthLevel": 268, "defenceLevel": 164, @@ -32784,6 +35361,7 @@ "hitpoints": 750, "combatLevel": 732, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 560, "strengthLevel": 308, "defenceLevel": 214, @@ -32804,6 +35382,7 @@ "name": "Zombified Spawn", "hitpoints": 8, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 80, "defenceLevel": 4, @@ -32824,6 +35403,7 @@ "name": "Zombified Spawn", "hitpoints": 38, "combatLevel": 64, + "attackSpeed": 4, "attackLevel": 82, "strengthLevel": 82, "defenceLevel": 6, @@ -32844,6 +35424,7 @@ "name": "Stone Guardian", "hitpoints": 62, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 150, "strengthLevel": 148, "defenceLevel": 138, @@ -32854,6 +35435,7 @@ "name": "Stone Guardian", "hitpoints": 62, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 138, @@ -32864,6 +35446,7 @@ "name": "Stone Guardian", "hitpoints": 62, "combatLevel": 124, + "attackSpeed": 5, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 138, @@ -32875,6 +35458,7 @@ "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 180, "defenceLevel": 62, @@ -32893,6 +35477,7 @@ "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 1, "defenceLevel": 62, @@ -32911,6 +35496,7 @@ "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 1, "defenceLevel": 62, @@ -32929,6 +35515,7 @@ "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 180, "defenceLevel": 62, @@ -32947,6 +35534,7 @@ "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 1, "defenceLevel": 62, @@ -32965,6 +35553,7 @@ "hitpoints": 54, "combatLevel": 132, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 160, "strengthLevel": 1, "defenceLevel": 62, @@ -32983,6 +35572,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -33000,6 +35590,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -33017,6 +35608,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -33034,6 +35626,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -33051,6 +35644,7 @@ "hitpoints": 140, "combatLevel": 152, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 130, "strengthLevel": 130, "defenceLevel": 130, @@ -33068,6 +35662,7 @@ "hitpoints": 165, "combatLevel": 189, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 165, "strengthLevel": 165, "defenceLevel": 165, @@ -33085,6 +35680,7 @@ "hitpoints": 175, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 168, "defenceLevel": 168, @@ -33103,6 +35699,7 @@ "hitpoints": 75, "combatLevel": 79, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 68, "strengthLevel": 68, "defenceLevel": 68, @@ -33120,6 +35717,7 @@ "hitpoints": 105, "combatLevel": 111, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 95, "strengthLevel": 95, "defenceLevel": 95, @@ -33137,6 +35735,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -33154,6 +35753,7 @@ "hitpoints": 190, "combatLevel": 227, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 200, "strengthLevel": 200, "defenceLevel": 200, @@ -33171,6 +35771,7 @@ "hitpoints": 210, "combatLevel": 246, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 215, "strengthLevel": 215, "defenceLevel": 215, @@ -33188,6 +35789,7 @@ "hitpoints": 285, "combatLevel": 289, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 310, "strengthLevel": 210, "defenceLevel": 198, @@ -33206,6 +35808,7 @@ "hitpoints": 254, "combatLevel": 304, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 268, "defenceLevel": 268, @@ -33224,6 +35827,7 @@ "hitpoints": 254, "combatLevel": 304, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 268, "strengthLevel": 268, "defenceLevel": 268, @@ -33242,6 +35846,7 @@ "hitpoints": 295, "combatLevel": 338, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 280, "strengthLevel": 280, "defenceLevel": 272, @@ -33259,6 +35864,7 @@ "hitpoints": 330, "combatLevel": 380, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 284, "strengthLevel": 284, "defenceLevel": 276, @@ -33277,6 +35883,7 @@ "hitpoints": 315, "combatLevel": 318, "slayerLevel": 77, + "attackSpeed": 4, "attackLevel": 330, "strengthLevel": 210, "defenceLevel": 258, @@ -33296,6 +35903,7 @@ "hitpoints": 315, "combatLevel": 318, "slayerLevel": 77, + "attackSpeed": 4, "attackLevel": 330, "strengthLevel": 210, "defenceLevel": 258, @@ -33314,6 +35922,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33337,6 +35946,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33360,6 +35970,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33383,6 +35994,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33406,6 +36018,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33430,6 +36043,7 @@ "hitpoints": 4, "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 47, "defenceLevel": 20, @@ -33451,6 +36065,7 @@ "hitpoints": 4, "combatLevel": 35, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 45, "strengthLevel": 47, "defenceLevel": 20, @@ -33471,6 +36086,7 @@ "name": "White Knight", "hitpoints": 52, "combatLevel": 36, + "attackSpeed": 7, "attackLevel": 27, "strengthLevel": 29, "defenceLevel": 21, @@ -33487,6 +36103,7 @@ "name": "Paladin", "hitpoints": 66, "combatLevel": 62, + "attackSpeed": 5, "attackLevel": 54, "strengthLevel": 54, "defenceLevel": 54, @@ -33503,6 +36120,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33526,6 +36144,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33549,6 +36168,7 @@ "name": "Galvek", "hitpoints": 1200, "combatLevel": 608, + "attackSpeed": 6, "attackLevel": 632, "strengthLevel": 268, "defenceLevel": 188, @@ -33572,6 +36192,7 @@ "name": "Growthling", "hitpoints": 10, "combatLevel": 37, + "attackSpeed": 4, "attackLevel": 40, "strengthLevel": 38, "defenceLevel": 40, @@ -33585,6 +36206,7 @@ "hitpoints": 115, "combatLevel": 128, "slayerLevel": 1, + "attackSpeed": 6, "attackLevel": 130, "strengthLevel": 100, "defenceLevel": 100, @@ -33597,6 +36219,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -33609,6 +36232,7 @@ "name": "Vanstrom Klause", "hitpoints": 155, "combatLevel": 169, + "attackSpeed": 8, "attackLevel": 150, "strengthLevel": 136, "defenceLevel": 150, @@ -33622,6 +36246,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33642,6 +36267,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33662,6 +36288,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33682,6 +36309,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33702,6 +36330,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33722,6 +36351,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 5, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33742,6 +36372,7 @@ "hitpoints": 400, "combatLevel": 233, "slayerLevel": 1, + "attackSpeed": 2, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 120, @@ -33762,6 +36393,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33773,6 +36405,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33784,6 +36417,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33795,6 +36429,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33806,6 +36441,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33817,6 +36453,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33828,6 +36465,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33839,6 +36477,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33850,6 +36489,7 @@ "hitpoints": 75, "combatLevel": 87, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 80, "strengthLevel": 75, "defenceLevel": 75, @@ -33860,6 +36500,7 @@ "name": "Abomination", "hitpoints": 200, "combatLevel": 149, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -33875,6 +36516,7 @@ "name": "Abomination", "hitpoints": 200, "combatLevel": 149, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -33890,6 +36532,7 @@ "name": "Abomination", "hitpoints": 200, "combatLevel": 149, + "attackSpeed": 5, "attackLevel": 110, "strengthLevel": 110, "defenceLevel": 110, @@ -33905,6 +36548,7 @@ "name": "Swamp Crab", "hitpoints": 75, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 50, @@ -33919,6 +36563,7 @@ "name": "Swamp Crab", "hitpoints": 75, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 50, @@ -33933,6 +36578,7 @@ "name": "Swampy log", "hitpoints": 75, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 50, @@ -33948,6 +36594,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33959,6 +36606,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33970,6 +36618,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33981,6 +36630,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -33992,6 +36642,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -34003,6 +36654,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -34014,6 +36666,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -34025,6 +36678,7 @@ "hitpoints": 90, "combatLevel": 105, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 105, "strengthLevel": 86, "defenceLevel": 85, @@ -34035,6 +36689,7 @@ "name": "Xarpus", "hitpoints": 5080, "combatLevel": 960, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 250, @@ -34046,6 +36701,7 @@ "name": "Xarpus", "hitpoints": 5080, "combatLevel": 960, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 250, @@ -34057,6 +36713,7 @@ "name": "Nylocas Ischyros", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34069,6 +36726,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34081,6 +36739,7 @@ "name": "Nylocas Hagios", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34093,6 +36752,7 @@ "name": "Nylocas Ischyros", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -34105,6 +36765,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -34117,6 +36778,7 @@ "name": "Nylocas Hagios", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -34129,6 +36791,7 @@ "name": "Nylocas Ischyros", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34141,6 +36804,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34153,6 +36817,7 @@ "name": "Nylocas Hagios", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34165,6 +36830,7 @@ "name": "Nylocas Ischyros", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -34177,6 +36843,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -34189,6 +36856,7 @@ "name": "Nylocas Hagios", "hitpoints": 22, "combatLevel": 260, + "attackSpeed": 3, "attackLevel": 250, "strengthLevel": 230, "defenceLevel": 20, @@ -34201,6 +36869,7 @@ "name": "Nylocas Vasilias", "hitpoints": 2500, "combatLevel": 800, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 350, "defenceLevel": 50, @@ -34215,6 +36884,7 @@ "name": "Nylocas Vasilias", "hitpoints": 2500, "combatLevel": 800, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 350, "defenceLevel": 50, @@ -34229,6 +36899,7 @@ "name": "Nylocas Vasilias", "hitpoints": 2500, "combatLevel": 800, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 350, "defenceLevel": 50, @@ -34243,6 +36914,7 @@ "name": "Pestilent Bloat", "hitpoints": 2000, "combatLevel": 870, + "attackSpeed": 1, "attackLevel": 250, "strengthLevel": 340, "defenceLevel": 100, @@ -34263,6 +36935,7 @@ "name": "The Maiden of Sugadinti", "hitpoints": 3500, "combatLevel": 940, + "attackSpeed": 10, "attackLevel": 350, "strengthLevel": 350, "defenceLevel": 200, @@ -34274,6 +36947,7 @@ "name": "The Maiden of Sugadinti", "hitpoints": 3500, "combatLevel": 940, + "attackSpeed": 10, "attackLevel": 350, "strengthLevel": 350, "defenceLevel": 200, @@ -34285,6 +36959,7 @@ "name": "The Maiden of Sugadinti", "hitpoints": 3500, "combatLevel": 940, + "attackSpeed": 10, "attackLevel": 350, "strengthLevel": 350, "defenceLevel": 200, @@ -34296,6 +36971,7 @@ "name": "The Maiden of Sugadinti", "hitpoints": 3500, "combatLevel": 940, + "attackSpeed": 10, "attackLevel": 350, "strengthLevel": 350, "defenceLevel": 200, @@ -34307,6 +36983,7 @@ "name": "Nylocas Matomenos", "hitpoints": 200, "combatLevel": 115, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34317,6 +36994,7 @@ "name": "Blood spawn", "hitpoints": 120, "combatLevel": 55, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "rangeLevel": 1 @@ -34325,6 +37003,7 @@ "name": "Verzik Vitur", "hitpoints": 2000, "combatLevel": 1040, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 20, @@ -34344,6 +37023,7 @@ "name": "Verzik Vitur", "hitpoints": 2000, "combatLevel": 1040, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 20, @@ -34363,6 +37043,7 @@ "name": "Verzik Vitur", "hitpoints": 2000, "combatLevel": 1040, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 20, @@ -34382,6 +37063,7 @@ "name": "Verzik Vitur", "hitpoints": 3250, "combatLevel": 1265, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 200, @@ -34401,6 +37083,7 @@ "name": "Verzik Vitur", "hitpoints": 3250, "combatLevel": 1265, + "attackSpeed": 4, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 200, @@ -34420,6 +37103,7 @@ "name": "Verzik Vitur", "hitpoints": 3250, "combatLevel": 1520, + "attackSpeed": 7, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 150, @@ -34441,6 +37125,7 @@ "name": "Verzik Vitur", "hitpoints": 3250, "combatLevel": 1520, + "attackSpeed": 7, "attackLevel": 400, "strengthLevel": 400, "defenceLevel": 150, @@ -34462,6 +37147,7 @@ "name": "Nylocas Ischyros", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34474,6 +37160,7 @@ "name": "Nylocas Toxobolos", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34486,6 +37173,7 @@ "name": "Nylocas Hagios", "hitpoints": 11, "combatLevel": 162, + "attackSpeed": 3, "attackLevel": 200, "strengthLevel": 160, "defenceLevel": 1, @@ -34498,6 +37186,7 @@ "name": "Nylocas Athanatos", "hitpoints": 180, "combatLevel": 350, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 50, @@ -34508,6 +37197,7 @@ "name": "Nylocas Matomenos", "hitpoints": 200, "combatLevel": 115, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34518,6 +37208,7 @@ "name": "Sotetseg", "hitpoints": 4000, "combatLevel": 995, + "attackSpeed": 5, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 200, @@ -34535,6 +37226,7 @@ "name": "Sotetseg", "hitpoints": 4000, "combatLevel": 995, + "attackSpeed": 5, "attackLevel": 250, "strengthLevel": 250, "defenceLevel": 200, @@ -34552,6 +37244,7 @@ "name": "Monk of Zamorak", "hitpoints": 20, "combatLevel": 22, + "attackSpeed": 4, "attackLevel": 18, "strengthLevel": 18, "defenceLevel": 22, @@ -34562,6 +37255,7 @@ "name": "Monk of Zamorak", "hitpoints": 10, "combatLevel": 17, + "attackSpeed": 4, "attackLevel": 8, "strengthLevel": 8, "defenceLevel": 12, @@ -34572,6 +37266,7 @@ "name": "Mother", "hitpoints": 235, "combatLevel": 198, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 170, @@ -34585,6 +37280,7 @@ "name": "Mother", "hitpoints": 235, "combatLevel": 198, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 170, @@ -34598,6 +37294,7 @@ "name": "Mother", "hitpoints": 235, "combatLevel": 198, + "attackSpeed": 4, "attackLevel": 150, "strengthLevel": 150, "defenceLevel": 170, @@ -34611,6 +37308,7 @@ "name": "Don't Know What", "hitpoints": 220, "combatLevel": 163, + "attackSpeed": 3, "attackLevel": 120, "strengthLevel": 90, "defenceLevel": 160, @@ -34624,6 +37322,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -34641,6 +37340,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -34658,6 +37358,7 @@ "hitpoints": 40, "combatLevel": 48, "slayerLevel": 1, + "attackSpeed": 7, "attackLevel": 40, "strengthLevel": 45, "defenceLevel": 45, @@ -34674,12 +37375,14 @@ "name": "Dwarf", "hitpoints": 16, "combatLevel": 10, - "slayerLevel": 1 + "slayerLevel": 1, + "attackSpeed": 5 }, "8512": { "name": "Tormented Soul", "hitpoints": 20, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 16, "strengthLevel": 12, "defenceLevel": 10, @@ -34690,6 +37393,7 @@ "name": "Tormented Soul", "hitpoints": 20, "combatLevel": 16, + "attackSpeed": 4, "attackLevel": 16, "strengthLevel": 12, "defenceLevel": 10, @@ -34700,6 +37404,7 @@ "name": "Trapped Soul", "hitpoints": 30, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 29, "defenceLevel": 20, @@ -34710,6 +37415,7 @@ "name": "Trapped Soul", "hitpoints": 30, "combatLevel": 30, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 29, "defenceLevel": 20, @@ -34720,6 +37426,7 @@ "name": "Trapped Soul (hard)", "hitpoints": 100, "combatLevel": 101, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 120, "defenceLevel": 20, @@ -34731,6 +37438,7 @@ "hitpoints": 60, "combatLevel": 62, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 53, "strengthLevel": 53, "defenceLevel": 52, @@ -34748,6 +37456,7 @@ "hitpoints": 60, "combatLevel": 73, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 65, "defenceLevel": 65, @@ -34765,6 +37474,7 @@ "hitpoints": 150, "combatLevel": 150, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 120, "strengthLevel": 120, "defenceLevel": 140, @@ -34782,6 +37492,7 @@ "name": "Swamp frog", "hitpoints": 25, "combatLevel": 24, + "attackSpeed": 4, "attackLevel": 25, "strengthLevel": 20, "defenceLevel": 15, @@ -34792,6 +37503,7 @@ "name": "Hespori", "hitpoints": 300, "combatLevel": 284, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 120, @@ -34814,6 +37526,7 @@ "hitpoints": 300, "combatLevel": 194, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 100, @@ -34830,6 +37543,7 @@ "hitpoints": 130, "combatLevel": 99, "slayerLevel": 62, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 60, "defenceLevel": 80, @@ -34849,6 +37563,7 @@ "hitpoints": 130, "combatLevel": 99, "slayerLevel": 62, + "attackSpeed": 4, "attackLevel": 85, "strengthLevel": 60, "defenceLevel": 80, @@ -34868,6 +37583,7 @@ "hitpoints": 250, "combatLevel": 192, "slayerLevel": 84, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 118, "defenceLevel": 120, @@ -34889,6 +37605,7 @@ "hitpoints": 250, "combatLevel": 192, "slayerLevel": 84, + "attackSpeed": 4, "attackLevel": 140, "strengthLevel": 118, "defenceLevel": 120, @@ -34910,6 +37627,7 @@ "hitpoints": 50, "combatLevel": 50, "slayerLevel": 44, + "attackSpeed": 4, "attackLevel": 50, "strengthLevel": 45, "defenceLevel": 30, @@ -34925,6 +37643,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34946,6 +37665,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34967,6 +37687,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -34988,6 +37709,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -35009,6 +37731,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -35030,6 +37753,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 6, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -35051,6 +37775,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -35072,6 +37797,7 @@ "hitpoints": 1100, "combatLevel": 426, "slayerLevel": 95, + "attackSpeed": 4, "attackLevel": 100, "strengthLevel": 100, "defenceLevel": 100, @@ -35092,6 +37818,7 @@ "name": "The Mimic", "hitpoints": 230, "combatLevel": 186, + "attackSpeed": 3, "attackLevel": 185, "strengthLevel": 120, "defenceLevel": 120, @@ -35110,6 +37837,7 @@ "name": "Third Age Warrior", "hitpoints": 40, "combatLevel": 83, + "attackSpeed": 5, "attackLevel": 90, "strengthLevel": 75, "defenceLevel": 80, @@ -35126,6 +37854,7 @@ "name": "Third Age Ranger", "hitpoints": 40, "combatLevel": 76, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -35143,6 +37872,7 @@ "name": "Third Age Mage", "hitpoints": 40, "combatLevel": 83, + "attackSpeed": 4, "attackLevel": 1, "strengthLevel": 1, "defenceLevel": 80, @@ -35160,6 +37890,7 @@ "hitpoints": 50, "combatLevel": 72, "slayerLevel": 1, + "attackSpeed": 4, "attackLevel": 65, "strengthLevel": 70, "defenceLevel": 65, @@ -35170,6 +37901,7 @@ "name": "Monk of Zamorak", "hitpoints": 16, "combatLevel": 23, + "attackSpeed": 4, "attackLevel": 15, "strengthLevel": 13, "defenceLevel": 18, diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java deleted file mode 100644 index b4a002b79d..0000000000 --- a/runelite-mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2018, SomeoneWithAnInternetConnection - * 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.mixins; - -import net.runelite.api.mixins.Inject; -import net.runelite.api.mixins.Mixin; -import net.runelite.rs.api.RSClient; -import net.runelite.rs.api.RSSoundEffect; - -@Mixin(RSClient.class) -public abstract class PlaySoundEffectMixin implements RSClient -{ - - @Inject - @Override - public void playSoundEffect(int id) - { - playSoundEffect(id, 0, 0, 0); - } - - @Inject - @Override - public void playSoundEffect(int id, int x, int y, int range) - { - int position = ((x & 255) << 16) + ((y & 255) << 8) + (range & 255); - - int[] queuedSoundEffectIDs = getQueuedSoundEffectIDs(); - int[] unknownSoundValues1 = getUnknownSoundValues1(); - int[] queuedSoundEffectDelays = getQueuedSoundEffectDelays(); - RSSoundEffect[] audioEffects = getAudioEffects(); - int[] soundLocations = getSoundLocations(); - int queuedSoundEffectCount = getQueuedSoundEffectCount(); - - queuedSoundEffectIDs[queuedSoundEffectCount] = id; - unknownSoundValues1[queuedSoundEffectCount] = 0; - queuedSoundEffectDelays[queuedSoundEffectCount] = 0; - audioEffects[queuedSoundEffectCount] = null; - soundLocations[queuedSoundEffectCount] = position; - - setQueuedSoundEffectCount(queuedSoundEffectCount + 1); - } -} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java index 7d34fbe72f..698e5e4733 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSBoundaryObjectMixin.java @@ -34,7 +34,7 @@ public abstract class RSBoundaryObjectMixin implements RSBoundaryObject } @Inject - private Model getModelA() + public Model getModelA() { Renderable renderable = getRenderable1(); if (renderable == null) @@ -53,7 +53,7 @@ public abstract class RSBoundaryObjectMixin implements RSBoundaryObject } @Inject - private Model getModelB() + public Model getModelB() { Renderable renderable = getRenderable2(); if (renderable == null) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 7608f6d635..069c9a99d4 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -310,14 +310,6 @@ public abstract class RSClientMixin implements RSClient return AccountType.NORMAL; } - @Inject - @Override - public void setMouseCanvasHoverPosition(final Point position) - { - setMouseCanvasHoverPositionX(position.getX()); - setMouseCanvasHoverPositionY(position.getY()); - } - @Inject @Override public Tile getSelectedSceneTile() diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java index fa25632e09..e1260cb83c 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSFloorDecorationMixin.java @@ -34,7 +34,8 @@ public abstract class RSFloorDecorationMixin implements RSFloorDecoration } @Inject - private Model getModel() + @Override + public Model getModel() { Renderable renderable = getRenderable(); if (renderable == null) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java index 42d4001b4f..da84118774 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameObjectMixin.java @@ -59,7 +59,8 @@ public abstract class RSGameObjectMixin implements RSGameObject } @Inject - private RSModel getModel() + @Override + public RSModel getModel() { RSEntity renderable = getRenderable(); if (renderable == null) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java index 820150dbef..a12da101db 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGroundItemPileMixin.java @@ -1,6 +1,8 @@ package net.runelite.mixins; import java.awt.geom.Area; +import net.runelite.api.Model; +import net.runelite.api.Renderable; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.rs.api.RSGroundItemPile; @@ -31,4 +33,64 @@ public abstract class RSGroundItemPileMixin implements RSGroundItemPile { throw new UnsupportedOperationException(); } + + @Inject + @Override + public Model getModelBottom() + { + Renderable renderable = getBottom(); + if (renderable == null) + { + return null; + } + + if (renderable instanceof Model) + { + return (Model) renderable; + } + else + { + return renderable.getModel(); + } + } + + @Inject + @Override + public Model getModelMiddle() + { + Renderable renderable = getMiddle(); + if (renderable == null) + { + return null; + } + + if (renderable instanceof Model) + { + return (Model) renderable; + } + else + { + return renderable.getModel(); + } + } + + @Inject + @Override + public Model getModelTop() + { + Renderable renderable = getTop(); + if (renderable == null) + { + return null; + } + + if (renderable instanceof Model) + { + return (Model) renderable; + } + else + { + return renderable.getModel(); + } + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java index 7c53cafa87..1c10eeb835 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSProjectileMixin.java @@ -27,6 +27,7 @@ package net.runelite.mixins; import net.runelite.api.Actor; import net.runelite.api.coords.LocalPoint; import net.runelite.api.events.ProjectileMoved; +import net.runelite.api.events.ProjectileSpawned; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; @@ -42,6 +43,14 @@ public abstract class RSProjectileMixin implements RSProjectile @Shadow("client") private static RSClient client; + @Inject + RSProjectileMixin() + { + final ProjectileSpawned projectileSpawned = new ProjectileSpawned(); + projectileSpawned.setProjectile(this); + client.getCallbacks().post(projectileSpawned); + } + @Inject @Override public int getRemainingCycles() 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 619795ef5c..9e883dd8b4 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSSceneMixin.java @@ -83,6 +83,16 @@ public abstract class RSSceneMixin implements RSScene } final boolean isGpu = client.isGpu(); + final boolean checkClick = client.isCheckClick(); + if (!client.isMenuOpen()) + { + // Force check click to update the selected tile + client.setCheckClick(true); + final int mouseX = client.getMouseX(); + final int mouseY = client.getMouseY(); + client.setMouseCanvasHoverPositionX(mouseX - client.getViewportXOffset()); + client.setMouseCanvasHoverPositionY(mouseY - client.getViewportYOffset()); + } if (!isGpu) { @@ -287,6 +297,10 @@ public abstract class RSSceneMixin implements RSScene if (client.getTileUpdateCount() == 0) { client.setCheckClick(false); + if (!checkClick) + { + client.setViewportWalking(false); + } client.getCallbacks().drawScene(); return; } @@ -354,6 +368,10 @@ public abstract class RSSceneMixin implements RSScene if (client.getTileUpdateCount() == 0) { client.setCheckClick(false); + if (!checkClick) + { + client.setViewportWalking(false); + } client.getCallbacks().drawScene(); return; } @@ -363,6 +381,12 @@ public abstract class RSSceneMixin implements RSScene } client.setCheckClick(false); + if (!checkClick) + { + // If checkClick was false, then the selected tile wouldn't have existed next tick, + // so clear viewport walking in order to prevent it triggering a walk + client.setViewportWalking(false); + } client.getCallbacks().drawScene(); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java index 890e1161e0..53dc51e9bb 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWallDecorationMixin.java @@ -37,7 +37,8 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration } @Inject - private RSModel getModel() + @Override + public RSModel getModel1() { RSEntity renderable = getRenderable(); if (renderable == null) @@ -60,7 +61,8 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration } @Inject - private RSModel getModel2() + @Override + public RSModel getModel2() { RSEntity renderable = getRenderable2(); if (renderable == null) @@ -89,7 +91,7 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration Area clickbox = new Area(); LocalPoint lp = getLocalLocation(); - Area clickboxA = Perspective.getClickbox(client, getModel(), 0, + Area clickboxA = Perspective.getClickbox(client, getModel1(), 0, new LocalPoint(lp.getX() + getXOffset(), lp.getY() + getYOffset())); Area clickboxB = Perspective.getClickbox(client, getModel2(), 0, lp); @@ -115,7 +117,7 @@ public abstract class RSWallDecorationMixin implements RSWallDecoration @Override public Polygon getConvexHull() { - RSModel model = getModel(); + RSModel model = getModel1(); if (model == null) { diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java new file mode 100644 index 0000000000..6338d07521 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/SoundEffectMixin.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * 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.mixins; + +import net.runelite.api.SoundEffectVolume; +import net.runelite.api.events.AreaSoundEffectPlayed; +import net.runelite.api.events.SoundEffectPlayed; +import net.runelite.api.mixins.FieldHook; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSRawPcmStream; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSRawSound; +import net.runelite.rs.api.RSSoundEffect; +import net.runelite.rs.api.RSPcmStream; + +@Mixin(RSClient.class) +public abstract class SoundEffectMixin implements RSClient +{ + @Shadow("client") + private static RSClient client; + + @Inject + private static int lastSoundEffectCount; + + @Inject + @Override + public void playSoundEffect(int id) + { + playSoundEffect(id, 0, 0, 0, 0); + } + + @Inject + @Override + public void playSoundEffect(int id, int x, int y, int range) + { + playSoundEffect(id, x, y, range, 0); + } + + @Inject + @Override + public void playSoundEffect(int id, int x, int y, int range, int delay) + { + int position = ((x & 255) << 16) + ((y & 255) << 8) + (range & 255); + + int[] queuedSoundEffectIDs = getQueuedSoundEffectIDs(); + int[] queuedSoundEffectLoops = getQueuedSoundEffectLoops(); + int[] queuedSoundEffectDelays = getQueuedSoundEffectDelays(); + RSSoundEffect[] audioEffects = getAudioEffects(); + int[] soundLocations = getSoundLocations(); + int queuedSoundEffectCount = getQueuedSoundEffectCount(); + + queuedSoundEffectIDs[queuedSoundEffectCount] = id; + queuedSoundEffectLoops[queuedSoundEffectCount] = 1; + queuedSoundEffectDelays[queuedSoundEffectCount] = delay; + audioEffects[queuedSoundEffectCount] = null; + soundLocations[queuedSoundEffectCount] = position; + + setQueuedSoundEffectCount(queuedSoundEffectCount + 1); + } + + @Inject + @Override + public void playSoundEffect(int id, int volume) + { + RSSoundEffect soundEffect = getTrack(getIndexCache4(), id, 0); + if (soundEffect == null) + { + return; + } + + // If the current volume is not muted, use it instead + final int soundEffectVolume = getSoundEffectVolume(); + if (soundEffectVolume != SoundEffectVolume.MUTED) + { + volume = soundEffectVolume; + } + + RSRawSound rawAudioNode = soundEffect.toRawAudioNode().applyResampler(getSoundEffectResampler()); + RSRawPcmStream rawPcmStream = createRawPcmStream(rawAudioNode, 100, volume); + rawPcmStream.setNumLoops(1); + + getSoundEffectAudioQueue().addSubStream((RSPcmStream) rawPcmStream); + } + + @FieldHook("soundEffectCount") + @Inject + public static void queuedSoundEffectCountChanged(int idx) + { + int soundCount = client.getQueuedSoundEffectCount(); + if (soundCount == lastSoundEffectCount + 1) + { + int soundIndex = soundCount - 1; + int packedLocation = client.getSoundLocations()[soundIndex]; + + if (packedLocation == 0) + { + // Regular sound effect + + SoundEffectPlayed event = new SoundEffectPlayed(); + event.setSoundId(client.getQueuedSoundEffectIDs()[soundIndex]); + event.setDelay(client.getQueuedSoundEffectDelays()[soundIndex]); + client.getCallbacks().post(event); + } + else + { + // Area sound effect + + int x = (packedLocation >> 16) & 0xFF; + int y = (packedLocation >> 8) & 0xFF; + int range = (packedLocation) & 0xFF; + + AreaSoundEffectPlayed event = new AreaSoundEffectPlayed(); + event.setSoundId(client.getQueuedSoundEffectIDs()[soundIndex]); + event.setSceneX(x); + event.setSceneY(y); + event.setRange(range); + event.setDelay(client.getQueuedSoundEffectDelays()[soundIndex]); + client.getCallbacks().post(event); + } + } + + lastSoundEffectCount = soundCount; + } +} 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 e2c5735923..d33785c9e7 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 @@ -147,7 +147,6 @@ public interface RSClient extends RSGameShell, Client void setGameState(int gameState); @Import("checkClick") - @Override void setCheckClick(boolean checkClick); @Import("Scene_selectedScreenX") @@ -563,8 +562,8 @@ public interface RSClient extends RSGameShell, Client @Import("soundLocations") int[] getSoundLocations(); - @Import("unknownSoundValues1") - int[] getUnknownSoundValues1(); + @Import("queuedSoundEffectLoops") + int[] getQueuedSoundEffectLoops(); @Import("queuedSoundEffectDelays") int[] getQueuedSoundEffectDelays(); @@ -575,6 +574,9 @@ public interface RSClient extends RSGameShell, Client @Import("soundEffectCount") void setQueuedSoundEffectCount(int queuedSoundEffectCount); + @Import("queueSoundEffect") + void queueSoundEffect(int id, int numLoops, int delay); + @Import("rasterProvider") @Override RSAbstractRasterProvider getBufferProvider(); @@ -1005,11 +1007,31 @@ public interface RSClient extends RSGameShell, Client @Import("mouseRecorder") RSMouseRecorder getMouseRecorder(); - + @Import("selectedSpellName") String getSelectedSpellName(); - + @Import("isSpellSelected") boolean getIsSpellSelected(); + @Import("readSoundEffect") + RSSoundEffect getTrack(RSAbstractIndexCache indexData, int id, int var0); + + @Import("createRawPcmStream") + RSRawPcmStream createRawPcmStream(RSRawSound audioNode, int var0, int volume); + + @Import("pcmStreamMixer") + RSPcmStreamMixer getSoundEffectAudioQueue(); + + @Import("indexCache4") + RSAbstractIndexCache getIndexCache4(); + + @Import("decimator") + RSDecimator getSoundEffectResampler(); + + @Import("soundEffectVolume") + int getSoundEffectVolume(); + + @Import("viewportWalking") + void setViewportWalking(boolean viewportWalking); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSDecimator.java b/runescape-api/src/main/java/net/runelite/rs/api/RSDecimator.java new file mode 100644 index 0000000000..401b20c13f --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSDecimator.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018, trimbe + * 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.rs.api; + +public interface RSDecimator +{ +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java index 068cce5e3f..9d5d9bed74 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGameObject.java @@ -35,6 +35,7 @@ public interface RSGameObject extends GameObject int getHeight(); @Import("orientation") + @Override int getRsOrientation(); @Import("tag") diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStream.java b/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStream.java new file mode 100644 index 0000000000..0c5e118782 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStream.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018, trimbe + * 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.rs.api; + +public interface RSPcmStream +{ +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStreamMixer.java b/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStreamMixer.java new file mode 100644 index 0000000000..8ae48313be --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSPcmStreamMixer.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, trimbe + * 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.rs.api; + +import net.runelite.mapping.Import; + +public interface RSPcmStreamMixer +{ + @Import("addSubStream") + void addSubStream(RSPcmStream taskDataNode); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRawPcmStream.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRawPcmStream.java new file mode 100644 index 0000000000..0677551901 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRawPcmStream.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, trimbe + * 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.rs.api; + +import net.runelite.mapping.Import; + +public interface RSRawPcmStream +{ + @Import("setNumLoops") + void setNumLoops(int numLoops); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSRawSound.java b/runescape-api/src/main/java/net/runelite/rs/api/RSRawSound.java new file mode 100644 index 0000000000..0f64b67d2d --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSRawSound.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, trimbe + * 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.rs.api; + +import net.runelite.mapping.Import; + +public interface RSRawSound +{ + @Import("resample") + RSRawSound applyResampler(RSDecimator resampler); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java index 027828e79a..cb93c6fd70 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java @@ -1,5 +1,33 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * 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.rs.api; +import net.runelite.mapping.Import; + public interface RSSoundEffect { + @Import("toRawSound") + RSRawSound toRawAudioNode(); } diff --git a/runescape-client/src/main/java/AbstractByteArrayCopier.java b/runescape-client/src/main/java/AbstractByteArrayCopier.java index 43726e2638..f87ef77718 100644 --- a/runescape-client/src/main/java/AbstractByteArrayCopier.java +++ b/runescape-client/src/main/java/AbstractByteArrayCopier.java @@ -13,7 +13,6 @@ public abstract class AbstractByteArrayCopier { @ObfuscatedSignature( signature = "Lit;" ) - @Export("__gu_et") static IndexCache __gu_et; static { @@ -41,6 +40,7 @@ public abstract class AbstractByteArrayCopier { signature = "(II)Liw;", garbageValue = "1102198559" ) + @Export("getVarcInt") public static VarcInt getVarcInt(int var0) { VarcInt var1 = (VarcInt)VarcInt.cachedVarcInts.get((long)var0); if(var1 != null) { @@ -62,6 +62,7 @@ public abstract class AbstractByteArrayCopier { signature = "(II)V", garbageValue = "-1941491045" ) + @Export("unloadWidgetGroup") public static void unloadWidgetGroup(int var0) { if(var0 != -1) { if(Widget.loadedWidgetGroups[var0]) { diff --git a/runescape-client/src/main/java/AbstractIndexCache.java b/runescape-client/src/main/java/AbstractIndexCache.java index bfd06c03eb..22249e8e50 100644 --- a/runescape-client/src/main/java/AbstractIndexCache.java +++ b/runescape-client/src/main/java/AbstractIndexCache.java @@ -24,7 +24,6 @@ public abstract class AbstractIndexCache { @ObfuscatedGetter( intValue = -244224193 ) - @Export("__ir_s") static int __ir_s; @ObfuscatedName("au") @Export("garbageCollector") @@ -33,7 +32,6 @@ public abstract class AbstractIndexCache { @ObfuscatedGetter( intValue = 334735939 ) - @Export("__ir_bu") static int __ir_bu; @ObfuscatedName("di") @ObfuscatedSignature( @@ -247,7 +245,6 @@ public abstract class AbstractIndexCache { signature = "(II)V", garbageValue = "2102142648" ) - @Export("__f_392") void __f_392(int var1) { } @@ -317,7 +314,6 @@ public abstract class AbstractIndexCache { signature = "(II)Z", garbageValue = "-1923759754" ) - @Export("__u_393") public boolean __u_393(int var1) { if(this.records.length == 1) { return this.tryLoadRecord(0, var1); @@ -348,7 +344,6 @@ public abstract class AbstractIndexCache { signature = "(I)Z", garbageValue = "1694975256" ) - @Export("__l_394") public boolean __l_394() { boolean var1 = true; @@ -447,7 +442,6 @@ public abstract class AbstractIndexCache { signature = "(IB)[I", garbageValue = "28" ) - @Export("__j_395") public int[] __j_395(int var1) { return var1 >= 0 && var1 < this.recordIds.length?this.recordIds[var1]:null; } @@ -457,7 +451,6 @@ public abstract class AbstractIndexCache { signature = "(II)I", garbageValue = "1178362496" ) - @Export("__s_396") public int __s_396(int var1) { return this.records[var1].length; } @@ -467,7 +460,6 @@ public abstract class AbstractIndexCache { signature = "(I)I", garbageValue = "1702434573" ) - @Export("__t_397") public int __t_397() { return this.records.length; } @@ -477,7 +469,6 @@ public abstract class AbstractIndexCache { signature = "(B)V", garbageValue = "38" ) - @Export("__y_398") public void __y_398() { for(int var1 = 0; var1 < this.archives.length; ++var1) { this.archives[var1] = null; @@ -490,7 +481,6 @@ public abstract class AbstractIndexCache { signature = "(II)V", garbageValue = "330258899" ) - @Export("__h_399") public void __h_399(int var1) { for(int var2 = 0; var2 < this.records[var1].length; ++var2) { this.records[var1][var2] = null; @@ -503,7 +493,6 @@ public abstract class AbstractIndexCache { signature = "(I)V", garbageValue = "-709581639" ) - @Export("__b_400") public void __b_400() { for(int var1 = 0; var1 < this.records.length; ++var1) { if(this.records[var1] != null) { @@ -640,7 +629,6 @@ public abstract class AbstractIndexCache { signature = "(Ljava/lang/String;Ljava/lang/String;B)Z", garbageValue = "68" ) - @Export("__ag_401") public boolean __ag_401(String var1, String var2) { var1 = var1.toLowerCase(); var2 = var2.toLowerCase(); @@ -698,7 +686,6 @@ public abstract class AbstractIndexCache { signature = "(Ljava/lang/String;B)V", garbageValue = "40" ) - @Export("__ar_402") public void __ar_402(String var1) { var1 = var1.toLowerCase(); int var2 = this.archiveNameHashTable.get(Client.hashString(var1)); diff --git a/runescape-client/src/main/java/AbstractUserComparator.java b/runescape-client/src/main/java/AbstractUserComparator.java index 2dae4f18da..2ce70ecb9b 100644 --- a/runescape-client/src/main/java/AbstractUserComparator.java +++ b/runescape-client/src/main/java/AbstractUserComparator.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("AbstractUserComparator") public abstract class AbstractUserComparator implements Comparator { @ObfuscatedName("f") - @Export("__f") Comparator __f; @ObfuscatedName("e") @@ -16,7 +15,6 @@ public abstract class AbstractUserComparator implements Comparator { signature = "(Ljava/util/Comparator;B)V", garbageValue = "-2" ) - @Export("__e_460") final void __e_460(Comparator var1) { if(this.__f == null) { this.__f = var1; @@ -31,12 +29,10 @@ public abstract class AbstractUserComparator implements Comparator { signature = "(Ljs;Ljs;I)I", garbageValue = "-962181316" ) - @Export("__x_461") protected final int __x_461(User var1, User var2) { return this.__f == null?0:this.__f.compare(var1, var2); } - @Export("__equals_462") @ObfuscatedName("equals") public boolean __equals_462(Object var1) { return super.equals(var1); diff --git a/runescape-client/src/main/java/AbstractWorldMapIcon.java b/runescape-client/src/main/java/AbstractWorldMapIcon.java index c487caa190..f98c6c3107 100644 --- a/runescape-client/src/main/java/AbstractWorldMapIcon.java +++ b/runescape-client/src/main/java/AbstractWorldMapIcon.java @@ -11,7 +11,6 @@ public abstract class AbstractWorldMapIcon { @ObfuscatedGetter( intValue = -1942470229 ) - @Export("__ak_qj") static int __ak_qj; @ObfuscatedName("ka") @ObfuscatedGetter( @@ -35,13 +34,11 @@ public abstract class AbstractWorldMapIcon { @ObfuscatedGetter( intValue = -521086143 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -1065362217 ) - @Export("__x") int __x; @ObfuscatedSignature( @@ -85,7 +82,6 @@ public abstract class AbstractWorldMapIcon { signature = "(IIB)Z", garbageValue = "-63" ) - @Export("__y_66") boolean __y_66(int var1, int var2) { return this.__b_68(var1, var2)?true:this.__c_69(var1, var2); } @@ -95,7 +91,6 @@ public abstract class AbstractWorldMapIcon { signature = "(I)Z", garbageValue = "1150380891" ) - @Export("__h_67") boolean __h_67() { return this.__m_15() >= 0; } @@ -105,7 +100,6 @@ public abstract class AbstractWorldMapIcon { signature = "(III)Z", garbageValue = "484201257" ) - @Export("__b_68") boolean __b_68(int var1, int var2) { if(!this.__h_67()) { return false; @@ -157,7 +151,6 @@ public abstract class AbstractWorldMapIcon { signature = "(III)Z", garbageValue = "1201712205" ) - @Export("__c_69") boolean __c_69(int var1, int var2) { WorldMapLabel var3 = this.__f_16(); return var3 == null?false:(var1 >= this.__e - var3.width / 2 && var1 <= var3.width / 2 + this.__e?var2 >= this.__x && var2 <= var3.height + this.__x:false); diff --git a/runescape-client/src/main/java/AccessFile.java b/runescape-client/src/main/java/AccessFile.java index 304b83c20f..cf25c7a265 100644 --- a/runescape-client/src/main/java/AccessFile.java +++ b/runescape-client/src/main/java/AccessFile.java @@ -16,13 +16,11 @@ public final class AccessFile { @ObfuscatedGetter( intValue = -1762891465 ) - @Export("__dk_o") static int __dk_o; @ObfuscatedName("lm") @ObfuscatedSignature( signature = "Lho;" ) - @Export("__dk_lm") static Widget __dk_lm; @ObfuscatedName("m") @Export("file") @@ -142,7 +140,6 @@ public final class AccessFile { return var4; } - @Export("__finalize_211") @ObfuscatedName("finalize") protected void __finalize_211() throws Throwable { if(this.file != null) { @@ -157,6 +154,7 @@ public final class AccessFile { signature = "(Lho;Ljv;IIZI)V", garbageValue = "-728558316" ) + @Export("addWidgetItemMenuItem") static final void addWidgetItemMenuItem(Widget widget, ItemDefinition definition, int var2, int actionIndex, boolean shiftClick) { String[] var5 = definition.inventoryActions; byte opcode = -1; diff --git a/runescape-client/src/main/java/Actor.java b/runescape-client/src/main/java/Actor.java index 2deeb4ef84..ecd96ba288 100644 --- a/runescape-client/src/main/java/Actor.java +++ b/runescape-client/src/main/java/Actor.java @@ -23,10 +23,8 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 1439711403 ) - @Export("__ac") int __ac; @ObfuscatedName("ay") - @Export("__ay") boolean __ay; @ObfuscatedName("ah") @ObfuscatedGetter( @@ -95,7 +93,6 @@ public abstract class Actor extends Entity { @Export("isAutoChatting") boolean isAutoChatting; @ObfuscatedName("az") - @Export("__az") boolean __az; @ObfuscatedName("au") @ObfuscatedGetter( @@ -152,7 +149,6 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 139384875 ) - @Export("__bc") int __bc; @ObfuscatedName("bo") @ObfuscatedGetter( @@ -200,7 +196,6 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = -1523249259 ) - @Export("__bj") int __bj; @ObfuscatedName("bi") @ObfuscatedGetter( @@ -224,7 +219,6 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 886371765 ) - @Export("__bt") int __bt; @ObfuscatedName("bp") @ObfuscatedGetter( @@ -236,43 +230,36 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 2121599561 ) - @Export("__bf") int __bf; @ObfuscatedName("bh") @ObfuscatedGetter( intValue = 280591281 ) - @Export("__bh") int __bh; @ObfuscatedName("be") @ObfuscatedGetter( intValue = 837989037 ) - @Export("__be") int __be; @ObfuscatedName("bv") @ObfuscatedGetter( intValue = -1857513783 ) - @Export("__bv") int __bv; @ObfuscatedName("bw") @ObfuscatedGetter( intValue = -1630403001 ) - @Export("__bw") int __bw; @ObfuscatedName("cr") @ObfuscatedGetter( intValue = 1367256299 ) - @Export("__cr") int __cr; @ObfuscatedName("cv") @ObfuscatedGetter( intValue = -1723834619 ) - @Export("__cv") int __cv; @ObfuscatedName("ce") @ObfuscatedGetter( @@ -296,13 +283,11 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = 1252341007 ) - @Export("__cm") int __cm; @ObfuscatedName("cj") @ObfuscatedGetter( intValue = -336931157 ) - @Export("__cj") int __cj; @ObfuscatedName("cu") @ObfuscatedGetter( @@ -323,13 +308,11 @@ public abstract class Actor extends Entity { @ObfuscatedGetter( intValue = -1583514013 ) - @Export("__cq") int __cq; @ObfuscatedName("ch") @ObfuscatedGetter( intValue = 1584102533 ) - @Export("__ch") int __ch; Actor() { @@ -386,6 +369,7 @@ public abstract class Actor extends Entity { signature = "(B)Z", garbageValue = "1" ) + @Export("isVisible") boolean isVisible() { return false; } @@ -395,7 +379,6 @@ public abstract class Actor extends Entity { signature = "(I)V", garbageValue = "1415393262" ) - @Export("__bb_143") final void __bb_143() { this.pathLength = 0; this.__ch = 0; @@ -583,343 +566,343 @@ public abstract class Actor extends Entity { garbageValue = "493234011" ) @Export("menuAction") - static final void menuAction(int var0, int var1, int var2, int var3, String var4, String var5, int var6, int var7) { - if(var2 >= 2000) { - var2 -= 2000; + static final void menuAction(int arg1, int arg2, int opcode, int arg0, String action, String target, int mouseX, int mouseY) { + if(opcode >= 2000) { + opcode -= 2000; } PacketBufferNode var8; - if(var2 == 1) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_an, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(GraphicsObject.baseY + var1); + var8.packetBuffer.__bx_323(GraphicsObject.baseY + arg2); var8.packetBuffer.writeShortLE(HealthBarDefinition.selectedItemSlot); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var8.packetBuffer.writeIntLE(ServerPacket.selectedItemWidget); - var8.packetBuffer.__bx_323(var0 + class50.baseX); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.__bx_323(arg1 + class50.baseX); + var8.packetBuffer.writeShort(arg0); var8.packetBuffer.writeShortLE(MenuAction.selectedItemId); Client.packetWriter.__q_167(var8); - } else if(var2 == 2) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 2) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_cg, Client.packetWriter.isaacCipher); var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.writeShort(var0 + class50.baseX); - var8.packetBuffer.__bo_322(var3); + var8.packetBuffer.writeShort(arg1 + class50.baseX); + var8.packetBuffer.__bo_322(arg0); var8.packetBuffer.writeIntLE16(ServerBuild.__iy_lo); var8.packetBuffer.writeShort(Client.__client_lc); - var8.packetBuffer.writeShortLE(GraphicsObject.baseY + var1); + var8.packetBuffer.writeShortLE(GraphicsObject.baseY + arg2); Client.packetWriter.__q_167(var8); - } else if(var2 == 3) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 3) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_d, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(GraphicsObject.baseY + var1); + var8.packetBuffer.writeShort(GraphicsObject.baseY + arg2); var8.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.__bo_322(var3); - var8.packetBuffer.__bx_323(var0 + class50.baseX); + var8.packetBuffer.__bo_322(arg0); + var8.packetBuffer.__bx_323(arg1 + class50.baseX); Client.packetWriter.__q_167(var8); - } else if(var2 == 4) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 4) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_cv, Client.packetWriter.isaacCipher); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.writeShort(var3); - var8.packetBuffer.writeShort(GraphicsObject.baseY + var1); - var8.packetBuffer.writeShort(var0 + class50.baseX); + var8.packetBuffer.writeShort(arg0); + var8.packetBuffer.writeShort(GraphicsObject.baseY + arg2); + var8.packetBuffer.writeShort(arg1 + class50.baseX); Client.packetWriter.__q_167(var8); - } else if(var2 == 5) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 5) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_cq, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(var0 + class50.baseX); - var8.packetBuffer.__bo_322(var3); - var8.packetBuffer.__bx_323(GraphicsObject.baseY + var1); + var8.packetBuffer.__bx_323(arg1 + class50.baseX); + var8.packetBuffer.__bo_322(arg0); + var8.packetBuffer.__bx_323(GraphicsObject.baseY + arg2); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var8); - } else if(var2 == 6) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 6) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_w, Client.packetWriter.isaacCipher); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.__bo_322(GraphicsObject.baseY + var1); - var8.packetBuffer.__bo_322(var0 + class50.baseX); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.__bo_322(GraphicsObject.baseY + arg2); + var8.packetBuffer.__bo_322(arg1 + class50.baseX); + var8.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var8); } else { PacketBufferNode var9; Npc var13; - if(var2 == 7) { - var13 = Client.npcs[var3]; + if(opcode == 7) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_r, Client.packetWriter.isaacCipher); var9.packetBuffer.__bx_323(MenuAction.selectedItemId); var9.packetBuffer.writeShort(HealthBarDefinition.selectedItemSlot); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var9.packetBuffer.writeInt(ServerPacket.selectedItemWidget); Client.packetWriter.__q_167(var9); } - } else if(var2 == 8) { - var13 = Client.npcs[var3]; + } else if(opcode == 8) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_cb, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var9.packetBuffer.writeIntLE(ServerBuild.__iy_lo); var9.packetBuffer.__bo_322(Client.__client_lc); Client.packetWriter.__q_167(var9); } - } else if(var2 == 9) { - var13 = Client.npcs[var3]; + } else if(opcode == 9) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_bt, Client.packetWriter.isaacCipher); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 10) { - var13 = Client.npcs[var3]; + } else if(opcode == 10) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_f, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 11) { - var13 = Client.npcs[var3]; + } else if(opcode == 11) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_ah, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 12) { - var13 = Client.npcs[var3]; + } else if(opcode == 12) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_bc, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShort(arg0); var9.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 13) { - var13 = Client.npcs[var3]; + } else if(opcode == 13) { + var13 = Client.npcs[arg0]; if(var13 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_ac, Client.packetWriter.isaacCipher); var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var9); } } else { Player var15; - if(var2 == 14) { - var15 = Client.players[var3]; + if(opcode == 14) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_cy, Client.packetWriter.isaacCipher); var9.packetBuffer.__bx_323(HealthBarDefinition.selectedItemSlot); var9.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var9.packetBuffer.writeIntME(ServerPacket.selectedItemWidget); - var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShort(arg0); var9.packetBuffer.writeShort(MenuAction.selectedItemId); Client.packetWriter.__q_167(var9); } - } else if(var2 == 15) { - var15 = Client.players[var3]; + } else if(opcode == 15) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_bq, Client.packetWriter.isaacCipher); var9.packetBuffer.writeIntLE16(ServerBuild.__iy_lo); var9.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var9.packetBuffer.__bo_322(Client.__client_lc); - var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShort(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 16) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 16) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_t, Client.packetWriter.isaacCipher); var8.packetBuffer.writeIntME(ServerPacket.selectedItemWidget); var8.packetBuffer.__bx_323(MenuAction.selectedItemId); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); var8.packetBuffer.writeShortLE(HealthBarDefinition.selectedItemSlot); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.__bx_323(var0 + class50.baseX); - var8.packetBuffer.writeShortLE(GraphicsObject.baseY + var1); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.__bx_323(arg1 + class50.baseX); + var8.packetBuffer.writeShortLE(GraphicsObject.baseY + arg2); Client.packetWriter.__q_167(var8); - } else if(var2 == 17) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 17) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_bb, Client.packetWriter.isaacCipher); var8.packetBuffer.writeIntME(ServerBuild.__iy_lo); var8.packetBuffer.writeShort(Client.__client_lc); - var8.packetBuffer.__bo_322(GraphicsObject.baseY + var1); - var8.packetBuffer.__bo_322(var0 + class50.baseX); + var8.packetBuffer.__bo_322(GraphicsObject.baseY + arg2); + var8.packetBuffer.__bo_322(arg1 + class50.baseX); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var8); - } else if(var2 == 18) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 18) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_u, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(GraphicsObject.baseY + var1); - var8.packetBuffer.writeShortLE(var3); - var8.packetBuffer.writeShortLE(var0 + class50.baseX); + var8.packetBuffer.__bx_323(GraphicsObject.baseY + arg2); + var8.packetBuffer.writeShortLE(arg0); + var8.packetBuffer.writeShortLE(arg1 + class50.baseX); var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var8); - } else if(var2 == 19) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 19) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_bh, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.__bo_322(var0 + class50.baseX); - var8.packetBuffer.writeShort(GraphicsObject.baseY + var1); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.__bo_322(arg1 + class50.baseX); + var8.packetBuffer.writeShort(GraphicsObject.baseY + arg2); var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var8); - } else if(var2 == 20) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 20) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_g, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(GraphicsObject.baseY + var1); + var8.packetBuffer.writeShortLE(GraphicsObject.baseY + arg2); var8.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.writeShortLE(var0 + class50.baseX); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeShortLE(arg1 + class50.baseX); + var8.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var8); - } else if(var2 == 21) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 21) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_av, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bo_322(GraphicsObject.baseY + var1); - var8.packetBuffer.writeShortLE(var3); - var8.packetBuffer.writeShort(var0 + class50.baseX); + var8.packetBuffer.__bo_322(GraphicsObject.baseY + arg2); + var8.packetBuffer.writeShortLE(arg0); + var8.packetBuffer.writeShort(arg1 + class50.baseX); var8.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var8); - } else if(var2 == 22) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + } else if(opcode == 22) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_ai, Client.packetWriter.isaacCipher); var8.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.__bo_322(GraphicsObject.baseY + var1); - var8.packetBuffer.writeShort(var0 + class50.baseX); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.__bo_322(GraphicsObject.baseY + arg2); + var8.packetBuffer.writeShort(arg1 + class50.baseX); Client.packetWriter.__q_167(var8); - } else if(var2 == 23) { + } else if(opcode == 23) { if(Client.isMenuOpen) { class65.scene.__as_250(); } else { - class65.scene.menuOpen(SoundSystem.plane, var0, var1, true); + class65.scene.menuOpen(SoundSystem.plane, arg1, arg2, true); } } else { PacketBufferNode var10; Widget var16; - if(var2 == 24) { - var16 = Huffman.getWidget(var1); + if(opcode == 24) { + var16 = Huffman.getWidget(arg2); boolean var12 = true; if(var16.contentType > 0) { var12 = ViewportMouse.method2957(var16); @@ -927,15 +910,15 @@ public abstract class Actor extends Entity { if(var12) { var10 = Interpreter.method1915(ClientPacket.__gs_bz, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); + var10.packetBuffer.writeInt(arg2); Client.packetWriter.__q_167(var10); } } else { - if(var2 == 25) { - var16 = class204.getWidgetChild(var1, var0); + if(opcode == 25) { + var16 = class204.getWidgetChild(arg2, arg1); if(var16 != null) { Player.method1281(); - class25.method350(var1, var0, class211.method4107(class1.getWidgetClickMask(var16)), var16.itemId); + class25.method350(arg2, arg1, class211.method4107(class1.getWidgetClickMask(var16)), var16.itemId); Client.isItemSelected = 0; Client.selectedSpellActionName = class198.method3745(var16); if(Client.selectedSpellActionName == null) { @@ -952,26 +935,26 @@ public abstract class Actor extends Entity { return; } - if(var2 == 26) { + if(opcode == 26) { WorldMapLabelSize.method198(); } else { int var11; Widget var14; - if(var2 == 28) { + if(opcode == 28) { var8 = Interpreter.method1915(ClientPacket.__gs_bz, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(var1); + var8.packetBuffer.writeInt(arg2); Client.packetWriter.__q_167(var8); - var14 = Huffman.getWidget(var1); + var14 = Huffman.getWidget(arg2); if(var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { var11 = var14.cs1Instructions[0][1]; Varps.Varps_main[var11] = 1 - Varps.Varps_main[var11]; IndexCache.method4703(var11); } - } else if(var2 == 29) { + } else if(opcode == 29) { var8 = Interpreter.method1915(ClientPacket.__gs_bz, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(var1); + var8.packetBuffer.writeInt(arg2); Client.packetWriter.__q_167(var8); - var14 = Huffman.getWidget(var1); + var14 = Huffman.getWidget(arg2); if(var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { var11 = var14.cs1Instructions[0][1]; if(Varps.Varps_main[var11] != var14.cs1ComparisonValues[0]) { @@ -979,90 +962,90 @@ public abstract class Actor extends Entity { IndexCache.method4703(var11); } } - } else if(var2 == 30) { + } else if(opcode == 30) { if(Client.__client_mo == null) { - TilePaint.method3060(var1, var0); - Client.__client_mo = class204.getWidgetChild(var1, var0); + TilePaint.method3060(arg2, arg1); + Client.__client_mo = class204.getWidgetChild(arg2, arg1); class22.method295(Client.__client_mo); } - } else if(var2 == 31) { + } else if(opcode == 31) { var8 = Interpreter.method1915(ClientPacket.__gs_bu, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntME(var1); + var8.packetBuffer.writeIntME(arg2); var8.packetBuffer.writeIntLE16(ServerPacket.selectedItemWidget); var8.packetBuffer.__bx_323(HealthBarDefinition.selectedItemSlot); var8.packetBuffer.writeShortLE(MenuAction.selectedItemId); - var8.packetBuffer.writeShortLE(var0); - var8.packetBuffer.__bx_323(var3); + var8.packetBuffer.writeShortLE(arg1); + var8.packetBuffer.__bx_323(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 32) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 32) { var8 = Interpreter.method1915(ClientPacket.__gs_q, Client.packetWriter.isaacCipher); var8.packetBuffer.writeIntME(ServerBuild.__iy_lo); - var8.packetBuffer.writeInt(var1); - var8.packetBuffer.writeShort(var0); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeInt(arg2); + var8.packetBuffer.writeShort(arg1); + var8.packetBuffer.writeShortLE(arg0); var8.packetBuffer.writeShortLE(Client.__client_lc); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 33) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 33) { var8 = Interpreter.method1915(ClientPacket.__gs_ck, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(var3); - var8.packetBuffer.writeIntME(var1); - var8.packetBuffer.writeShort(var0); + var8.packetBuffer.writeShortLE(arg0); + var8.packetBuffer.writeIntME(arg2); + var8.packetBuffer.writeShort(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 34) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 34) { var8 = Interpreter.method1915(ClientPacket.__gs_cc, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bo_322(var3); - var8.packetBuffer.writeIntLE16(var1); - var8.packetBuffer.__bx_323(var0); + var8.packetBuffer.__bo_322(arg0); + var8.packetBuffer.writeIntLE16(arg2); + var8.packetBuffer.__bx_323(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 35) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 35) { var8 = Interpreter.method1915(ClientPacket.__gs_bp, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntLE(var1); - var8.packetBuffer.__bx_323(var0); - var8.packetBuffer.__bx_323(var3); + var8.packetBuffer.writeIntLE(arg2); + var8.packetBuffer.__bx_323(arg1); + var8.packetBuffer.__bx_323(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 36) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 36) { var8 = Interpreter.method1915(ClientPacket.__gs_l, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.writeInt(var1); - var8.packetBuffer.__bx_323(var0); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.writeInt(arg2); + var8.packetBuffer.__bx_323(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 37) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 37) { var8 = Interpreter.method1915(ClientPacket.__gs_bd, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(var1); - var8.packetBuffer.writeShort(var0); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeInt(arg2); + var8.packetBuffer.writeShort(arg1); + var8.packetBuffer.writeShort(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; } else { - if(var2 == 38) { + if(opcode == 38) { Player.method1281(); - var16 = Huffman.getWidget(var1); + var16 = Huffman.getWidget(arg2); Client.isItemSelected = 1; - HealthBarDefinition.selectedItemSlot = var0; - ServerPacket.selectedItemWidget = var1; - MenuAction.selectedItemId = var3; + HealthBarDefinition.selectedItemSlot = arg1; + ServerPacket.selectedItemWidget = arg2; + MenuAction.selectedItemId = arg0; class22.method295(var16); - Client.selectedItemName = BufferedFile.colorStartTag(16748608) + Skills.getItemDefinition(var3).name + BufferedFile.colorStartTag(16777215); + Client.selectedItemName = BufferedFile.colorStartTag(16748608) + Skills.getItemDefinition(arg0).name + BufferedFile.colorStartTag(16777215); if(Client.selectedItemName == null) { Client.selectedItemName = "null"; } @@ -1070,174 +1053,174 @@ public abstract class Actor extends Entity { return; } - if(var2 == 39) { + if(opcode == 39) { var8 = Interpreter.method1915(ClientPacket.__gs_au, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bx_323(var3); - var8.packetBuffer.writeIntLE16(var1); - var8.packetBuffer.writeShortLE(var0); + var8.packetBuffer.__bx_323(arg0); + var8.packetBuffer.writeIntLE16(arg2); + var8.packetBuffer.writeShortLE(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 40) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 40) { var8 = Interpreter.method1915(ClientPacket.__gs_ag, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntLE16(var1); - var8.packetBuffer.writeShortLE(var0); - var8.packetBuffer.__bo_322(var3); + var8.packetBuffer.writeIntLE16(arg2); + var8.packetBuffer.writeShortLE(arg1); + var8.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 41) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 41) { var8 = Interpreter.method1915(ClientPacket.__gs_bl, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeIntLE(var1); - var8.packetBuffer.__bo_322(var0); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeIntLE(arg2); + var8.packetBuffer.__bo_322(arg1); + var8.packetBuffer.writeShort(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 42) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 42) { var8 = Interpreter.method1915(ClientPacket.__gs_bm, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeInt(var1); - var8.packetBuffer.__bo_322(var0); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeInt(arg2); + var8.packetBuffer.__bo_322(arg1); + var8.packetBuffer.writeShort(arg0); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 43) { + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 43) { var8 = Interpreter.method1915(ClientPacket.__gs_ay, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(var3); - var8.packetBuffer.writeIntME(var1); - var8.packetBuffer.writeShort(var0); + var8.packetBuffer.writeShort(arg0); + var8.packetBuffer.writeIntME(arg2); + var8.packetBuffer.writeShort(arg1); Client.packetWriter.__q_167(var8); Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; - } else if(var2 == 44) { - var15 = Client.players[var3]; + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; + } else if(opcode == 44) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_ao, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShort(var3); + var9.packetBuffer.writeShort(arg0); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 45) { - var15 = Client.players[var3]; + } else if(opcode == 45) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_bn, Client.packetWriter.isaacCipher); var9.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 46) { - var15 = Client.players[var3]; + } else if(opcode == 46) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_by, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); var9.packetBuffer.writeByte(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 47) { - var15 = Client.players[var3]; + } else if(opcode == 47) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_aq, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 48) { - var15 = Client.players[var3]; + } else if(opcode == 48) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_cm, Client.packetWriter.isaacCipher); var9.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 49) { - var15 = Client.players[var3]; + } else if(opcode == 49) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_cf, Client.packetWriter.isaacCipher); - var9.packetBuffer.__bo_322(var3); + var9.packetBuffer.__bo_322(arg0); var9.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 50) { - var15 = Client.players[var3]; + } else if(opcode == 50) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_be, Client.packetWriter.isaacCipher); var9.packetBuffer.__ba_316(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var9); } - } else if(var2 == 51) { - var15 = Client.players[var3]; + } else if(opcode == 51) { + var15 = Client.players[arg0]; if(var15 != null) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var9 = Interpreter.method1915(ClientPacket.__gs_af, Client.packetWriter.isaacCipher); var9.packetBuffer.__ai_315(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var9.packetBuffer.__bx_323(var3); + var9.packetBuffer.__bx_323(arg0); Client.packetWriter.__q_167(var9); } } else { label921: { - if(var2 != 57) { - if(var2 == 58) { - var16 = class204.getWidgetChild(var1, var0); + if(opcode != 57) { + if(opcode == 58) { + var16 = class204.getWidgetChild(arg2, arg1); if(var16 != null) { var9 = Interpreter.method1915(ClientPacket.__gs_cs, Client.packetWriter.isaacCipher); var9.packetBuffer.writeShortLE(Client.__client_lc); - var9.packetBuffer.writeIntLE16(var1); + var9.packetBuffer.writeIntLE16(arg2); var9.packetBuffer.writeShortLE(Client.__client_mh); - var9.packetBuffer.__bx_323(var0); + var9.packetBuffer.__bx_323(arg1); var9.packetBuffer.writeInt(ServerBuild.__iy_lo); var9.packetBuffer.__bx_323(var16.itemId); Client.packetWriter.__q_167(var9); @@ -1245,39 +1228,39 @@ public abstract class Actor extends Entity { break label921; } - if(var2 == 1001) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1001) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - Client.destinationX = var0; - Client.destinationY = var1; + Client.destinationX = arg1; + Client.destinationY = arg2; var8 = Interpreter.method1915(ClientPacket.__gs_cp, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShort(var3); + var8.packetBuffer.writeShort(arg0); var8.packetBuffer.__af_314(KeyHandler.KeyHandler_pressedKeys[82]?1:0); - var8.packetBuffer.__bo_322(var0 + class50.baseX); - var8.packetBuffer.__bx_323(GraphicsObject.baseY + var1); + var8.packetBuffer.__bo_322(arg1 + class50.baseX); + var8.packetBuffer.__bx_323(GraphicsObject.baseY + arg2); Client.packetWriter.__q_167(var8); break label921; } - if(var2 == 1002) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1002) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; var8 = Interpreter.method1915(ClientPacket.__gs_al, Client.packetWriter.isaacCipher); - var8.packetBuffer.__bo_322(var3); + var8.packetBuffer.__bo_322(arg0); Client.packetWriter.__q_167(var8); break label921; } - if(var2 == 1003) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1003) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; - var13 = Client.npcs[var3]; + var13 = Client.npcs[arg0]; if(var13 != null) { NpcDefinition var17 = var13.definition; if(var17.transforms != null) { @@ -1293,44 +1276,44 @@ public abstract class Actor extends Entity { break label921; } - if(var2 == 1004) { - Client.mouseCrossX = var6; - Client.mouseCrossY = var7; + if(opcode == 1004) { + Client.mouseCrossX = mouseX; + Client.mouseCrossY = mouseY; Client.mouseCrossColor = 2; Client.mouseCrossState = 0; var8 = Interpreter.method1915(ClientPacket.__gs_p, Client.packetWriter.isaacCipher); - var8.packetBuffer.writeShortLE(var3); + var8.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var8); break label921; } - if(var2 == 1005) { - var16 = Huffman.getWidget(var1); - if(var16 != null && var16.itemQuantities[var0] >= 100000) { - WorldMapIcon1.method219(27, "", var16.itemQuantities[var0] + " x " + Skills.getItemDefinition(var3).name); + if(opcode == 1005) { + var16 = Huffman.getWidget(arg2); + if(var16 != null && var16.itemQuantities[arg1] >= 100000) { + WorldMapIcon1.method219(27, "", var16.itemQuantities[arg1] + " x " + Skills.getItemDefinition(arg0).name); } else { var9 = Interpreter.method1915(ClientPacket.__gs_p, Client.packetWriter.isaacCipher); - var9.packetBuffer.writeShortLE(var3); + var9.packetBuffer.writeShortLE(arg0); Client.packetWriter.__q_167(var9); } Client.__client_ju = 0; - BoundaryObject.__ej_jv = Huffman.getWidget(var1); - Client.__client_jz = var0; + BoundaryObject.__ej_jv = Huffman.getWidget(arg2); + Client.__client_jz = arg1; break label921; } - if(var2 != 1007) { - if(var2 == 1008 || var2 == 1011 || var2 == 1010 || var2 == 1009 || var2 == 1012) { - class60.worldMap0.menuAction(var2, var3, new TileLocation(var0), new TileLocation(var1)); + if(opcode != 1007) { + if(opcode == 1008 || opcode == 1011 || opcode == 1010 || opcode == 1009 || opcode == 1012) { + class60.worldMap0.menuAction(opcode, arg0, new TileLocation(arg1), new TileLocation(arg2)); } break label921; } } - var16 = class204.getWidgetChild(var1, var0); + var16 = class204.getWidgetChild(arg2, arg1); if(var16 != null) { - class171.method3494(var3, var1, var0, var16.itemId, var5); + class171.method3494(arg0, arg2, arg1, var16.itemId, target); } } } diff --git a/runescape-client/src/main/java/Animation.java b/runescape-client/src/main/java/Animation.java index a6157a7c73..826dd5043d 100644 --- a/runescape-client/src/main/java/Animation.java +++ b/runescape-client/src/main/java/Animation.java @@ -7,16 +7,12 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Animation") public class Animation { @ObfuscatedName("m") - @Export("__dz_m") static int[] __dz_m; @ObfuscatedName("f") - @Export("__dz_f") static int[] __dz_f; @ObfuscatedName("q") - @Export("__dz_q") static int[] __dz_q; @ObfuscatedName("w") - @Export("__dz_w") static int[] __dz_w; @ObfuscatedName("o") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/AttackOption.java b/runescape-client/src/main/java/AttackOption.java index 699c61117b..49787eda2c 100644 --- a/runescape-client/src/main/java/AttackOption.java +++ b/runescape-client/src/main/java/AttackOption.java @@ -34,10 +34,8 @@ public enum AttackOption implements Enumerated { @Export("AttackOption_hidden") AttackOption_hidden(3); @ObfuscatedName("sp") - @Export("__cj_sp") static short[] __cj_sp; @ObfuscatedName("ay") - @Export("__cj_ay") static String __cj_ay; @ObfuscatedName("bo") @ObfuscatedSignature( @@ -61,6 +59,7 @@ public enum AttackOption implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } diff --git a/runescape-client/src/main/java/AudioFilter.java b/runescape-client/src/main/java/AudioFilter.java index 84c98f85b8..4c84f460d0 100644 --- a/runescape-client/src/main/java/AudioFilter.java +++ b/runescape-client/src/main/java/AudioFilter.java @@ -7,28 +7,20 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("AudioFilter") public class AudioFilter { @ObfuscatedName("u") - @Export("__di_u") static float[][] __di_u; @ObfuscatedName("g") - @Export("__di_g") static int[][] __di_g; @ObfuscatedName("l") - @Export("__di_l") static float __di_l; @ObfuscatedName("e") - @Export("__di_e") static int __di_e; @ObfuscatedName("m") - @Export("__m") int[] __m; @ObfuscatedName("q") - @Export("__q") int[][][] __q; @ObfuscatedName("w") - @Export("__w") int[][][] __w; @ObfuscatedName("o") - @Export("__o") int[] __o; static { @@ -44,7 +36,6 @@ public class AudioFilter { } @ObfuscatedName("m") - @Export("__m_205") float __m_205(int var1, int var2, float var3) { float var4 = (float)this.__w[var1][0][var2] + var3 * (float)(this.__w[var1][1][var2] - this.__w[var1][0][var2]); var4 *= 0.0015258789F; @@ -52,7 +43,6 @@ public class AudioFilter { } @ObfuscatedName("q") - @Export("__q_206") float __q_206(int var1, int var2, float var3) { float var4 = (float)this.__q[var1][0][var2] + var3 * (float)(this.__q[var1][1][var2] - this.__q[var1][0][var2]); var4 *= 1.2207031E-4F; @@ -60,7 +50,6 @@ public class AudioFilter { } @ObfuscatedName("w") - @Export("__w_207") int __w_207(int var1, float var2) { float var3; if(var1 == 0) { @@ -111,7 +100,6 @@ public class AudioFilter { @ObfuscatedSignature( signature = "(Lgr;Lde;)V" ) - @Export("__o_208") final void __o_208(Buffer var1, SoundEnvelope var2) { int var3 = var1.readUnsignedByte(); this.__m[0] = var3 >> 4; diff --git a/runescape-client/src/main/java/BoundaryObject.java b/runescape-client/src/main/java/BoundaryObject.java index 659c924834..8c65d3323a 100644 --- a/runescape-client/src/main/java/BoundaryObject.java +++ b/runescape-client/src/main/java/BoundaryObject.java @@ -11,7 +11,6 @@ public final class BoundaryObject { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__ej_jv") static Widget __ej_jv; @ObfuscatedName("m") @ObfuscatedGetter( @@ -78,6 +77,7 @@ public final class BoundaryObject { signature = "(Ljava/lang/String;B)V", garbageValue = "103" ) + @Export("doCheat") static final void doCheat(String var0) { if(var0.equalsIgnoreCase("toggleroof")) { ReflectionCheck.clientPreferences.roofsHidden = !ReflectionCheck.clientPreferences.roofsHidden; diff --git a/runescape-client/src/main/java/Bounds.java b/runescape-client/src/main/java/Bounds.java index f265d60cf0..45b2743682 100644 --- a/runescape-client/src/main/java/Bounds.java +++ b/runescape-client/src/main/java/Bounds.java @@ -11,25 +11,21 @@ public class Bounds { @ObfuscatedGetter( intValue = -2004088829 ) - @Export("__m") public int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -1887298731 ) - @Export("__f") public int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 2001187823 ) - @Export("__q") public int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 1377856837 ) - @Export("__w") public int __w; public Bounds(int var1, int var2, int var3, int var4) { @@ -46,7 +42,6 @@ public class Bounds { signature = "(IIB)V", garbageValue = "1" ) - @Export("__m_487") public void __m_487(int var1, int var2) { this.__m = var1; this.__f = var2; @@ -57,7 +52,6 @@ public class Bounds { signature = "(III)V", garbageValue = "-11269827" ) - @Export("__f_488") public void __f_488(int var1, int var2) { this.__q = var1; this.__w = var2; @@ -68,7 +62,6 @@ public class Bounds { signature = "(Lla;Lla;I)V", garbageValue = "-2123792170" ) - @Export("__q_490") public void __q_490(Bounds var1, Bounds var2) { this.__w_491(var1, var2); this.__o_492(var1, var2); @@ -79,7 +72,6 @@ public class Bounds { signature = "(Lla;Lla;I)V", garbageValue = "314675149" ) - @Export("__w_491") void __w_491(Bounds var1, Bounds var2) { var2.__m = this.__m; var2.__q = this.__q; @@ -103,7 +95,6 @@ public class Bounds { signature = "(Lla;Lla;S)V", garbageValue = "128" ) - @Export("__o_492") void __o_492(Bounds var1, Bounds var2) { var2.__f = this.__f; var2.__w = this.__w; @@ -127,7 +118,6 @@ public class Bounds { signature = "(I)I", garbageValue = "-1842151293" ) - @Export("__u_493") int __u_493() { return this.__m + this.__q; } @@ -137,12 +127,10 @@ public class Bounds { signature = "(B)I", garbageValue = "-22" ) - @Export("__g_494") int __g_494() { return this.__f + this.__w; } - @Export("__toString_489") @ObfuscatedName("toString") public String __toString_489() { return null; diff --git a/runescape-client/src/main/java/Buddy.java b/runescape-client/src/main/java/Buddy.java index 4e643dadd2..42a54d7e6b 100644 --- a/runescape-client/src/main/java/Buddy.java +++ b/runescape-client/src/main/java/Buddy.java @@ -66,6 +66,7 @@ public class Buddy extends User { signature = "(I)V", garbageValue = "1868787018" ) + @Export("processOverheadText") static final void processOverheadText() { int[] var0 = Players.Players_indices; diff --git a/runescape-client/src/main/java/Buffer.java b/runescape-client/src/main/java/Buffer.java index 834f7c642d..c711dc32c1 100644 --- a/runescape-client/src/main/java/Buffer.java +++ b/runescape-client/src/main/java/Buffer.java @@ -9,10 +9,8 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Buffer") public class Buffer extends Node { @ObfuscatedName("q") - @Export("__gr_q") static int[] __gr_q; @ObfuscatedName("o") - @Export("__gr_o") static long[] __gr_o; @ObfuscatedName("m") @Export("array") @@ -75,7 +73,6 @@ public class Buffer extends Node { signature = "(S)V", garbageValue = "13572" ) - @Export("__f_295") public void __f_295() { if(this.array != null) { VertexNormal.method2984(this.array); @@ -202,7 +199,6 @@ public class Buffer extends Node { signature = "(Ljava/lang/CharSequence;B)V", garbageValue = "58" ) - @Export("__j_296") public void __j_296(CharSequence var1) { int var3 = var1.length(); int var4 = 0; @@ -228,7 +224,6 @@ public class Buffer extends Node { signature = "([BIII)V", garbageValue = "-1915344405" ) - @Export("__s_297") public void __s_297(byte[] var1, int var2, int var3) { for(int var4 = var2; var4 < var3 + var2; ++var4) { this.array[++this.index - 1] = var1[var4]; @@ -241,7 +236,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "-225163682" ) - @Export("__t_298") public void __t_298(int var1) { this.array[this.index - var1 - 4] = (byte)(var1 >> 24); this.array[this.index - var1 - 3] = (byte)(var1 >> 16); @@ -254,7 +248,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "-1298210761" ) - @Export("__y_299") public void __y_299(int var1) { this.array[this.index - var1 - 2] = (byte)(var1 >> 8); this.array[this.index - var1 - 1] = (byte)var1; @@ -265,7 +258,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "-1839722163" ) - @Export("__h_300") public void __h_300(int var1) { this.array[this.index - var1 - 1] = (byte)var1; } @@ -291,7 +283,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "820873705" ) - @Export("__c_301") public void __c_301(int var1) { if((var1 & -128) != 0) { if((var1 & -16384) != 0) { @@ -337,7 +328,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "-86" ) - @Export("__ag_302") public int __ag_302() { this.index += 2; return (this.array[this.index - 1] & 255) + ((this.array[this.index - 2] & 255) << 8); @@ -348,7 +338,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "1" ) - @Export("__aq_303") public int __aq_303() { this.index += 2; int var1 = (this.array[this.index - 1] & 255) + ((this.array[this.index - 2] & 255) << 8); @@ -462,7 +451,6 @@ public class Buffer extends Node { signature = "(B)Ljava/lang/String;", garbageValue = "-14" ) - @Export("__aw_304") public String __aw_304() { byte var1 = this.array[++this.index - 1]; if(var1 != 0) { @@ -535,7 +523,6 @@ public class Buffer extends Node { signature = "([BIIB)V", garbageValue = "-122" ) - @Export("__al_305") public void __al_305(byte[] var1, int var2, int var3) { for(int var4 = var2; var4 < var3 + var2; ++var4) { var1[var4] = this.array[++this.index - 1]; @@ -548,7 +535,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "-24" ) - @Export("__ab_306") public int __ab_306() { int var1 = this.array[this.index] & 255; return var1 < 128?this.readUnsignedByte() - 64:this.__ag_302() - 49152; @@ -559,7 +545,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "1370512869" ) - @Export("__ae_307") public int __ae_307() { int var1 = this.array[this.index] & 255; return var1 < 128?this.readUnsignedByte():this.__ag_302() - 32768; @@ -570,7 +555,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "1177684230" ) - @Export("__at_308") public int __at_308() { int var1 = 0; @@ -588,7 +572,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "103" ) - @Export("__ad_309") public int __ad_309() { return this.array[this.index] < 0?this.readInt() & Integer.MAX_VALUE:this.__ag_302(); } @@ -598,7 +581,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-1151173205" ) - @Export("__ap_310") public int __ap_310() { if(this.array[this.index] < 0) { return this.readInt() & Integer.MAX_VALUE; @@ -613,7 +595,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "984135559" ) - @Export("__as_311") public int __as_311() { byte var1 = this.array[++this.index - 1]; @@ -765,7 +746,6 @@ public class Buffer extends Node { signature = "(II)I", garbageValue = "-484928770" ) - @Export("__aa_312") public int __aa_312(int var1) { byte[] var3 = this.array; int var4 = this.index; @@ -785,7 +765,6 @@ public class Buffer extends Node { signature = "(B)Z", garbageValue = "-11" ) - @Export("__ax_313") public boolean __ax_313() { this.index -= 4; byte[] var2 = this.array; @@ -807,7 +786,6 @@ public class Buffer extends Node { signature = "(IB)V", garbageValue = "-47" ) - @Export("__af_314") public void __af_314(int var1) { this.array[++this.index - 1] = (byte)(var1 + 128); } @@ -817,7 +795,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "-1336494664" ) - @Export("__ai_315") public void __ai_315(int var1) { this.array[++this.index - 1] = (byte)(0 - var1); } @@ -827,7 +804,6 @@ public class Buffer extends Node { signature = "(IB)V", garbageValue = "21" ) - @Export("__ba_316") public void __ba_316(int var1) { this.array[++this.index - 1] = (byte)(128 - var1); } @@ -837,7 +813,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-86972759" ) - @Export("__bb_317") public int __bb_317() { return this.array[++this.index - 1] - 128 & 255; } @@ -857,7 +832,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "359814653" ) - @Export("__bq_318") public int __bq_318() { return 128 - this.array[++this.index - 1] & 255; } @@ -867,7 +841,6 @@ public class Buffer extends Node { signature = "(I)B", garbageValue = "2130167320" ) - @Export("__bn_319") public byte __bn_319() { return (byte)(this.array[++this.index - 1] - 128); } @@ -877,7 +850,6 @@ public class Buffer extends Node { signature = "(I)B", garbageValue = "1415936818" ) - @Export("__bk_320") public byte __bk_320() { return (byte)(0 - this.array[++this.index - 1]); } @@ -887,7 +859,6 @@ public class Buffer extends Node { signature = "(I)B", garbageValue = "1496705333" ) - @Export("__bd_321") public byte __bd_321() { return (byte)(128 - this.array[++this.index - 1]); } @@ -908,7 +879,6 @@ public class Buffer extends Node { signature = "(II)V", garbageValue = "189694315" ) - @Export("__bo_322") public void __bo_322(int var1) { this.array[++this.index - 1] = (byte)(var1 >> 8); this.array[++this.index - 1] = (byte)(var1 + 128); @@ -919,7 +889,6 @@ public class Buffer extends Node { signature = "(IB)V", garbageValue = "-7" ) - @Export("__bx_323") public void __bx_323(int var1) { this.array[++this.index - 1] = (byte)(var1 + 128); this.array[++this.index - 1] = (byte)(var1 >> 8); @@ -930,7 +899,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "2147134369" ) - @Export("__by_324") public int __by_324() { this.index += 2; return ((this.array[this.index - 1] & 255) << 8) + (this.array[this.index - 2] & 255); @@ -941,7 +909,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-1489217204" ) - @Export("__bu_325") public int __bu_325() { this.index += 2; return (this.array[this.index - 1] - 128 & 255) + ((this.array[this.index - 2] & 255) << 8); @@ -952,7 +919,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "-86" ) - @Export("__bm_326") public int __bm_326() { this.index += 2; return ((this.array[this.index - 1] & 255) << 8) + (this.array[this.index - 2] - 128 & 255); @@ -963,7 +929,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "54" ) - @Export("__bl_327") public int __bl_327() { this.index += 2; int var1 = ((this.array[this.index - 1] & 255) << 8) + (this.array[this.index - 2] & 255); @@ -979,7 +944,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "388487388" ) - @Export("__br_328") public int __br_328() { this.index += 2; int var1 = ((this.array[this.index - 1] & 255) << 8) + (this.array[this.index - 2] - 128 & 255); @@ -995,7 +959,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-88751042" ) - @Export("__bj_329") public int __bj_329() { this.index += 3; return (this.array[this.index - 3] & 255) + ((this.array[this.index - 2] & 255) << 8) + ((this.array[this.index - 1] & 255) << 16); @@ -1045,7 +1008,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-1322860835" ) - @Export("__bt_330") public int __bt_330() { this.index += 4; return (this.array[this.index - 4] & 255) + ((this.array[this.index - 3] & 255) << 8) + ((this.array[this.index - 2] & 255) << 16) + ((this.array[this.index - 1] & 255) << 24); @@ -1056,7 +1018,6 @@ public class Buffer extends Node { signature = "(I)I", garbageValue = "-1731171028" ) - @Export("__bp_331") public int __bp_331() { this.index += 4; return ((this.array[this.index - 2] & 255) << 24) + ((this.array[this.index - 4] & 255) << 8) + (this.array[this.index - 3] & 255) + ((this.array[this.index - 1] & 255) << 16); @@ -1067,7 +1028,6 @@ public class Buffer extends Node { signature = "(B)I", garbageValue = "-126" ) - @Export("__bf_332") public int __bf_332() { this.index += 4; return ((this.array[this.index - 1] & 255) << 8) + ((this.array[this.index - 4] & 255) << 16) + (this.array[this.index - 2] & 255) + ((this.array[this.index - 3] & 255) << 24); @@ -1078,7 +1038,6 @@ public class Buffer extends Node { signature = "([BIII)V", garbageValue = "1303287859" ) - @Export("__bh_333") public void __bh_333(byte[] var1, int var2, int var3) { for(int var4 = var2; var4 < var3 + var2; ++var4) { var1[var4] = (byte)(this.array[++this.index - 1] - 128); @@ -1091,6 +1050,7 @@ public class Buffer extends Node { signature = "(B)V", garbageValue = "1" ) + @Export("clearHealthbarCaches") public static void clearHealthbarCaches() { HealthBarDefinition.HealthBarDefinition_cached.clear(); HealthBarDefinition.HealthBarDefinition_cachedSprites.clear(); diff --git a/runescape-client/src/main/java/BufferedFile.java b/runescape-client/src/main/java/BufferedFile.java index c6217ee7c9..5b4292d34b 100644 --- a/runescape-client/src/main/java/BufferedFile.java +++ b/runescape-client/src/main/java/BufferedFile.java @@ -23,13 +23,11 @@ public class BufferedFile { @ObfuscatedGetter( longValue = -7773729680030815835L ) - @Export("__q") long __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -846810907 ) - @Export("__w") int __w; @ObfuscatedName("o") @Export("writeBuffer") @@ -38,25 +36,21 @@ public class BufferedFile { @ObfuscatedGetter( longValue = 5249231081498323007L ) - @Export("__u") long __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -1558233611 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( longValue = -6819476051574242871L ) - @Export("__l") long __l; @ObfuscatedName("e") @ObfuscatedGetter( longValue = -3728247331531750871L ) - @Export("__e") long __e; @ObfuscatedName("x") @ObfuscatedGetter( @@ -68,7 +62,6 @@ public class BufferedFile { @ObfuscatedGetter( longValue = 5720856138805191881L ) - @Export("__d") long __d; @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/BufferedNetSocket.java b/runescape-client/src/main/java/BufferedNetSocket.java index c954347832..1b5b13c43e 100644 --- a/runescape-client/src/main/java/BufferedNetSocket.java +++ b/runescape-client/src/main/java/BufferedNetSocket.java @@ -39,6 +39,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "(II)Z", garbageValue = "1765046516" ) + @Export("isAvailable") public boolean isAvailable(int var1) throws IOException { return this.source.isAvailable(var1); } @@ -48,6 +49,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "(I)I", garbageValue = "-1078471130" ) + @Export("available") public int available() throws IOException { return this.source.available(); } @@ -57,6 +59,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "(I)I", garbageValue = "516705222" ) + @Export("readUnsignedByte") public int readUnsignedByte() throws IOException { return this.source.readUnsignedByte(); } @@ -66,6 +69,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "([BIII)I", garbageValue = "-1089665746" ) + @Export("read") public int read(byte[] var1, int var2, int var3) throws IOException { return this.source.read(var1, var2, var3); } @@ -75,6 +79,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "([BIIB)V", garbageValue = "-86" ) + @Export("write") public void write(byte[] var1, int var2, int var3) throws IOException { this.sink.write(var1, var2, var3); } @@ -84,6 +89,7 @@ public class BufferedNetSocket extends AbstractSocket { signature = "(I)V", garbageValue = "-1252618448" ) + @Export("close") public void close() { this.sink.close(); @@ -96,7 +102,6 @@ public class BufferedNetSocket extends AbstractSocket { this.source.close(); } - @Export("__finalize_280") @ObfuscatedName("finalize") protected void __finalize_280() { this.close(); diff --git a/runescape-client/src/main/java/BufferedSource.java b/runescape-client/src/main/java/BufferedSource.java index f0aee8a0c5..5069205f88 100644 --- a/runescape-client/src/main/java/BufferedSource.java +++ b/runescape-client/src/main/java/BufferedSource.java @@ -14,7 +14,6 @@ public class BufferedSource implements Runnable { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__fh_x") public static AbstractIndexCache __fh_x; @ObfuscatedName("m") @Export("thread") diff --git a/runescape-client/src/main/java/ByteArrayPool.java b/runescape-client/src/main/java/ByteArrayPool.java index edbac8c291..8ac8278150 100644 --- a/runescape-client/src/main/java/ByteArrayPool.java +++ b/runescape-client/src/main/java/ByteArrayPool.java @@ -35,7 +35,6 @@ public class ByteArrayPool { @Export("ByteArrayPool_large") static byte[][] ByteArrayPool_large; @ObfuscatedName("g") - @Export("__gi_g") static int[] __gi_g; @ObfuscatedName("dz") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/Bzip2State.java b/runescape-client/src/main/java/Bzip2State.java index aca4b3ea42..41c6b17ddc 100644 --- a/runescape-client/src/main/java/Bzip2State.java +++ b/runescape-client/src/main/java/Bzip2State.java @@ -7,163 +7,125 @@ import net.runelite.mapping.ObfuscatedName; @Implements("Bzip2State") public final class Bzip2State { @ObfuscatedName("m") - @Export("__m") final int __m; @ObfuscatedName("f") - @Export("__f") final int __f; @ObfuscatedName("q") - @Export("__q") final int __q; @ObfuscatedName("w") - @Export("__w") final int __w; @ObfuscatedName("o") - @Export("__o") final int __o; @ObfuscatedName("u") - @Export("__u") final int __u; @ObfuscatedName("g") - @Export("__g") byte[] __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -1510817847 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -473971741 ) - @Export("__e") int __e; @ObfuscatedName("x") - @Export("__x") byte[] __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = -861462251 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( intValue = 594179173 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = 1860254567 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") - @Export("__i") byte __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -1994129645 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1793367959 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = -1987934943 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 1172102327 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedGetter( intValue = 1502359789 ) - @Export("__t") int __t; @ObfuscatedName("y") @ObfuscatedGetter( intValue = -953353963 ) - @Export("__y") int __y; @ObfuscatedName("h") @ObfuscatedGetter( intValue = -1981923611 ) - @Export("__h") int __h; @ObfuscatedName("b") - @Export("__b") int[] __b; @ObfuscatedName("c") @ObfuscatedGetter( intValue = -557334365 ) - @Export("__c") int __c; @ObfuscatedName("r") - @Export("__r") int[] __r; @ObfuscatedName("v") @ObfuscatedGetter( intValue = -886333045 ) - @Export("__v") int __v; @ObfuscatedName("ag") - @Export("__ag") boolean[] __ag; @ObfuscatedName("aq") - @Export("__aq") boolean[] __aq; @ObfuscatedName("aj") - @Export("__aj") byte[] __aj; @ObfuscatedName("av") - @Export("__av") byte[] __av; @ObfuscatedName("ar") - @Export("__ar") int[] __ar; @ObfuscatedName("ac") - @Export("__ac") byte[] __ac; @ObfuscatedName("ay") - @Export("__ay") byte[] __ay; @ObfuscatedName("ah") - @Export("__ah") byte[][] __ah; @ObfuscatedName("ak") - @Export("__ak") int[][] __ak; @ObfuscatedName("aw") - @Export("__aw") int[][] __aw; @ObfuscatedName("al") - @Export("__al") int[][] __al; @ObfuscatedName("ab") - @Export("__ab") int[] __ab; @ObfuscatedName("ae") @ObfuscatedGetter( intValue = 444639767 ) - @Export("__ae") int __ae; Bzip2State() { diff --git a/runescape-client/src/main/java/Canvas.java b/runescape-client/src/main/java/Canvas.java index 758b6637d0..ccea55acb9 100644 --- a/runescape-client/src/main/java/Canvas.java +++ b/runescape-client/src/main/java/Canvas.java @@ -15,13 +15,11 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Canvas") public final class Canvas extends java.awt.Canvas { @ObfuscatedName("s") - @Export("__ao_s") public static String[] __ao_s; @ObfuscatedName("gk") @ObfuscatedGetter( intValue = -1131782991 ) - @Export("__ao_gk") static int __ao_gk; @ObfuscatedName("jk") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/ClanChat.java b/runescape-client/src/main/java/ClanChat.java index 5b004c23d7..608c06c72c 100644 --- a/runescape-client/src/main/java/ClanChat.java +++ b/runescape-client/src/main/java/ClanChat.java @@ -26,7 +26,6 @@ public class ClanChat extends UserList { @Export("owner") public String owner; @ObfuscatedName("k") - @Export("__k") public byte __k; @ObfuscatedName("n") @ObfuscatedGetter( @@ -38,7 +37,6 @@ public class ClanChat extends UserList { @ObfuscatedGetter( intValue = 386706253 ) - @Export("__i") int __i; @ObfuscatedSignature( @@ -58,6 +56,7 @@ public class ClanChat extends UserList { signature = "(I)Ljs;", garbageValue = "-2063112195" ) + @Export("newInstance") User newInstance() { return new ClanMate(); } @@ -67,6 +66,7 @@ public class ClanChat extends UserList { signature = "(II)[Ljs;", garbageValue = "861814350" ) + @Export("newTypedArray") User[] newTypedArray(int var1) { return new ClanMate[var1]; } @@ -76,7 +76,6 @@ public class ClanChat extends UserList { signature = "(Ljava/lang/String;I)V", garbageValue = "242122326" ) - @Export("__q_472") final void __q_472(String var1) { this.name = HealthBarUpdate.method1722(var1); } @@ -86,7 +85,6 @@ public class ClanChat extends UserList { signature = "(Ljava/lang/String;B)V", garbageValue = "103" ) - @Export("__x_473") final void __x_473(String var1) { this.owner = HealthBarUpdate.method1722(var1); } @@ -150,7 +148,6 @@ public class ClanChat extends UserList { signature = "(Lgr;B)V", garbageValue = "24" ) - @Export("__a_474") public final void __a_474(Buffer var1) { Username var2 = new Username(var1.readStringCp1252NullTerminated(), this.loginType); int var3 = var1.__ag_302(); @@ -219,7 +216,6 @@ public class ClanChat extends UserList { signature = "(Ljk;I)V", garbageValue = "-128608554" ) - @Export("__cp_475") final void __cp_475(ClanMate var1) { if(var1.username().equals(this.localUser.username())) { this.rank = var1.rank; diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index 983ef4e176..413e46bf08 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -30,7 +30,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1348053843 ) - @Export("__client_oo") static int __client_oo; @ObfuscatedName("os") @ObfuscatedGetter( @@ -42,19 +41,14 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( longValue = 8818983958751331899L ) - @Export("__client_oa") static long __client_oa; @ObfuscatedName("od") - @Export("__client_od") static boolean[] __client_od; @ObfuscatedName("oq") - @Export("__client_oq") static boolean[] __client_oq; @ObfuscatedName("ot") - @Export("__client_ot") static boolean[] __client_ot; @ObfuscatedName("nt") - @Export("__client_nt") static boolean __client_nt; @ObfuscatedName("ng") @ObfuscatedGetter( @@ -69,19 +63,15 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -451622431 ) - @Export("__client_ss") public static int __client_ss; @ObfuscatedName("na") @ObfuscatedGetter( intValue = -934082817 ) - @Export("__client_na") static int __client_na; @ObfuscatedName("nn") - @Export("__client_nn") static boolean __client_nn; @ObfuscatedName("qq") - @Export("__client_qq") static boolean __client_qq; @ObfuscatedName("mt") @ObfuscatedGetter( @@ -99,7 +89,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -843739713 ) - @Export("__client_nw") static int __client_nw; @ObfuscatedName("mr") @ObfuscatedSignature( @@ -123,7 +112,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1939745821 ) - @Export("__client_nl") static int __client_nl; @ObfuscatedName("mx") @ObfuscatedSignature( @@ -173,13 +161,11 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1019025247 ) - @Export("__client_nk") static int __client_nk; @ObfuscatedName("np") @ObfuscatedGetter( intValue = 1881890525 ) - @Export("__client_np") static int __client_np; @ObfuscatedName("pd") @ObfuscatedGetter( @@ -197,13 +183,10 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -34294211 ) - @Export("__client_qy") static int __client_qy; @ObfuscatedName("tp") - @Export("__client_tp") static int[] __client_tp; @ObfuscatedName("th") - @Export("__client_th") static int[] __client_th; @ObfuscatedName("ny") @Export("isDraggingWidget") @@ -236,28 +219,23 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -818676431 ) - @Export("__client_qc") static int __client_qc; @ObfuscatedName("nz") - @Export("__client_nz") static int[] __client_nz; @ObfuscatedName("ns") @ObfuscatedGetter( intValue = 743073293 ) - @Export("__client_ns") static int __client_ns; @ObfuscatedName("sd") @ObfuscatedGetter( intValue = 944933439 ) - @Export("__client_sd") static int __client_sd; @ObfuscatedName("ru") @ObfuscatedSignature( signature = "Lhi;" ) - @Export("__client_ru") static PlayerAppearance __client_ru; @ObfuscatedName("qa") @ObfuscatedGetter( @@ -281,7 +259,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -1605855913 ) - @Export("__client_sl") static int __client_sl; @ObfuscatedName("md") @ObfuscatedSignature( @@ -296,31 +273,27 @@ public final class Client extends GameShell implements Usernamed { @Export("indexCacheLoaderIndex") static int indexCacheLoaderIndex; @ObfuscatedName("qn") - @Export("unknownSoundValues1") - static int[] unknownSoundValues1; + @Export("queuedSoundEffectLoops") + static int[] queuedSoundEffectLoops; @ObfuscatedName("qd") @Export("queuedSoundEffectDelays") static int[] queuedSoundEffectDelays; @ObfuscatedName("nr") - @Export("__client_nr") static int[] __client_nr; @ObfuscatedName("nv") @ObfuscatedGetter( intValue = -758575207 ) - @Export("__client_nv") static int __client_nv; @ObfuscatedName("nd") @ObfuscatedGetter( intValue = 760022015 ) - @Export("__client_nd") static int __client_nd; @ObfuscatedName("ni") @ObfuscatedGetter( intValue = 1990512261 ) - @Export("__client_ni") static int __client_ni; @ObfuscatedName("qe") @ObfuscatedSignature( @@ -341,13 +314,11 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 587773171 ) - @Export("__client_ph") static int __client_ph; @ObfuscatedName("pp") @ObfuscatedGetter( longValue = -1704358328771670975L ) - @Export("__client_pp") static long __client_pp; @ObfuscatedName("sk") @ObfuscatedSignature( @@ -359,40 +330,32 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__client_mo") static Widget __client_mo; @ObfuscatedName("qf") @ObfuscatedGetter( intValue = 1365951359 ) - @Export("__client_qf") static int __client_qf; @ObfuscatedName("nh") @ObfuscatedGetter( intValue = -278874973 ) - @Export("__client_nh") static int __client_nh; @ObfuscatedName("rw") - @Export("__client_rw") static short __client_rw; @ObfuscatedName("qp") @ObfuscatedGetter( intValue = -1352723865 ) - @Export("__client_qp") - static int __client_qp; + @Export("soundEffectVolume") + static int soundEffectVolume; @ObfuscatedName("rm") - @Export("__client_rm") static short __client_rm; @ObfuscatedName("rs") - @Export("__client_rs") static short __client_rs; @ObfuscatedName("rp") - @Export("__client_rp") static short __client_rp; @ObfuscatedName("ri") - @Export("__client_ri") static short __client_ri; @ObfuscatedName("pi") @ObfuscatedGetter( @@ -407,7 +370,6 @@ public final class Client extends GameShell implements Usernamed { @Export("viewportZoom") static int viewportZoom; @ObfuscatedName("rv") - @Export("__client_rv") static short __client_rv; @ObfuscatedName("ry") @ObfuscatedGetter( @@ -443,7 +405,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1694810089 ) - @Export("__client_mb") static int __client_mb; @ObfuscatedName("rr") @ObfuscatedGetter( @@ -461,16 +422,13 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -460406997 ) - @Export("__client_pm") static int __client_pm; @ObfuscatedName("pl") @ObfuscatedGetter( intValue = -1362734353 ) - @Export("__client_pl") static int __client_pl; @ObfuscatedName("rh") - @Export("__client_rh") static boolean[] __client_rh; @ObfuscatedName("ml") @ObfuscatedGetter( @@ -488,64 +446,49 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 206275573 ) - @Export("__client_sx") static int __client_sx; @ObfuscatedName("rd") - @Export("__client_rd") static int[] __client_rd; @ObfuscatedName("rl") - @Export("__client_rl") static int[] __client_rl; @ObfuscatedName("rj") - @Export("__client_rj") static int[] __client_rj; @ObfuscatedName("rk") - @Export("__client_rk") static int[] __client_rk; @ObfuscatedName("pn") - @Export("__client_pn") static int[] __client_pn; @ObfuscatedName("pq") - @Export("__client_pq") static int[] __client_pq; @ObfuscatedName("oh") @ObfuscatedSignature( signature = "Lje;" ) - @Export("__client_oh") static NodeDeque __client_oh; @ObfuscatedName("oc") @ObfuscatedSignature( signature = "Lje;" ) - @Export("__client_oc") static NodeDeque __client_oc; @ObfuscatedName("rb") - @Export("__client_rb") static short __client_rb; @ObfuscatedName("re") - @Export("__client_re") static short __client_re; @ObfuscatedName("mf") @ObfuscatedGetter( intValue = -1715020411 ) - @Export("__client_mf") static int __client_mf; @ObfuscatedName("pu") - @Export("__client_pu") static long[] __client_pu; @ObfuscatedName("ms") @ObfuscatedGetter( intValue = 2128395635 ) - @Export("__client_ms") static int __client_ms; @ObfuscatedName("nc") @ObfuscatedGetter( intValue = 344308849 ) - @Export("__client_nc") static int __client_nc; @ObfuscatedName("nf") @Export("changedSkills") @@ -557,13 +500,11 @@ public final class Client extends GameShell implements Usernamed { @Export("changedSkillsCount") static int changedSkillsCount; @ObfuscatedName("mn") - @Export("__client_mn") static boolean __client_mn; @ObfuscatedName("pb") @ObfuscatedGetter( intValue = 1230692157 ) - @Export("__client_pb") static int __client_pb; @ObfuscatedName("nq") @ObfuscatedGetter( @@ -575,19 +516,15 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 535219347 ) - @Export("__client_mh") static int __client_mh; @ObfuscatedName("pz") - @Export("__client_pz") static String __client_pz; @ObfuscatedName("sj") @ObfuscatedSignature( signature = "Lbj;" ) - @Export("__client_sj") static OwnWorldComparator __client_sj; @ObfuscatedName("pv") - @Export("__client_pv") static int[] __client_pv; @ObfuscatedName("w") @ObfuscatedSignature( @@ -596,7 +533,6 @@ public final class Client extends GameShell implements Usernamed { @Export("collisionMaps") static CollisionMap[] collisionMaps; @ObfuscatedName("ai") - @Export("__client_ai") static boolean __client_ai; @ObfuscatedName("ba") @ObfuscatedGetter( @@ -635,7 +571,6 @@ public final class Client extends GameShell implements Usernamed { @Export("clientType") static int clientType; @ObfuscatedName("bl") - @Export("__client_bl") static boolean __client_bl; @ObfuscatedName("br") @ObfuscatedGetter( @@ -662,22 +597,18 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -1731573291 ) - @Export("__client_cn") static int __client_cn; @ObfuscatedName("cq") @ObfuscatedGetter( intValue = -1313705721 ) - @Export("__client_cq") static int __client_cq; @ObfuscatedName("ch") @ObfuscatedGetter( longValue = -6574384275386813769L ) - @Export("__client_ch") static long __client_ch; @ObfuscatedName("cw") - @Export("__client_cw") static boolean __client_cw; @ObfuscatedName("cg") @Export("displayFps") @@ -764,7 +695,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1154760205 ) - @Export("__client_dp") static int __client_dp; @ObfuscatedName("ek") @ObfuscatedGetter( @@ -782,19 +712,16 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 755300107 ) - @Export("__client_ex") static int __client_ex; @ObfuscatedName("ej") @ObfuscatedGetter( intValue = -964416527 ) - @Export("__client_ej") static int __client_ej; @ObfuscatedName("el") @ObfuscatedGetter( intValue = 689094231 ) - @Export("__client_el") static int __client_el; @ObfuscatedName("en") @ObfuscatedSignature( @@ -805,7 +732,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -447055355 ) - @Export("__client_eo") static int __client_eo; @ObfuscatedName("ew") @Export("Login_isUsernameRemembered") @@ -817,7 +743,6 @@ public final class Client extends GameShell implements Usernamed { @Export("secureRandomFuture") static SecureRandomFuture secureRandomFuture; @ObfuscatedName("ev") - @Export("__client_ev") static byte[] __client_ev; @ObfuscatedName("ez") @ObfuscatedSignature( @@ -838,10 +763,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 516059665 ) - @Export("__client_fw") static int __client_fw; @ObfuscatedName("fg") - @Export("__client_fg") static int[] __client_fg; @ObfuscatedName("fj") @ObfuscatedSignature( @@ -853,10 +776,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -1050480853 ) - @Export("__client_fd") static int __client_fd; @ObfuscatedName("fh") - @Export("__client_fh") static boolean __client_fh; @ObfuscatedName("fx") @Export("useBufferedSocket") @@ -874,31 +795,26 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 829228151 ) - @Export("__client_fe") static int __client_fe; @ObfuscatedName("fn") @ObfuscatedGetter( intValue = -597100741 ) - @Export("__client_fn") static int __client_fn; @ObfuscatedName("fk") @ObfuscatedGetter( intValue = 8470625 ) - @Export("__client_fk") static int __client_fk; @ObfuscatedName("gp") @ObfuscatedGetter( intValue = 685418907 ) - @Export("__client_gp") static int __client_gp; @ObfuscatedName("gh") @ObfuscatedGetter( intValue = -1456975367 ) - @Export("__client_gh") static int __client_gh; @ObfuscatedName("gg") @Export("isInInstance") @@ -907,46 +823,38 @@ public final class Client extends GameShell implements Usernamed { @Export("instanceChunkTemplates") static int[][][] instanceChunkTemplates; @ObfuscatedName("gd") - @Export("__client_gd") static final int[] __client_gd; @ObfuscatedName("gy") @ObfuscatedGetter( intValue = -134014371 ) - @Export("__client_gy") static int __client_gy; @ObfuscatedName("hx") @ObfuscatedGetter( intValue = -1406125895 ) - @Export("__client_hx") static int __client_hx; @ObfuscatedName("hn") @ObfuscatedGetter( intValue = -516933613 ) - @Export("__client_hn") static int __client_hn; @ObfuscatedName("hr") @ObfuscatedGetter( intValue = 1664350313 ) - @Export("__client_hr") static int __client_hr; @ObfuscatedName("hg") @ObfuscatedGetter( intValue = 1658018867 ) - @Export("__client_hg") static int __client_hg; @ObfuscatedName("hh") - @Export("__client_hh") static boolean __client_hh; @ObfuscatedName("hd") @ObfuscatedGetter( intValue = 438998245 ) - @Export("__client_hd") static int __client_hd; @ObfuscatedName("hw") @ObfuscatedGetter( @@ -964,25 +872,21 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 218086227 ) - @Export("__client_hv") static int __client_hv; @ObfuscatedName("hu") @ObfuscatedGetter( intValue = -480633777 ) - @Export("__client_hu") static int __client_hu; @ObfuscatedName("hi") @ObfuscatedGetter( intValue = 402871301 ) - @Export("__client_hi") static int __client_hi; @ObfuscatedName("ht") @ObfuscatedGetter( intValue = 1502058429 ) - @Export("__client_ht") static int __client_ht; @ObfuscatedName("hj") @ObfuscatedGetter( @@ -1000,19 +904,16 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -441913785 ) - @Export("__client_hc") static int __client_hc; @ObfuscatedName("hk") @ObfuscatedGetter( intValue = -1149138989 ) - @Export("__client_hk") static int __client_hk; @ObfuscatedName("if") @ObfuscatedGetter( intValue = -952172003 ) - @Export("__client_if") static int __client_if; @ObfuscatedName("ie") @ObfuscatedGetter( @@ -1024,31 +925,25 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 351193663 ) - @Export("__client_in") static int __client_in; @ObfuscatedName("il") @ObfuscatedGetter( intValue = -1063713523 ) - @Export("__client_il") public static int __client_il; @ObfuscatedName("ij") - @Export("__client_ij") static boolean __client_ij; @ObfuscatedName("iy") @ObfuscatedGetter( intValue = -1213062413 ) - @Export("__client_iy") static int __client_iy; @ObfuscatedName("is") - @Export("__client_is") static boolean __client_is; @ObfuscatedName("ik") @ObfuscatedGetter( intValue = 910983131 ) - @Export("__client_ik") static int __client_ik; @ObfuscatedName("ir") @ObfuscatedGetter( @@ -1141,13 +1036,11 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1691923909 ) - @Export("__client_ju") static int __client_ju; @ObfuscatedName("jz") @ObfuscatedGetter( intValue = -1267243587 ) - @Export("__client_jz") static int __client_jz; @ObfuscatedName("jp") @ObfuscatedGetter( @@ -1159,13 +1052,11 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 813973829 ) - @Export("__client_ja") static int __client_ja; @ObfuscatedName("je") @ObfuscatedGetter( intValue = 1959822241 ) - @Export("__client_je") static int __client_je; @ObfuscatedName("jy") @ObfuscatedGetter( @@ -1174,7 +1065,6 @@ public final class Client extends GameShell implements Usernamed { @Export("dragItemSlotDestination") static int dragItemSlotDestination; @ObfuscatedName("jl") - @Export("__client_jl") static boolean __client_jl; @ObfuscatedName("jt") @ObfuscatedGetter( @@ -1186,7 +1076,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 1084498299 ) - @Export("__client_jc") static int __client_jc; @ObfuscatedName("jj") @Export("showLoadingMessages") @@ -1207,7 +1096,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -836962805 ) - @Export("__client_jo") static int __client_jo; @ObfuscatedName("js") @Export("renderSelf") @@ -1216,16 +1104,13 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -1208823721 ) - @Export("__client_ke") static int __client_ke; @ObfuscatedName("ky") @ObfuscatedGetter( intValue = -64320473 ) - @Export("__client_ky") static int __client_ky; @ObfuscatedName("kd") - @Export("__client_kd") static int[] __client_kd; @ObfuscatedName("kp") @Export("playerMenuOpcodes") @@ -1237,7 +1122,6 @@ public final class Client extends GameShell implements Usernamed { @Export("playerOptionsPriorities") static boolean[] playerOptionsPriorities; @ObfuscatedName("kn") - @Export("__client_kn") static int[] __client_kn; @ObfuscatedName("kx") @ObfuscatedGetter( @@ -1255,7 +1139,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedSignature( signature = "Lje;" ) - @Export("__client_kh") static NodeDeque __client_kh; @ObfuscatedName("kk") @ObfuscatedSignature( @@ -1282,7 +1165,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -898263359 ) - @Export("__client_ku") static int __client_ku; @ObfuscatedName("kc") @Export("isMenuOpen") @@ -1330,25 +1212,21 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 26099827 ) - @Export("__client_lq") static int __client_lq; @ObfuscatedName("ln") @ObfuscatedGetter( intValue = 885052255 ) - @Export("__client_ln") static int __client_ln; @ObfuscatedName("lb") @ObfuscatedGetter( intValue = 699084605 ) - @Export("__client_lb") static int __client_lb; @ObfuscatedName("ls") @ObfuscatedGetter( intValue = -274968037 ) - @Export("__client_ls") static int __client_ls; @ObfuscatedName("lz") @ObfuscatedGetter( @@ -1363,7 +1241,6 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 196309625 ) - @Export("__client_lc") static int __client_lc; static { @@ -1602,11 +1479,11 @@ public final class Client extends GameShell implements Usernamed { __client_qf = 255; __client_qy = -1; __client_qq = false; - __client_qp = 127; + soundEffectVolume = 127; __client_qc = 127; soundEffectCount = 0; soundEffectIds = new int[50]; - unknownSoundValues1 = new int[50]; + queuedSoundEffectLoops = new int[50]; queuedSoundEffectDelays = new int[50]; soundLocations = new int[50]; soundEffects = new SoundEffect[50]; @@ -1663,6 +1540,7 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "1297880469" ) + @Export("setUp") protected final void setUp() { WorldMapCacheName.method633(new int[]{20, 260, 10000}, new int[]{1000, 100, 500}); class2.port1 = gameBuild == 0?43594:worldId + 40000; @@ -2715,6 +2593,7 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "-1879956387" ) + @Export("kill0") protected final void kill0() { if(class196.varcs.hasUnwrittenChanges()) { class196.varcs.write(); @@ -4383,7 +4262,7 @@ public final class Client extends GameShell implements Usernamed { } else if(menuOptionsCount > 0) { var3 = __client_ja; var4 = __client_je; - class231.method4520(UnitPriceComparator.tempMenuAction, var3, var4); + class231.processTempMenuAction(UnitPriceComparator.tempMenuAction, var3, var4); UnitPriceComparator.tempMenuAction = null; } @@ -4637,7 +4516,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "-1792846917" ) - @Export("__ge_137") void __ge_137() { int var1 = SoundCache.canvasWidth; int var2 = Huffman.canvasHeight; @@ -4803,8 +4681,8 @@ public final class Client extends GameShell implements Usernamed { SoundEffect var16 = SoundEffect.readSoundEffect(class25.indexCache4, var15.soundEffectId, 0); if(var16 != null) { RawSound var17 = var16.toRawSound().resample(MilliClock.decimator); - RawPcmStream var18 = RawPcmStream.method2497(var17, 100, var7); - var18.__x_181(-1); + RawPcmStream var18 = RawPcmStream.createRawPcmStream(var17, 100, var7); + var18.setNumLoops(-1); TaskHandler.pcmStreamMixer.addSubStream(var18); var15.stream1 = var18; } @@ -4820,8 +4698,8 @@ public final class Client extends GameShell implements Usernamed { SoundEffect var20 = SoundEffect.readSoundEffect(class25.indexCache4, var15.soundEffectIds[var8], 0); if(var20 != null) { RawSound var21 = var20.toRawSound().resample(MilliClock.decimator); - RawPcmStream var19 = RawPcmStream.method2497(var21, 100, var7); - var19.__x_181(0); + RawPcmStream var19 = RawPcmStream.createRawPcmStream(var21, 100, var7); + var19.setNumLoops(0); TaskHandler.pcmStreamMixer.addSubStream(var19); var15.stream2 = var19; var15.__n = var15.__x + (int)(Math.random() * (double)(var15.__d - var15.__x)); @@ -4855,7 +4733,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(Lcl;I)Z", garbageValue = "1488446149" ) - @Export("__hg_138") final boolean __hg_138(PacketWriter var1) { AbstractSocket var2 = var1.getSocket(); PacketBuffer var3 = var1.packetBuffer; @@ -6223,7 +6100,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "-387903382" ) - @Export("__hi_139") final void __hi_139() { boolean var1 = false; @@ -6340,7 +6216,7 @@ public final class Client extends GameShell implements Usernamed { if(DevicePcmPlayerProvider.dragInventoryWidget != null && !__client_jl && menuOptionsCount > 0 && !this.shouldLeftClickOpenMenu()) { int var10 = __client_ja; int var11 = __client_je; - class231.method4520(UnitPriceComparator.tempMenuAction, var10, var11); + class231.processTempMenuAction(UnitPriceComparator.tempMenuAction, var10, var11); UnitPriceComparator.tempMenuAction = null; } @@ -6439,7 +6315,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(ZI)V", garbageValue = "-271438207" ) - @Export("__iu_141") final void __iu_141(boolean var1) { int var2 = rootWidgetGroup; int var3 = SoundCache.canvasWidth; @@ -6477,7 +6352,6 @@ public final class Client extends GameShell implements Usernamed { signature = "(I)V", garbageValue = "715978124" ) - @Export("__jh_142") final void __jh_142() { class22.method295(clickedWidget); ++MouseRecorder.widgetDragDuration; @@ -6574,7 +6448,7 @@ public final class Client extends GameShell implements Usernamed { } else if(menuOptionsCount > 0) { int var13 = widgetClickX + __client_nk; int var14 = widgetClickY + __client_np; - class231.method4520(UnitPriceComparator.tempMenuAction, var13, var14); + class231.processTempMenuAction(UnitPriceComparator.tempMenuAction, var13, var14); UnitPriceComparator.tempMenuAction = null; } @@ -6594,6 +6468,7 @@ public final class Client extends GameShell implements Usernamed { signature = "(B)Lkp;", garbageValue = "-87" ) + @Export("username") public Username username() { return Canvas.localPlayer != null?Canvas.localPlayer.username:null; } diff --git a/runescape-client/src/main/java/ClientPacket.java b/runescape-client/src/main/java/ClientPacket.java index 7745a7e89c..cf9ef3997d 100644 --- a/runescape-client/src/main/java/ClientPacket.java +++ b/runescape-client/src/main/java/ClientPacket.java @@ -11,607 +11,506 @@ public class ClientPacket implements ClientPacketMarker { @ObfuscatedGetter( intValue = 1076448827 ) - @Export("__gs_qh") static int __gs_qh; @ObfuscatedName("m") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_m") public static final ClientPacket __gs_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_f") public static final ClientPacket __gs_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_q") public static final ClientPacket __gs_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_w") public static final ClientPacket __gs_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_o") public static final ClientPacket __gs_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_u") public static final ClientPacket __gs_u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_g") public static final ClientPacket __gs_g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_l") public static final ClientPacket __gs_l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_e") public static final ClientPacket __gs_e; @ObfuscatedName("x") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_x") public static final ClientPacket __gs_x; @ObfuscatedName("d") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_d") public static final ClientPacket __gs_d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_k") public static final ClientPacket __gs_k; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_n") public static final ClientPacket __gs_n; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_i") public static final ClientPacket __gs_i; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_a") public static final ClientPacket __gs_a; @ObfuscatedName("z") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_z") public static final ClientPacket __gs_z; @ObfuscatedName("j") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_j") public static final ClientPacket __gs_j; @ObfuscatedName("s") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_s") public static final ClientPacket __gs_s; @ObfuscatedName("t") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_t") public static final ClientPacket __gs_t; @ObfuscatedName("y") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_y") public static final ClientPacket __gs_y; @ObfuscatedName("h") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_h") public static final ClientPacket __gs_h; @ObfuscatedName("b") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_b") public static final ClientPacket __gs_b; @ObfuscatedName("c") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_c") public static final ClientPacket __gs_c; @ObfuscatedName("r") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_r") public static final ClientPacket __gs_r; @ObfuscatedName("p") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_p") public static final ClientPacket __gs_p; @ObfuscatedName("v") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_v") public static final ClientPacket __gs_v; @ObfuscatedName("ag") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ag") public static final ClientPacket __gs_ag; @ObfuscatedName("aq") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_aq") public static final ClientPacket __gs_aq; @ObfuscatedName("aj") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_aj") public static final ClientPacket __gs_aj; @ObfuscatedName("av") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_av") public static final ClientPacket __gs_av; @ObfuscatedName("ar") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ar") public static final ClientPacket __gs_ar; @ObfuscatedName("ac") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ac") public static final ClientPacket __gs_ac; @ObfuscatedName("ay") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ay") public static final ClientPacket __gs_ay; @ObfuscatedName("ah") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ah") public static final ClientPacket __gs_ah; @ObfuscatedName("ak") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ak") public static final ClientPacket __gs_ak; @ObfuscatedName("aw") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_aw") public static final ClientPacket __gs_aw; @ObfuscatedName("al") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_al") public static final ClientPacket __gs_al; @ObfuscatedName("ab") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ab") public static final ClientPacket __gs_ab; @ObfuscatedName("ae") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ae") public static final ClientPacket __gs_ae; @ObfuscatedName("at") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_at") public static final ClientPacket __gs_at; @ObfuscatedName("ad") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ad") public static final ClientPacket __gs_ad; @ObfuscatedName("ap") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ap") public static final ClientPacket __gs_ap; @ObfuscatedName("as") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_as") public static final ClientPacket __gs_as; @ObfuscatedName("am") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_am") static final ClientPacket __gs_am; @ObfuscatedName("an") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_an") public static final ClientPacket __gs_an; @ObfuscatedName("az") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_az") public static final ClientPacket __gs_az; @ObfuscatedName("au") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_au") public static final ClientPacket __gs_au; @ObfuscatedName("ao") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ao") public static final ClientPacket __gs_ao; @ObfuscatedName("aa") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_aa") public static final ClientPacket __gs_aa; @ObfuscatedName("ax") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ax") public static final ClientPacket __gs_ax; @ObfuscatedName("af") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_af") public static final ClientPacket __gs_af; @ObfuscatedName("ai") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ai") public static final ClientPacket __gs_ai; @ObfuscatedName("ba") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ba") public static final ClientPacket __gs_ba; @ObfuscatedName("bb") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bb") public static final ClientPacket __gs_bb; @ObfuscatedName("bs") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bs") public static final ClientPacket __gs_bs; @ObfuscatedName("bq") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bq") public static final ClientPacket __gs_bq; @ObfuscatedName("bn") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bn") public static final ClientPacket __gs_bn; @ObfuscatedName("bk") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bk") public static final ClientPacket __gs_bk; @ObfuscatedName("bd") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bd") public static final ClientPacket __gs_bd; @ObfuscatedName("bc") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bc") public static final ClientPacket __gs_bc; @ObfuscatedName("bo") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bo") public static final ClientPacket __gs_bo; @ObfuscatedName("bx") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bx") public static final ClientPacket __gs_bx; @ObfuscatedName("by") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_by") public static final ClientPacket __gs_by; @ObfuscatedName("bu") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bu") public static final ClientPacket __gs_bu; @ObfuscatedName("bm") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bm") public static final ClientPacket __gs_bm; @ObfuscatedName("bl") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bl") public static final ClientPacket __gs_bl; @ObfuscatedName("br") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_br") public static final ClientPacket __gs_br; @ObfuscatedName("bj") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bj") public static final ClientPacket __gs_bj; @ObfuscatedName("bi") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bi") public static final ClientPacket __gs_bi; @ObfuscatedName("bz") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bz") public static final ClientPacket __gs_bz; @ObfuscatedName("bg") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bg") public static final ClientPacket __gs_bg; @ObfuscatedName("bt") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bt") public static final ClientPacket __gs_bt; @ObfuscatedName("bp") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bp") public static final ClientPacket __gs_bp; @ObfuscatedName("bf") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bf") public static final ClientPacket __gs_bf; @ObfuscatedName("bh") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bh") public static final ClientPacket __gs_bh; @ObfuscatedName("be") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_be") public static final ClientPacket __gs_be; @ObfuscatedName("bv") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bv") public static final ClientPacket __gs_bv; @ObfuscatedName("bw") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_bw") public static final ClientPacket __gs_bw; @ObfuscatedName("cr") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cr") public static final ClientPacket __gs_cr; @ObfuscatedName("cv") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cv") public static final ClientPacket __gs_cv; @ObfuscatedName("ce") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ce") public static final ClientPacket __gs_ce; @ObfuscatedName("cy") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cy") public static final ClientPacket __gs_cy; @ObfuscatedName("cs") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cs") public static final ClientPacket __gs_cs; @ObfuscatedName("cm") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cm") public static final ClientPacket __gs_cm; @ObfuscatedName("cj") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cj") public static final ClientPacket __gs_cj; @ObfuscatedName("cu") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cu") public static final ClientPacket __gs_cu; @ObfuscatedName("cb") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cb") public static final ClientPacket __gs_cb; @ObfuscatedName("ck") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ck") public static final ClientPacket __gs_ck; @ObfuscatedName("cn") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cn") public static final ClientPacket __gs_cn; @ObfuscatedName("cq") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cq") public static final ClientPacket __gs_cq; @ObfuscatedName("ch") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ch") public static final ClientPacket __gs_ch; @ObfuscatedName("cw") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cw") public static final ClientPacket __gs_cw; @ObfuscatedName("cg") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cg") public static final ClientPacket __gs_cg; @ObfuscatedName("cf") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cf") public static final ClientPacket __gs_cf; @ObfuscatedName("cp") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cp") public static final ClientPacket __gs_cp; @ObfuscatedName("cl") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cl") public static final ClientPacket __gs_cl; @ObfuscatedName("ct") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ct") public static final ClientPacket __gs_ct; @ObfuscatedName("cz") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cz") public static final ClientPacket __gs_cz; @ObfuscatedName("cc") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_cc") public static final ClientPacket __gs_cc; @ObfuscatedName("ci") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__gs_ci") static final ClientPacket __gs_ci; @ObfuscatedName("cd") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/ClientParameter.java b/runescape-client/src/main/java/ClientParameter.java index 6ca10198ab..19961d5bed 100644 --- a/runescape-client/src/main/java/ClientParameter.java +++ b/runescape-client/src/main/java/ClientParameter.java @@ -16,121 +16,101 @@ public class ClientParameter { @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_m") static final ClientParameter __ji_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_f") static final ClientParameter __ji_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_q") static final ClientParameter __ji_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_w") static final ClientParameter __ji_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_o") static final ClientParameter __ji_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_u") static final ClientParameter __ji_u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_g") static final ClientParameter __ji_g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_l") static final ClientParameter __ji_l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_e") static final ClientParameter __ji_e; @ObfuscatedName("x") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_x") static final ClientParameter __ji_x; @ObfuscatedName("d") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_d") static final ClientParameter __ji_d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_k") static final ClientParameter __ji_k; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_n") public static final ClientParameter __ji_n; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_i") public static final ClientParameter __ji_i; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_a") static final ClientParameter __ji_a; @ObfuscatedName("z") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_z") static final ClientParameter __ji_z; @ObfuscatedName("j") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_j") static final ClientParameter __ji_j; @ObfuscatedName("s") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_s") static final ClientParameter __ji_s; @ObfuscatedName("t") @ObfuscatedSignature( signature = "Lji;" ) - @Export("__ji_t") static final ClientParameter __ji_t; @ObfuscatedName("fp") @ObfuscatedSignature( signature = "Lfu;" ) - @Export("__ji_fp") static AbstractSocket __ji_fp; @ObfuscatedName("y") @Export("id") diff --git a/runescape-client/src/main/java/ClientPreferences.java b/runescape-client/src/main/java/ClientPreferences.java index fdde50a4f3..33ece76295 100644 --- a/runescape-client/src/main/java/ClientPreferences.java +++ b/runescape-client/src/main/java/ClientPreferences.java @@ -14,7 +14,6 @@ public class ClientPreferences { @ObfuscatedGetter( intValue = 1548448409 ) - @Export("__bf_m") static int __bf_m; @ObfuscatedName("gr") @ObfuscatedSignature( @@ -110,7 +109,6 @@ public class ClientPreferences { signature = "(ZI)V", garbageValue = "1213718182" ) - @Export("__m_150") void __m_150(boolean var1) { } diff --git a/runescape-client/src/main/java/CollisionMap.java b/runescape-client/src/main/java/CollisionMap.java index 7d335a8657..a55c80bc1b 100644 --- a/runescape-client/src/main/java/CollisionMap.java +++ b/runescape-client/src/main/java/CollisionMap.java @@ -68,7 +68,6 @@ public class CollisionMap { signature = "(IIIIZB)V", garbageValue = "2" ) - @Export("__f_283") public void __f_283(int var1, int var2, int var3, int var4, boolean var5) { var1 -= this.xInset; var2 -= this.yInset; @@ -221,7 +220,6 @@ public class CollisionMap { signature = "(IIIIZI)V", garbageValue = "1813281219" ) - @Export("__q_284") public void __q_284(int var1, int var2, int var3, int var4, boolean var5) { int var6 = 256; if(var5) { @@ -248,7 +246,6 @@ public class CollisionMap { signature = "(III)V", garbageValue = "1082834717" ) - @Export("__w_285") public void __w_285(int var1, int var2) { var1 -= this.xInset; var2 -= this.yInset; @@ -260,7 +257,6 @@ public class CollisionMap { signature = "(III)V", garbageValue = "2022671149" ) - @Export("__o_286") public void __o_286(int var1, int var2) { var1 -= this.xInset; var2 -= this.yInset; @@ -272,7 +268,6 @@ public class CollisionMap { signature = "(IIII)V", garbageValue = "953350100" ) - @Export("__u_287") void __u_287(int var1, int var2, int var3) { this.flags[var1][var2] |= var3; } @@ -282,7 +277,6 @@ public class CollisionMap { signature = "(IIIIZB)V", garbageValue = "54" ) - @Export("__g_288") public void __g_288(int var1, int var2, int var3, int var4, boolean var5) { var1 -= this.xInset; var2 -= this.yInset; @@ -435,7 +429,6 @@ public class CollisionMap { signature = "(IIIIIZB)V", garbageValue = "23" ) - @Export("__l_289") public void __l_289(int var1, int var2, int var3, int var4, int var5, boolean var6) { int var7 = 256; if(var6) { @@ -468,7 +461,6 @@ public class CollisionMap { signature = "(IIII)V", garbageValue = "52290294" ) - @Export("__e_290") void __e_290(int var1, int var2, int var3) { this.flags[var1][var2] &= ~var3; } @@ -478,7 +470,6 @@ public class CollisionMap { signature = "(IIB)V", garbageValue = "37" ) - @Export("__x_291") public void __x_291(int var1, int var2) { var1 -= this.xInset; var2 -= this.yInset; diff --git a/runescape-client/src/main/java/DesktopPlatformInfoProvider.java b/runescape-client/src/main/java/DesktopPlatformInfoProvider.java index c99809fbaf..b04a824018 100644 --- a/runescape-client/src/main/java/DesktopPlatformInfoProvider.java +++ b/runescape-client/src/main/java/DesktopPlatformInfoProvider.java @@ -1,4 +1,5 @@ import java.util.Random; +import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -11,6 +12,7 @@ public class DesktopPlatformInfoProvider implements PlatformInfoProvider { signature = "(I)Llb;", garbageValue = "-843739713" ) + @Export("get") public PlatformInfo get() { byte var1; if(WorldMapSection3.osNameLowerCase.startsWith("win")) { diff --git a/runescape-client/src/main/java/DevicePcmPlayerProvider.java b/runescape-client/src/main/java/DevicePcmPlayerProvider.java index 35d3383bd7..91034e8a5c 100644 --- a/runescape-client/src/main/java/DevicePcmPlayerProvider.java +++ b/runescape-client/src/main/java/DevicePcmPlayerProvider.java @@ -26,6 +26,7 @@ public class DevicePcmPlayerProvider implements PcmPlayerProvider { signature = "(B)Lco;", garbageValue = "-49" ) + @Export("player") public PcmPlayer player() { return new DevicePcmPlayer(); } diff --git a/runescape-client/src/main/java/DirectByteArrayCopier.java b/runescape-client/src/main/java/DirectByteArrayCopier.java index 546bc285e8..0bf9f0d78a 100644 --- a/runescape-client/src/main/java/DirectByteArrayCopier.java +++ b/runescape-client/src/main/java/DirectByteArrayCopier.java @@ -16,6 +16,7 @@ public class DirectByteArrayCopier extends AbstractByteArrayCopier { signature = "(I)[B", garbageValue = "-1219910462" ) + @Export("get") byte[] get() { byte[] var1 = new byte[this.directBuffer.capacity()]; this.directBuffer.position(0); @@ -28,6 +29,7 @@ public class DirectByteArrayCopier extends AbstractByteArrayCopier { signature = "([BI)V", garbageValue = "-2034091753" ) + @Export("set") void set(byte[] var1) { this.directBuffer = ByteBuffer.allocateDirect(var1.length); this.directBuffer.position(0); diff --git a/runescape-client/src/main/java/DirectWrapper.java b/runescape-client/src/main/java/DirectWrapper.java index cf3f5cab78..64bb73c154 100644 --- a/runescape-client/src/main/java/DirectWrapper.java +++ b/runescape-client/src/main/java/DirectWrapper.java @@ -15,11 +15,13 @@ public class DirectWrapper extends Wrapper { } @ObfuscatedName("m") + @Export("get") Object get() { return this.obj; } @ObfuscatedName("f") + @Export("isSoft") boolean isSoft() { return false; } diff --git a/runescape-client/src/main/java/DynamicObject.java b/runescape-client/src/main/java/DynamicObject.java index 98cfafac12..af0b3ff97a 100644 --- a/runescape-client/src/main/java/DynamicObject.java +++ b/runescape-client/src/main/java/DynamicObject.java @@ -107,6 +107,7 @@ public class DynamicObject extends Entity { signature = "(I)Ldu;", garbageValue = "-2134947096" ) + @Export("getModel") protected final Model getModel() { if(this.sequenceDefinition != null) { int var1 = Client.cycle - this.cycleStart; diff --git a/runescape-client/src/main/java/Enumerated.java b/runescape-client/src/main/java/Enumerated.java index 9667cfd0d9..65f99d25ad 100644 --- a/runescape-client/src/main/java/Enumerated.java +++ b/runescape-client/src/main/java/Enumerated.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -10,5 +11,6 @@ public interface Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") int rsOrdinal(); } diff --git a/runescape-client/src/main/java/EvictingDualNodeHashTable.java b/runescape-client/src/main/java/EvictingDualNodeHashTable.java index 0201ac4f50..c655b8180b 100644 --- a/runescape-client/src/main/java/EvictingDualNodeHashTable.java +++ b/runescape-client/src/main/java/EvictingDualNodeHashTable.java @@ -10,7 +10,6 @@ public final class EvictingDualNodeHashTable { @ObfuscatedSignature( signature = "Lfn;" ) - @Export("__m") DualNode __m; @ObfuscatedName("f") @Export("capacity") diff --git a/runescape-client/src/main/java/FaceNormal.java b/runescape-client/src/main/java/FaceNormal.java index c301844a78..88ab031bd5 100644 --- a/runescape-client/src/main/java/FaceNormal.java +++ b/runescape-client/src/main/java/FaceNormal.java @@ -14,31 +14,26 @@ public class FaceNormal { @ObfuscatedGetter( intValue = 422473713 ) - @Export("__el_x") public static int __el_x; @ObfuscatedName("gm") @ObfuscatedSignature( signature = "Lln;" ) - @Export("__el_gm") static Sprite __el_gm; @ObfuscatedName("m") @ObfuscatedGetter( intValue = -2074333261 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -1376860893 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 2619977 ) - @Export("__q") int __q; @ObfuscatedName("f") diff --git a/runescape-client/src/main/java/Font.java b/runescape-client/src/main/java/Font.java index 57d955d98c..55ef8f5fe3 100644 --- a/runescape-client/src/main/java/Font.java +++ b/runescape-client/src/main/java/Font.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; @@ -13,6 +14,7 @@ public final class Font extends AbstractFont { } @ObfuscatedName("m") + @Export("drawGlyph") final void drawGlyph(byte[] var1, int var2, int var3, int var4, int var5, int var6) { int var7 = var3 * Rasterizer2D.Rasterizer2D_width + var2; int var8 = Rasterizer2D.Rasterizer2D_width - var4; @@ -54,6 +56,7 @@ public final class Font extends AbstractFont { } @ObfuscatedName("f") + @Export("drawGlyphAlpha") final void drawGlyphAlpha(byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7) { int var8 = var3 * Rasterizer2D.Rasterizer2D_width + var2; int var9 = Rasterizer2D.Rasterizer2D_width - var4; diff --git a/runescape-client/src/main/java/FontName.java b/runescape-client/src/main/java/FontName.java index e6996f3685..89099885cc 100644 --- a/runescape-client/src/main/java/FontName.java +++ b/runescape-client/src/main/java/FontName.java @@ -43,7 +43,6 @@ public class FontName { @Export("FontName_verdana15") public static final FontName FontName_verdana15; @ObfuscatedName("g") - @Export("__g") String __g; static { @@ -78,6 +77,7 @@ public class FontName { signature = "(I)V", garbageValue = "-1587423260" ) + @Export("closeWorldSelect") static void closeWorldSelect() { Login.worldSelectOpen = false; Login.leftTitleSprite.drawAt(Login.xPadding, 0); diff --git a/runescape-client/src/main/java/Fonts.java b/runescape-client/src/main/java/Fonts.java index fcb36dfb17..98f2077878 100644 --- a/runescape-client/src/main/java/Fonts.java +++ b/runescape-client/src/main/java/Fonts.java @@ -14,7 +14,6 @@ public class Fonts { @Export("indexStore255") static IndexStore indexStore255; @ObfuscatedName("o") - @Export("__kz_o") static byte[][][] __kz_o; @ObfuscatedName("l") @ObfuscatedSignature( @@ -26,13 +25,11 @@ public class Fonts { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__m") AbstractIndexCache __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__f") AbstractIndexCache __f; @ObfuscatedName("q") @Export("map") diff --git a/runescape-client/src/main/java/Formatting.java b/runescape-client/src/main/java/Formatting.java index 554a403061..1a656b9e0a 100644 --- a/runescape-client/src/main/java/Formatting.java +++ b/runescape-client/src/main/java/Formatting.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Formatting") public class Formatting { @ObfuscatedName("d") - @Export("__cy_d") static int[] __cy_d; @ObfuscatedName("dh") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/Friend.java b/runescape-client/src/main/java/Friend.java index 7fb5401ec7..946be4825c 100644 --- a/runescape-client/src/main/java/Friend.java +++ b/runescape-client/src/main/java/Friend.java @@ -11,10 +11,8 @@ public class Friend extends Buddy { @Export("soundSystemExecutor") static ScheduledExecutorService soundSystemExecutor; @ObfuscatedName("m") - @Export("__m") boolean __m; @ObfuscatedName("f") - @Export("__f") boolean __f; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/FriendLoginUpdate.java b/runescape-client/src/main/java/FriendLoginUpdate.java index 950f6b6589..8745b5bdc2 100644 --- a/runescape-client/src/main/java/FriendLoginUpdate.java +++ b/runescape-client/src/main/java/FriendLoginUpdate.java @@ -11,7 +11,6 @@ public class FriendLoginUpdate extends Link { @ObfuscatedSignature( signature = "Ley;" ) - @Export("__kn_x") static UrlRequest __kn_x; @ObfuscatedName("q") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/FriendSystem.java b/runescape-client/src/main/java/FriendSystem.java index eddea33e3f..908cc6f100 100644 --- a/runescape-client/src/main/java/FriendSystem.java +++ b/runescape-client/src/main/java/FriendSystem.java @@ -29,7 +29,6 @@ public class FriendSystem { @ObfuscatedGetter( intValue = 1477282369 ) - @Export("__g") int __g; @ObfuscatedSignature( @@ -47,7 +46,6 @@ public class FriendSystem { signature = "(B)Z", garbageValue = "-114" ) - @Export("__m_151") boolean __m_151() { return this.__g == 2; } @@ -57,7 +55,6 @@ public class FriendSystem { signature = "(I)V", garbageValue = "-2125539725" ) - @Export("__f_152") final void __f_152() { this.__g = 1; } @@ -67,7 +64,6 @@ public class FriendSystem { signature = "(Lgr;II)V", garbageValue = "-1440726810" ) - @Export("__q_153") final void __q_153(Buffer var1, int var2) { this.friendsList.read(var1, var2); this.__g = 2; @@ -79,7 +75,6 @@ public class FriendSystem { signature = "(I)V", garbageValue = "-1408945788" ) - @Export("__w_154") final void __w_154() { for(FriendLoginUpdate var1 = (FriendLoginUpdate)this.friendsList.friendLoginUpdates.__f_438(); var1 != null; var1 = (FriendLoginUpdate)this.friendsList.friendLoginUpdates.__q_439()) { if((long)var1.time < class203.currentTimeMs() / 1000L - 5L) { @@ -134,7 +129,6 @@ public class FriendSystem { signature = "(Ljava/lang/String;I)V", garbageValue = "-1721017960" ) - @Export("__l_157") final void __l_157(String var1) { if(var1 != null) { Username var2 = new Username(var1, this.loginType); @@ -179,7 +173,6 @@ public class FriendSystem { signature = "(B)Z", garbageValue = "57" ) - @Export("__e_158") final boolean __e_158() { return this.friendsList.isFull() || this.friendsList.size() >= 200 && Client.__client_jo != 1; } @@ -189,7 +182,6 @@ public class FriendSystem { signature = "(Ljava/lang/String;B)V", garbageValue = "30" ) - @Export("__x_159") final void __x_159(String var1) { if(var1 != null) { Username var2 = new Username(var1, this.loginType); @@ -228,7 +220,6 @@ public class FriendSystem { signature = "(B)Z", garbageValue = "120" ) - @Export("__a_160") final boolean __a_160() { return this.ignoreList.isFull() || this.ignoreList.size() >= 100 && Client.__client_jo != 1; } diff --git a/runescape-client/src/main/java/FriendsList.java b/runescape-client/src/main/java/FriendsList.java index e8832d1c43..b39fda53a7 100644 --- a/runescape-client/src/main/java/FriendsList.java +++ b/runescape-client/src/main/java/FriendsList.java @@ -17,7 +17,6 @@ public class FriendsList extends UserList { @ObfuscatedGetter( intValue = -217526077 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedSignature( @@ -41,6 +40,7 @@ public class FriendsList extends UserList { signature = "(I)Ljs;", garbageValue = "-2063112195" ) + @Export("newInstance") User newInstance() { return new Friend(); } @@ -50,6 +50,7 @@ public class FriendsList extends UserList { signature = "(II)[Ljs;", garbageValue = "861814350" ) + @Export("newTypedArray") User[] newTypedArray(int var1) { return new Friend[var1]; } diff --git a/runescape-client/src/main/java/GameObject.java b/runescape-client/src/main/java/GameObject.java index 85f50711d9..8bb9660616 100644 --- a/runescape-client/src/main/java/GameObject.java +++ b/runescape-client/src/main/java/GameObject.java @@ -17,7 +17,6 @@ public final class GameObject { @ObfuscatedGetter( intValue = -457229589 ) - @Export("__eh_fy") static int __eh_fy; @ObfuscatedName("m") @ObfuscatedGetter( @@ -83,7 +82,6 @@ public final class GameObject { @ObfuscatedGetter( intValue = 1941106389 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/GameShell.java b/runescape-client/src/main/java/GameShell.java index 0fb0767d13..dad3bf2500 100644 --- a/runescape-client/src/main/java/GameShell.java +++ b/runescape-client/src/main/java/GameShell.java @@ -43,7 +43,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @ObfuscatedGetter( intValue = -281664295 ) - @Export("__ba_q") static int __ba_q; @ObfuscatedName("o") @ObfuscatedGetter( @@ -58,19 +57,16 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @ObfuscatedGetter( intValue = -1179083285 ) - @Export("__ba_l") static int __ba_l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -1698831905 ) - @Export("__ba_e") static int __ba_e; @ObfuscatedName("d") @ObfuscatedGetter( intValue = 425367827 ) - @Export("__ba_d") static int __ba_d; @ObfuscatedName("k") @ObfuscatedGetter( @@ -79,22 +75,18 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @Export("fps") protected static int fps; @ObfuscatedName("a") - @Export("__ba_a") static long[] __ba_a; @ObfuscatedName("j") - @Export("__ba_j") static long[] __ba_j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = -2078849253 ) - @Export("__ba_s") static int __ba_s; @ObfuscatedName("aw") @ObfuscatedGetter( intValue = -1042005999 ) - @Export("__ba_aw") static int __ba_aw; @ObfuscatedName("an") @Export("hasFocus") @@ -175,7 +167,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene @Export("canvas") java.awt.Canvas canvas; @ObfuscatedName("ah") - @Export("__ah") volatile boolean __ah; @ObfuscatedName("al") @Export("resizeCanvasNextFrame") @@ -405,7 +396,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "-1773624745" ) - @Export("__j_113") protected abstract void __j_113(); @ObfuscatedName("p") @@ -613,7 +603,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(B)V", garbageValue = "0" ) - @Export("__av_93") void __av_93() { long var1 = class203.currentTimeMs(); long var3 = __ba_j[__ba_s]; @@ -635,7 +624,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(B)V", garbageValue = "-2" ) - @Export("__ar_94") void __ar_94() { Container var1 = this.container(); long var2 = class203.currentTimeMs(); @@ -678,7 +666,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "-1999661001" ) - @Export("__ac_95") final void __ac_95() { Bounds var1 = this.getFrameContentBounds(); if(var1.__q != this.contentWidth || this.contentHeight != var1.__w || this.resizeCanvasNextFrame) { @@ -693,7 +680,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "1147427427" ) - @Export("__ay_96") final void __ay_96() { this.resizeCanvasNextFrame = true; } @@ -753,7 +739,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "1445885427" ) - @Export("__al_111") protected abstract void __al_111(); @ObfuscatedName("ab") @@ -833,7 +818,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "-1283386969" ) - @Export("__ad_108") protected final void __ad_108() { PlayerType.__ij_ak = null; class231.__hb_av = null; @@ -904,10 +888,8 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene signature = "(I)V", garbageValue = "1860808291" ) - @Export("__au_110") protected abstract void __au_110(); - @Export("__destroy_99") @ObfuscatedName("destroy") public final void __destroy_99() { if(this == gameShell && !isKilled) { @@ -993,7 +975,6 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene this.kill(); } - @Export("__start_97") @ObfuscatedName("start") public final void __start_97() { if(this == gameShell && !isKilled) { @@ -1040,11 +1021,9 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene public final void windowOpened(WindowEvent var1) { } - @Export("__init_109") @ObfuscatedName("init") public abstract void __init_109(); - @Export("__stop_98") @ObfuscatedName("stop") public final void __stop_98() { if(this == gameShell && !isKilled) { diff --git a/runescape-client/src/main/java/GrandExchangeEvent.java b/runescape-client/src/main/java/GrandExchangeEvent.java index 023a265615..07f41da157 100644 --- a/runescape-client/src/main/java/GrandExchangeEvent.java +++ b/runescape-client/src/main/java/GrandExchangeEvent.java @@ -17,7 +17,6 @@ public class GrandExchangeEvent { @ObfuscatedGetter( longValue = -6503890758391257651L ) - @Export("__f") public final long __f; @ObfuscatedName("q") @ObfuscatedSignature( @@ -57,7 +56,6 @@ public class GrandExchangeEvent { signature = "(I)Ljava/lang/String;", garbageValue = "1672323214" ) - @Export("__m_3") public String __m_3() { return this.string1; } @@ -67,7 +65,6 @@ public class GrandExchangeEvent { signature = "(I)Ljava/lang/String;", garbageValue = "-271438207" ) - @Export("__f_4") public String __f_4() { return this.string2; } diff --git a/runescape-client/src/main/java/GrandExchangeEvents.java b/runescape-client/src/main/java/GrandExchangeEvents.java index 456dcb0691..fba00b388a 100644 --- a/runescape-client/src/main/java/GrandExchangeEvents.java +++ b/runescape-client/src/main/java/GrandExchangeEvents.java @@ -12,22 +12,17 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("GrandExchangeEvents") public class GrandExchangeEvents { @ObfuscatedName("f") - @Export("__g_f") public static Comparator __g_f; @ObfuscatedName("q") - @Export("__g_q") public static Comparator __g_q; @ObfuscatedName("w") - @Export("__g_w") public static Comparator __g_w; @ObfuscatedName("o") - @Export("__g_o") public static Comparator __g_o; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1605454211 ) - @Export("__g_z") static int __g_z; @ObfuscatedName("hs") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/GrandExchangeOffer.java b/runescape-client/src/main/java/GrandExchangeOffer.java index 93636a2511..07df2e51e1 100644 --- a/runescape-client/src/main/java/GrandExchangeOffer.java +++ b/runescape-client/src/main/java/GrandExchangeOffer.java @@ -12,7 +12,6 @@ public class GrandExchangeOffer { @ObfuscatedGetter( intValue = -1286287981 ) - @Export("__x_rg") static int __x_rg; @ObfuscatedName("l") @ObfuscatedGetter( @@ -95,7 +94,6 @@ public class GrandExchangeOffer { signature = "(II)V", garbageValue = "1339285061" ) - @Export("__o_9") void __o_9(int var1) { this.state &= -8; this.state = (byte)(this.state | var1 & 7); @@ -106,7 +104,6 @@ public class GrandExchangeOffer { signature = "(II)V", garbageValue = "743094900" ) - @Export("__u_10") void __u_10(int var1) { this.state &= -9; if(var1 == 1) { diff --git a/runescape-client/src/main/java/GraphicsObject.java b/runescape-client/src/main/java/GraphicsObject.java index 19433596b2..e717317aa6 100644 --- a/runescape-client/src/main/java/GraphicsObject.java +++ b/runescape-client/src/main/java/GraphicsObject.java @@ -11,7 +11,6 @@ public final class GraphicsObject extends Entity { @ObfuscatedGetter( intValue = -1807262579 ) - @Export("__bw_d") static int __bw_d; @ObfuscatedName("k") @ObfuscatedSignature( @@ -130,6 +129,7 @@ public final class GraphicsObject extends Entity { signature = "(I)Ldu;", garbageValue = "-2134947096" ) + @Export("getModel") protected final Model getModel() { SpotAnimationDefinition var1 = class50.getSpotAnimationDefinition(this.id); Model var2; diff --git a/runescape-client/src/main/java/GroundItem.java b/runescape-client/src/main/java/GroundItem.java index 223075772e..515facdfdb 100644 --- a/runescape-client/src/main/java/GroundItem.java +++ b/runescape-client/src/main/java/GroundItem.java @@ -25,6 +25,7 @@ public final class GroundItem extends Entity { signature = "(I)Ldu;", garbageValue = "-2134947096" ) + @Export("getModel") protected final Model getModel() { return Skills.getItemDefinition(this.id).getModel(this.quantity); } diff --git a/runescape-client/src/main/java/GzipDecompressor.java b/runescape-client/src/main/java/GzipDecompressor.java index 1e2fb1a529..26ba4cbf74 100644 --- a/runescape-client/src/main/java/GzipDecompressor.java +++ b/runescape-client/src/main/java/GzipDecompressor.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("GzipDecompressor") public class GzipDecompressor { @ObfuscatedName("ck") - @Export("__go_ck") public static char __go_ck; @ObfuscatedName("m") @Export("inflater") diff --git a/runescape-client/src/main/java/HealthBarDefinition.java b/runescape-client/src/main/java/HealthBarDefinition.java index 80128ffc07..b147b45c00 100644 --- a/runescape-client/src/main/java/HealthBarDefinition.java +++ b/runescape-client/src/main/java/HealthBarDefinition.java @@ -11,13 +11,11 @@ public class HealthBarDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ii_m") public static AbstractIndexCache __ii_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ii_f") public static AbstractIndexCache __ii_f; @ObfuscatedName("q") @ObfuscatedSignature( @@ -41,7 +39,6 @@ public class HealthBarDefinition extends DualNode { @ObfuscatedGetter( intValue = 1515955705 ) - @Export("__o") public int __o; @ObfuscatedName("l") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/HitSplatDefinition.java b/runescape-client/src/main/java/HitSplatDefinition.java index 50370c62b4..961a1c899c 100644 --- a/runescape-client/src/main/java/HitSplatDefinition.java +++ b/runescape-client/src/main/java/HitSplatDefinition.java @@ -11,19 +11,16 @@ public class HitSplatDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jm_m") static AbstractIndexCache __jm_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jm_f") static AbstractIndexCache __jm_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jm_q") static AbstractIndexCache __jm_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -35,7 +32,6 @@ public class HitSplatDefinition extends DualNode { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jm_o") static EvictingDualNodeHashTable __jm_o; @ObfuscatedName("u") @ObfuscatedSignature( @@ -53,70 +49,58 @@ public class HitSplatDefinition extends DualNode { @ObfuscatedGetter( intValue = -1151968735 ) - @Export("surfaceOffsetY") public int __n; @ObfuscatedName("i") @ObfuscatedGetter( intValue = -102270561 ) - @Export("__i") public int __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -1533306389 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1677628889 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = 1683792491 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 1845590719 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedGetter( intValue = -389283589 ) - @Export("__t") public int __t; @ObfuscatedName("y") @ObfuscatedGetter( intValue = 1751286975 ) - @Export("__y") public int __y; @ObfuscatedName("h") @ObfuscatedGetter( intValue = 199815415 ) - @Export("__h") public int __h; @ObfuscatedName("b") - @Export("__b") String __b; @ObfuscatedName("c") @ObfuscatedGetter( intValue = 1003116765 ) - @Export("__c") public int __c; @ObfuscatedName("r") @ObfuscatedGetter( intValue = 1498880475 ) - @Export("__r") public int __r; @ObfuscatedName("p") @Export("transforms") @@ -292,7 +276,6 @@ public class HitSplatDefinition extends DualNode { signature = "(I)Lln;", garbageValue = "-1692599381" ) - @Export("__g_417") public Sprite __g_417() { if(this.__a < 0) { return null; @@ -316,7 +299,6 @@ public class HitSplatDefinition extends DualNode { signature = "(B)Lln;", garbageValue = "-15" ) - @Export("__l_418") public Sprite __l_418() { if(this.__z < 0) { return null; @@ -340,7 +322,6 @@ public class HitSplatDefinition extends DualNode { signature = "(B)Lln;", garbageValue = "-49" ) - @Export("__e_419") public Sprite __e_419() { if(this.__j < 0) { return null; @@ -364,7 +345,6 @@ public class HitSplatDefinition extends DualNode { signature = "(I)Lln;", garbageValue = "393569067" ) - @Export("__x_420") public Sprite __x_420() { if(this.__s < 0) { return null; diff --git a/runescape-client/src/main/java/Huffman.java b/runescape-client/src/main/java/Huffman.java index 4561d9a722..cf37ace67f 100644 --- a/runescape-client/src/main/java/Huffman.java +++ b/runescape-client/src/main/java/Huffman.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Huffman") public class Huffman { @ObfuscatedName("e") - @Export("__gd_e") static int[][] __gd_e; @ObfuscatedName("p") @ObfuscatedGetter( @@ -17,13 +16,10 @@ public class Huffman { @Export("canvasHeight") public static int canvasHeight; @ObfuscatedName("m") - @Export("__m") int[] __m; @ObfuscatedName("f") - @Export("__f") byte[] __f; @ObfuscatedName("q") - @Export("__q") int[] __q; public Huffman(byte[] var1) { @@ -114,7 +110,6 @@ public class Huffman { signature = "([BII[BIB)I", garbageValue = "64" ) - @Export("__m_293") public int __m_293(byte[] var1, int var2, int var3, byte[] var4, int var5) { int var6 = 0; int var7 = var5 << 3; @@ -165,7 +160,6 @@ public class Huffman { signature = "([BI[BIII)I", garbageValue = "-2094399899" ) - @Export("__f_294") public int __f_294(byte[] var1, int var2, byte[] var3, int var4, int var5) { if(var5 == 0) { return 0; diff --git a/runescape-client/src/main/java/IgnoreList.java b/runescape-client/src/main/java/IgnoreList.java index 17bef395e7..3257e5fa90 100644 --- a/runescape-client/src/main/java/IgnoreList.java +++ b/runescape-client/src/main/java/IgnoreList.java @@ -26,6 +26,7 @@ public class IgnoreList extends UserList { signature = "(I)Ljs;", garbageValue = "-2063112195" ) + @Export("newInstance") User newInstance() { return new Ignored(); } @@ -35,6 +36,7 @@ public class IgnoreList extends UserList { signature = "(II)[Ljs;", garbageValue = "861814350" ) + @Export("newTypedArray") User[] newTypedArray(int var1) { return new Ignored[var1]; } diff --git a/runescape-client/src/main/java/Ignored.java b/runescape-client/src/main/java/Ignored.java index 1a0cca68eb..87c2827f60 100644 --- a/runescape-client/src/main/java/Ignored.java +++ b/runescape-client/src/main/java/Ignored.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Ignored") public class Ignored extends User { @ObfuscatedName("at") - @Export("__ks_at") protected static String __ks_at; @ObfuscatedName("m") @ObfuscatedGetter( @@ -48,9 +47,9 @@ public class Ignored extends User { ) @Export("queueSoundEffect") static void queueSoundEffect(int var0, int var1, int var2) { - if(Client.__client_qp != 0 && var1 != 0 && Client.soundEffectCount < 50) { + if(Client.soundEffectVolume != 0 && var1 != 0 && Client.soundEffectCount < 50) { Client.soundEffectIds[Client.soundEffectCount] = var0; - Client.unknownSoundValues1[Client.soundEffectCount] = var1; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var1; Client.queuedSoundEffectDelays[Client.soundEffectCount] = var2; Client.soundEffects[Client.soundEffectCount] = null; Client.soundLocations[Client.soundEffectCount] = 0; diff --git a/runescape-client/src/main/java/IndexCache.java b/runescape-client/src/main/java/IndexCache.java index e10c660ead..6f39f6bf7b 100644 --- a/runescape-client/src/main/java/IndexCache.java +++ b/runescape-client/src/main/java/IndexCache.java @@ -30,10 +30,8 @@ public class IndexCache extends AbstractIndexCache { @Export("index") int index; @ObfuscatedName("v") - @Export("__v") volatile boolean __v; @ObfuscatedName("ag") - @Export("__ag") boolean __ag; @ObfuscatedName("aq") @Export("validArchives") @@ -54,7 +52,6 @@ public class IndexCache extends AbstractIndexCache { @ObfuscatedGetter( intValue = -1884661133 ) - @Export("__ac") int __ac; static { @@ -106,6 +103,7 @@ public class IndexCache extends AbstractIndexCache { signature = "(II)I", garbageValue = "-1809769865" ) + @Export("archiveLoadPercent") int archiveLoadPercent(int var1) { return super.archives[var1] != null?100:(this.validArchives[var1]?100:class54.method1086(this.index, var1)); } @@ -115,6 +113,7 @@ public class IndexCache extends AbstractIndexCache { signature = "(II)V", garbageValue = "-1829145107" ) + @Export("loadArchive") void loadArchive(int var1) { if(this.indexStore != null && this.validArchives != null && this.validArchives[var1]) { IndexStore var2 = this.indexStore; @@ -146,7 +145,6 @@ public class IndexCache extends AbstractIndexCache { signature = "(I)Z", garbageValue = "1750279412" ) - @Export("__cx_404") public boolean __cx_404() { return this.__v; } @@ -156,7 +154,6 @@ public class IndexCache extends AbstractIndexCache { signature = "(I)I", garbageValue = "1671499504" ) - @Export("__ca_405") public int __ca_405() { if(this.__v) { return 100; @@ -357,7 +354,6 @@ public class IndexCache extends AbstractIndexCache { signature = "(IB)Z", garbageValue = "0" ) - @Export("__dn_407") public boolean __dn_407(int var1) { return this.validArchives[var1]; } @@ -367,7 +363,6 @@ public class IndexCache extends AbstractIndexCache { signature = "(II)Z", garbageValue = "1419648188" ) - @Export("__df_408") public boolean __df_408(int var1) { return this.__j_395(var1) != null; } @@ -480,23 +475,23 @@ public class IndexCache extends AbstractIndexCache { if(var4 == 4) { if(var2 == 0) { - Client.__client_qp = 127; + Client.soundEffectVolume = 127; } if(var2 == 1) { - Client.__client_qp = 96; + Client.soundEffectVolume = 96; } if(var2 == 2) { - Client.__client_qp = 64; + Client.soundEffectVolume = 64; } if(var2 == 3) { - Client.__client_qp = 32; + Client.soundEffectVolume = 32; } if(var2 == 4) { - Client.__client_qp = 0; + Client.soundEffectVolume = 0; } } diff --git a/runescape-client/src/main/java/IndexCacheLoader.java b/runescape-client/src/main/java/IndexCacheLoader.java index 9003278964..352fa614f5 100644 --- a/runescape-client/src/main/java/IndexCacheLoader.java +++ b/runescape-client/src/main/java/IndexCacheLoader.java @@ -19,13 +19,11 @@ public class IndexCacheLoader { @Export("titlebuttonSprite") static IndexedSprite titlebuttonSprite; @ObfuscatedName("x") - @Export("__bd_x") public static short[][] __bd_x; @ObfuscatedName("er") @ObfuscatedGetter( intValue = 636454135 ) - @Export("__bd_er") static int __bd_er; @ObfuscatedName("gw") @Export("regionMapArchiveIds") @@ -40,13 +38,11 @@ public class IndexCacheLoader { @ObfuscatedGetter( intValue = 1459455501 ) - @Export("__q") final int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 782003089 ) - @Export("__w") int __w; @ObfuscatedSignature( @@ -63,7 +59,6 @@ public class IndexCacheLoader { signature = "(I)Z", garbageValue = "1352221725" ) - @Export("__m_122") boolean __m_122() { this.__w = 0; diff --git a/runescape-client/src/main/java/IndexStoreAction.java b/runescape-client/src/main/java/IndexStoreAction.java index db7bb30f1e..99aa4acd1b 100644 --- a/runescape-client/src/main/java/IndexStoreAction.java +++ b/runescape-client/src/main/java/IndexStoreAction.java @@ -11,7 +11,6 @@ public class IndexStoreAction extends Node { @ObfuscatedGetter( intValue = -1086790653 ) - @Export("__ik_rt") static int __ik_rt; @ObfuscatedName("a") @ObfuscatedSignature( @@ -23,7 +22,6 @@ public class IndexStoreAction extends Node { @ObfuscatedGetter( intValue = -1753937079 ) - @Export("__ik_cn") public static int __ik_cn; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/IndexStoreActionHandler.java b/runescape-client/src/main/java/IndexStoreActionHandler.java index 3df9d6688d..5d0c97e34c 100644 --- a/runescape-client/src/main/java/IndexStoreActionHandler.java +++ b/runescape-client/src/main/java/IndexStoreActionHandler.java @@ -23,7 +23,6 @@ public class IndexStoreActionHandler implements Runnable { @ObfuscatedGetter( intValue = -1282224505 ) - @Export("__iv_q") static int __iv_q; @ObfuscatedName("w") @Export("IndexStoreActionHandler_lock") diff --git a/runescape-client/src/main/java/IndexedSprite.java b/runescape-client/src/main/java/IndexedSprite.java index 67fb180a08..9a0e481697 100644 --- a/runescape-client/src/main/java/IndexedSprite.java +++ b/runescape-client/src/main/java/IndexedSprite.java @@ -131,7 +131,6 @@ public final class IndexedSprite extends Rasterizer2D { } @ObfuscatedName("o") - @Export("__o_497") public void __o_497(int var1, int var2, int var3, int var4) { int var5 = this.subWidth; int var6 = this.subHeight; diff --git a/runescape-client/src/main/java/Instrument.java b/runescape-client/src/main/java/Instrument.java index f12708ef4a..e6f6ae9645 100644 --- a/runescape-client/src/main/java/Instrument.java +++ b/runescape-client/src/main/java/Instrument.java @@ -35,49 +35,41 @@ public class Instrument { @ObfuscatedSignature( signature = "Lde;" ) - @Export("__m") SoundEnvelope __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__f") SoundEnvelope __f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__q") SoundEnvelope __q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__w") SoundEnvelope __w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__o") SoundEnvelope __o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__u") SoundEnvelope __u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__g") SoundEnvelope __g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lde;" ) - @Export("__l") SoundEnvelope __l; @ObfuscatedName("e") @Export("oscillatorVolume") @@ -104,7 +96,6 @@ public class Instrument { @ObfuscatedSignature( signature = "Lde;" ) - @Export("__a") SoundEnvelope __a; @ObfuscatedName("z") @Export("duration") diff --git a/runescape-client/src/main/java/Interpreter.java b/runescape-client/src/main/java/Interpreter.java index 20baed429f..61ace7fd65 100644 --- a/runescape-client/src/main/java/Interpreter.java +++ b/runescape-client/src/main/java/Interpreter.java @@ -48,22 +48,17 @@ public class Interpreter { @Export("Interpreter_calendar") static Calendar Interpreter_calendar; @ObfuscatedName("z") - @Export("__bv_z") static final String[] __bv_z; @ObfuscatedName("s") - @Export("__bv_s") static boolean __bv_s; @ObfuscatedName("t") - @Export("__bv_t") static boolean __bv_t; @ObfuscatedName("y") @ObfuscatedGetter( intValue = -1019558835 ) - @Export("__bv_y") static int __bv_y; @ObfuscatedName("r") - @Export("__bv_r") static final double __bv_r; static { @@ -141,6 +136,7 @@ public class Interpreter { signature = "(IIB)V", garbageValue = "76" ) + @Export("changeWorldSelectSorting") static void changeWorldSelectSorting(int var0, int var1) { int[] var2 = new int[4]; int[] var3 = new int[4]; diff --git a/runescape-client/src/main/java/InvDefinition.java b/runescape-client/src/main/java/InvDefinition.java index 241df58b96..922b60700a 100644 --- a/runescape-client/src/main/java/InvDefinition.java +++ b/runescape-client/src/main/java/InvDefinition.java @@ -11,7 +11,6 @@ public class InvDefinition extends DualNode { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__ib_f") static EvictingDualNodeHashTable __ib_f; @ObfuscatedName("q") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/IsaacCipher.java b/runescape-client/src/main/java/IsaacCipher.java index d6005e0f59..11f5951763 100644 --- a/runescape-client/src/main/java/IsaacCipher.java +++ b/runescape-client/src/main/java/IsaacCipher.java @@ -11,31 +11,25 @@ public final class IsaacCipher { @ObfuscatedGetter( intValue = 1514845493 ) - @Export("__w") int __w; @ObfuscatedName("o") - @Export("__o") int[] __o; @ObfuscatedName("u") - @Export("__u") int[] __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -1670027699 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -325762649 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -1951204929 ) - @Export("__e") int __e; public IsaacCipher(int[] var1) { @@ -54,7 +48,6 @@ public final class IsaacCipher { signature = "(I)I", garbageValue = "-7509790" ) - @Export("__m_336") final int __m_336() { if(0 == --this.__w + 1) { this.__q_338(); @@ -69,7 +62,6 @@ public final class IsaacCipher { signature = "(I)I", garbageValue = "-506873526" ) - @Export("__f_337") final int __f_337() { if(this.__w == 0) { this.__q_338(); @@ -84,7 +76,6 @@ public final class IsaacCipher { signature = "(B)V", garbageValue = "124" ) - @Export("__q_338") final void __q_338() { this.__l += ++this.__e; @@ -115,7 +106,6 @@ public final class IsaacCipher { signature = "(I)V", garbageValue = "579890110" ) - @Export("__w_339") final void __w_339() { int var9 = -1640531527; int var8 = -1640531527; diff --git a/runescape-client/src/main/java/ItemContainer.java b/runescape-client/src/main/java/ItemContainer.java index 577023f80e..8a99037d41 100644 --- a/runescape-client/src/main/java/ItemContainer.java +++ b/runescape-client/src/main/java/ItemContainer.java @@ -22,7 +22,6 @@ public class ItemContainer extends Node { @ObfuscatedSignature( signature = "Lit;" ) - @Export("__bc_dm") static IndexCache __bc_dm; @ObfuscatedName("f") @Export("ids") diff --git a/runescape-client/src/main/java/ItemDefinition.java b/runescape-client/src/main/java/ItemDefinition.java index 14304761f6..79a6776a68 100644 --- a/runescape-client/src/main/java/ItemDefinition.java +++ b/runescape-client/src/main/java/ItemDefinition.java @@ -47,7 +47,6 @@ public class ItemDefinition extends DualNode { @ObfuscatedGetter( intValue = 1070080857 ) - @Export("__a") int __a; @ObfuscatedName("z") @Export("name") @@ -200,10 +199,8 @@ public class ItemDefinition extends DualNode { @Export("femaleHeadModel2") int femaleHeadModel2; @ObfuscatedName("az") - @Export("__az") int[] __az; @ObfuscatedName("au") - @Export("__au") int[] __au; @ObfuscatedName("ao") @ObfuscatedGetter( @@ -493,7 +490,6 @@ public class ItemDefinition extends DualNode { signature = "(Ljv;Ljv;I)V", garbageValue = "2051877377" ) - @Export("__o_426") void __o_426(ItemDefinition var1, ItemDefinition var2) { this.__a = var1.__a; this.zoom2d = var1.zoom2d; @@ -517,7 +513,6 @@ public class ItemDefinition extends DualNode { signature = "(Ljv;Ljv;I)V", garbageValue = "227754762" ) - @Export("__u_427") void __u_427(ItemDefinition var1, ItemDefinition var2) { this.__a = var1.__a; this.zoom2d = var1.zoom2d; @@ -561,7 +556,6 @@ public class ItemDefinition extends DualNode { signature = "(Ljv;Ljv;I)V", garbageValue = "2084647027" ) - @Export("__g_428") void __g_428(ItemDefinition var1, ItemDefinition var2) { this.__a = var1.__a; this.zoom2d = var1.zoom2d; @@ -586,7 +580,6 @@ public class ItemDefinition extends DualNode { signature = "(II)Ldw;", garbageValue = "-223149161" ) - @Export("__l_429") public final ModelData __l_429(int var1) { int var3; if(this.__az != null && var1 > 1) { @@ -686,7 +679,6 @@ public class ItemDefinition extends DualNode { signature = "(IB)Ljv;", garbageValue = "0" ) - @Export("__x_430") public ItemDefinition __x_430(int var1) { if(this.__az != null && var1 > 1) { int var2 = -1; @@ -710,7 +702,6 @@ public class ItemDefinition extends DualNode { signature = "(ZI)Z", garbageValue = "-918880706" ) - @Export("__z_431") public final boolean __z_431(boolean var1) { int var2 = this.maleModel; int var3 = this.maleModel1; @@ -746,7 +737,6 @@ public class ItemDefinition extends DualNode { signature = "(ZB)Ldw;", garbageValue = "-123" ) - @Export("__j_432") public final ModelData __j_432(boolean var1) { int var2 = this.maleModel; int var3 = this.maleModel1; @@ -803,7 +793,6 @@ public class ItemDefinition extends DualNode { signature = "(ZI)Z", garbageValue = "-998582497" ) - @Export("__s_433") public final boolean __s_433(boolean var1) { int var2 = this.maleHeadModel; int var3 = this.maleHeadModel2; @@ -833,7 +822,6 @@ public class ItemDefinition extends DualNode { signature = "(ZI)Ldw;", garbageValue = "-1820885439" ) - @Export("__t_434") public final ModelData __t_434(boolean var1) { int var2 = this.maleHeadModel; int var3 = this.maleHeadModel2; diff --git a/runescape-client/src/main/java/IterableDualNodeQueue.java b/runescape-client/src/main/java/IterableDualNodeQueue.java index f08c441a67..da2bea045e 100644 --- a/runescape-client/src/main/java/IterableDualNodeQueue.java +++ b/runescape-client/src/main/java/IterableDualNodeQueue.java @@ -55,7 +55,6 @@ public class IterableDualNodeQueue implements Iterable { @ObfuscatedSignature( signature = "()Lfn;" ) - @Export("__q_448") public DualNode __q_448() { DualNode var1 = this.sentinel.previousDual; if(var1 == this.sentinel) { @@ -70,7 +69,6 @@ public class IterableDualNodeQueue implements Iterable { @ObfuscatedSignature( signature = "()Lfn;" ) - @Export("__w_449") public DualNode __w_449() { return this.__o_450((DualNode)null); } @@ -79,7 +77,6 @@ public class IterableDualNodeQueue implements Iterable { @ObfuscatedSignature( signature = "(Lfn;)Lfn;" ) - @Export("__o_450") DualNode __o_450(DualNode var1) { DualNode var2; if(var1 == null) { @@ -101,7 +98,6 @@ public class IterableDualNodeQueue implements Iterable { @ObfuscatedSignature( signature = "()Lfn;" ) - @Export("__u_451") public DualNode __u_451() { DualNode var1 = this.head; if(var1 == this.sentinel) { diff --git a/runescape-client/src/main/java/IterableDualNodeQueueIterator.java b/runescape-client/src/main/java/IterableDualNodeQueueIterator.java index 72fd6289c4..76c1205ba7 100644 --- a/runescape-client/src/main/java/IterableDualNodeQueueIterator.java +++ b/runescape-client/src/main/java/IterableDualNodeQueueIterator.java @@ -17,13 +17,11 @@ public class IterableDualNodeQueueIterator implements Iterator { @ObfuscatedSignature( signature = "Lfn;" ) - @Export("__f") DualNode __f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lfn;" ) - @Export("__q") DualNode __q; @ObfuscatedSignature( @@ -57,7 +55,6 @@ public class IterableDualNodeQueueIterator implements Iterator { return this.queue.sentinel != this.__f; } - @Export("__remove_442") @ObfuscatedName("remove") public void __remove_442() { if(this.__q == null) { diff --git a/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java b/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java index 3b1a863597..dd0e92ce91 100644 --- a/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java +++ b/runescape-client/src/main/java/IterableNodeDequeDescendingIterator.java @@ -17,13 +17,11 @@ public class IterableNodeDequeDescendingIterator implements Iterator { @ObfuscatedSignature( signature = "Lgw;" ) - @Export("__f") Node __f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lgw;" ) - @Export("__q") Node __q; @ObfuscatedSignature( @@ -38,14 +36,12 @@ public class IterableNodeDequeDescendingIterator implements Iterator { @ObfuscatedSignature( signature = "(Lja;)V" ) - @Export("__u_443") void __u_443(IterableNodeDeque var1) { this.deque = var1; this.__g_444(); } @ObfuscatedName("g") - @Export("__g_444") void __g_444() { this.__f = this.deque != null?this.deque.sentinel.previous:null; this.__q = null; @@ -72,7 +68,6 @@ public class IterableNodeDequeDescendingIterator implements Iterator { return var1; } - @Export("__remove_447") @ObfuscatedName("remove") public void __remove_447() { if(this.__q == null) { diff --git a/runescape-client/src/main/java/IterableNodeHashTableIterator.java b/runescape-client/src/main/java/IterableNodeHashTableIterator.java index f6ac847231..87ce727ad7 100644 --- a/runescape-client/src/main/java/IterableNodeHashTableIterator.java +++ b/runescape-client/src/main/java/IterableNodeHashTableIterator.java @@ -17,16 +17,13 @@ public class IterableNodeHashTableIterator implements Iterator { @ObfuscatedSignature( signature = "Lgw;" ) - @Export("__f") Node __f; @ObfuscatedName("q") - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lgw;" ) - @Export("__w") Node __w; @ObfuscatedSignature( @@ -39,7 +36,6 @@ public class IterableNodeHashTableIterator implements Iterator { } @ObfuscatedName("u") - @Export("__u_483") void __u_483() { this.__f = this.hashTable.buckets[0].previous; this.__q = 1; @@ -89,7 +85,6 @@ public class IterableNodeHashTableIterator implements Iterator { } } - @Export("__remove_486") @ObfuscatedName("remove") public void __remove_486() { if(this.__w == null) { diff --git a/runescape-client/src/main/java/KeyHandler.java b/runescape-client/src/main/java/KeyHandler.java index 48c3679ba0..7bd6aa523f 100644 --- a/runescape-client/src/main/java/KeyHandler.java +++ b/runescape-client/src/main/java/KeyHandler.java @@ -16,7 +16,6 @@ public final class KeyHandler implements KeyListener, FocusListener { @ObfuscatedGetter( intValue = -817957995 ) - @Export("__an_ra") static int __an_ra; @ObfuscatedName("m") @ObfuscatedSignature( @@ -46,52 +45,42 @@ public final class KeyHandler implements KeyListener, FocusListener { @Export("KeyHandler_pressedKeys") public static boolean[] KeyHandler_pressedKeys; @ObfuscatedName("cq") - @Export("__an_cq") static int[] __an_cq; @ObfuscatedName("ch") @ObfuscatedGetter( intValue = 1112094745 ) - @Export("__an_ch") static int __an_ch; @ObfuscatedName("cw") @ObfuscatedGetter( intValue = -1208053825 ) - @Export("__an_cw") static int __an_cw; @ObfuscatedName("cg") - @Export("__an_cg") static char[] __an_cg; @ObfuscatedName("cf") - @Export("__an_cf") static int[] __an_cf; @ObfuscatedName("cp") - @Export("__an_cp") public static int[] __an_cp; @ObfuscatedName("cl") @ObfuscatedGetter( intValue = -674534717 ) - @Export("__an_cl") public static int __an_cl; @ObfuscatedName("ct") @ObfuscatedGetter( intValue = -93280591 ) - @Export("__an_ct") static int __an_ct; @ObfuscatedName("cz") @ObfuscatedGetter( intValue = 2066759739 ) - @Export("__an_cz") static int __an_cz; @ObfuscatedName("cc") @ObfuscatedGetter( intValue = -1942898885 ) - @Export("__an_cc") static int __an_cc; @ObfuscatedName("ci") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/KitDefinition.java b/runescape-client/src/main/java/KitDefinition.java index b6311ca8de..bb2b7caf1e 100644 --- a/runescape-client/src/main/java/KitDefinition.java +++ b/runescape-client/src/main/java/KitDefinition.java @@ -17,13 +17,11 @@ public class KitDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__im_f") public static AbstractIndexCache __im_f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 235389995 ) - @Export("__im_q") public static int __im_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -35,10 +33,8 @@ public class KitDefinition extends DualNode { @ObfuscatedGetter( intValue = 1619779051 ) - @Export("__o") public int __o; @ObfuscatedName("u") - @Export("__u") int[] __u; @ObfuscatedName("g") @Export("recolorFrom") @@ -56,7 +52,6 @@ public class KitDefinition extends DualNode { @Export("archives") int[] archives; @ObfuscatedName("k") - @Export("__k") public boolean __k; static { @@ -137,7 +132,6 @@ public class KitDefinition extends DualNode { signature = "(I)Z", garbageValue = "-1250940659" ) - @Export("__w_413") public boolean __w_413() { if(this.__u == null) { return true; @@ -159,7 +153,6 @@ public class KitDefinition extends DualNode { signature = "(B)Ldw;", garbageValue = "0" ) - @Export("__o_414") public ModelData __o_414() { if(this.__u == null) { return null; @@ -199,7 +192,6 @@ public class KitDefinition extends DualNode { signature = "(I)Z", garbageValue = "742548471" ) - @Export("__u_415") public boolean __u_415() { boolean var1 = true; @@ -217,7 +209,6 @@ public class KitDefinition extends DualNode { signature = "(B)Ldw;", garbageValue = "-56" ) - @Export("__g_416") public ModelData __g_416() { ModelData[] var1 = new ModelData[5]; int var2 = 0; diff --git a/runescape-client/src/main/java/Link.java b/runescape-client/src/main/java/Link.java index 45229494f1..b8722c44a4 100644 --- a/runescape-client/src/main/java/Link.java +++ b/runescape-client/src/main/java/Link.java @@ -10,13 +10,11 @@ public class Link { @ObfuscatedSignature( signature = "Lgh;" ) - @Export("__m") public Link __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lgh;" ) - @Export("__f") public Link __f; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/LinkDeque.java b/runescape-client/src/main/java/LinkDeque.java index 844a1ba5cb..c74ef769cc 100644 --- a/runescape-client/src/main/java/LinkDeque.java +++ b/runescape-client/src/main/java/LinkDeque.java @@ -10,13 +10,11 @@ public class LinkDeque { @ObfuscatedSignature( signature = "Lgh;" ) - @Export("__m") Link __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lgh;" ) - @Export("__f") Link __f; public LinkDeque() { @@ -29,7 +27,6 @@ public class LinkDeque { @ObfuscatedSignature( signature = "(Lgh;)V" ) - @Export("__m_437") public void __m_437(Link var1) { if(var1.__f != null) { var1.remove(); @@ -45,7 +42,6 @@ public class LinkDeque { @ObfuscatedSignature( signature = "()Lgh;" ) - @Export("__f_438") public Link __f_438() { Link var1 = this.__m.__m; if(var1 == this.__m) { @@ -61,7 +57,6 @@ public class LinkDeque { @ObfuscatedSignature( signature = "()Lgh;" ) - @Export("__q_439") public Link __q_439() { Link var1 = this.__f; if(var1 == this.__m) { diff --git a/runescape-client/src/main/java/Login.java b/runescape-client/src/main/java/Login.java index 33c3638dcf..82123fb5af 100644 --- a/runescape-client/src/main/java/Login.java +++ b/runescape-client/src/main/java/Login.java @@ -9,7 +9,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Login") public class Login { @ObfuscatedName("f") - @Export("__cu_f") static boolean __cu_f; @ObfuscatedName("q") @ObfuscatedGetter( @@ -60,13 +59,11 @@ public class Login { @ObfuscatedGetter( intValue = 1077910071 ) - @Export("__cu_aj") static int __cu_aj; @ObfuscatedName("ac") @ObfuscatedGetter( intValue = 1677133239 ) - @Export("__cu_ac") static int __cu_ac; @ObfuscatedName("aw") @ObfuscatedGetter( @@ -93,16 +90,13 @@ public class Login { @Export("Login_password") static String Login_password; @ObfuscatedName("aa") - @Export("__cu_aa") static boolean __cu_aa; @ObfuscatedName("ax") - @Export("__cu_ax") static boolean __cu_ax; @ObfuscatedName("ai") @Export("otp") static String otp; @ObfuscatedName("ba") - @Export("__cu_ba") static boolean __cu_ba; @ObfuscatedName("bb") @ObfuscatedGetter( @@ -135,13 +129,11 @@ public class Login { @ObfuscatedGetter( longValue = 803647694904294325L ) - @Export("__cu_bi") static long __cu_bi; @ObfuscatedName("bz") @ObfuscatedGetter( longValue = -3234258972092460093L ) - @Export("__cu_bz") static long __cu_bz; @ObfuscatedName("do") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/LoginPacket.java b/runescape-client/src/main/java/LoginPacket.java index 3239d905c3..d3f674d1d9 100644 --- a/runescape-client/src/main/java/LoginPacket.java +++ b/runescape-client/src/main/java/LoginPacket.java @@ -13,37 +13,31 @@ public class LoginPacket implements ClientPacketMarker { @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_m") public static final LoginPacket __gl_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_f") static final LoginPacket __gl_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_q") public static final LoginPacket __gl_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_w") public static final LoginPacket __gl_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lgl;" ) - @Export("__gl_o") static final LoginPacket __gl_o; @ObfuscatedName("g") @ObfuscatedSignature( signature = "[Lgl;" ) - @Export("__gl_g") static final LoginPacket[] __gl_g; @ObfuscatedName("u") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/LoginScreenAnimation.java b/runescape-client/src/main/java/LoginScreenAnimation.java index 5d2dae8ae1..ddceffb8d9 100644 --- a/runescape-client/src/main/java/LoginScreenAnimation.java +++ b/runescape-client/src/main/java/LoginScreenAnimation.java @@ -15,6 +15,7 @@ public class LoginScreenAnimation @ObfuscatedSignature( signature = "[Llq;" ) + @Export("sprites") IndexedSprite[] sprites; @ObfuscatedName("g") int[] field1015; diff --git a/runescape-client/src/main/java/LoginType.java b/runescape-client/src/main/java/LoginType.java index 3f3dc2163a..91705d5b3d 100644 --- a/runescape-client/src/main/java/LoginType.java +++ b/runescape-client/src/main/java/LoginType.java @@ -11,64 +11,53 @@ public class LoginType { @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_m") public static final LoginType __lx_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_f") static final LoginType __lx_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_q") static final LoginType __lx_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_w") static final LoginType __lx_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_o") static final LoginType __lx_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_u") static final LoginType __lx_u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_g") static final LoginType __lx_g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_l") static final LoginType __lx_l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Llx;" ) - @Export("__lx_e") public static final LoginType __lx_e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -1916729379 ) - @Export("__x") public final int __x; @ObfuscatedName("d") - @Export("__d") final String __d; static { @@ -96,7 +85,6 @@ public class LoginType { this.__d = var4; } - @Export("__toString_546") @ObfuscatedName("toString") public String __toString_546() { return this.__d; diff --git a/runescape-client/src/main/java/MenuAction.java b/runescape-client/src/main/java/MenuAction.java index 657f52fcbb..1e3b209c99 100644 --- a/runescape-client/src/main/java/MenuAction.java +++ b/runescape-client/src/main/java/MenuAction.java @@ -46,6 +46,7 @@ public class MenuAction { signature = "(Lir;Ljava/lang/String;Ljava/lang/String;B)Llq;", garbageValue = "0" ) + @Export("loadIndexedSpriteByName") public static IndexedSprite loadIndexedSpriteByName(AbstractIndexCache var0, String var1, String var2) { int var3 = var0.getArchiveId(var1); int var4 = var0.getRecordId(var3, var2); diff --git a/runescape-client/src/main/java/Message.java b/runescape-client/src/main/java/Message.java index d4992e3b60..570ff3192f 100644 --- a/runescape-client/src/main/java/Message.java +++ b/runescape-client/src/main/java/Message.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Message") public class Message extends DualNode { @ObfuscatedName("i") - @Export("__bm_i") static int[] __bm_i; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/MidiFileReader.java b/runescape-client/src/main/java/MidiFileReader.java index d48f4363d2..7425856d16 100644 --- a/runescape-client/src/main/java/MidiFileReader.java +++ b/runescape-client/src/main/java/MidiFileReader.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("MidiFileReader") public class MidiFileReader { @ObfuscatedName("x") - @Export("__hs_x") static final byte[] __hs_x; @ObfuscatedName("m") @ObfuscatedSignature( @@ -28,13 +27,10 @@ public class MidiFileReader { @Export("trackLengths") int[] trackLengths; @ObfuscatedName("u") - @Export("__u") int[] __u; @ObfuscatedName("g") - @Export("__g") int __g; @ObfuscatedName("e") - @Export("__e") long __e; static { @@ -168,7 +164,6 @@ public class MidiFileReader { } @ObfuscatedName("d") - @Export("__d_371") int __d_371(int var1, int var2) { int var4; if(var2 == 255) { @@ -205,7 +200,6 @@ public class MidiFileReader { } @ObfuscatedName("a") - @Export("__a_372") long __a_372(int var1) { return this.__e + (long)var1 * (long)this.__g; } diff --git a/runescape-client/src/main/java/MidiPcmStream.java b/runescape-client/src/main/java/MidiPcmStream.java index bdee97d7e1..800b277560 100644 --- a/runescape-client/src/main/java/MidiPcmStream.java +++ b/runescape-client/src/main/java/MidiPcmStream.java @@ -17,70 +17,51 @@ public class MidiPcmStream extends PcmStream { @ObfuscatedGetter( intValue = 335918727 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 2095480747 ) - @Export("__q") int __q; @ObfuscatedName("o") - @Export("__o") int[] __o; @ObfuscatedName("u") - @Export("__u") int[] __u; @ObfuscatedName("g") - @Export("__g") int[] __g; @ObfuscatedName("l") - @Export("__l") int[] __l; @ObfuscatedName("e") - @Export("__e") int[] __e; @ObfuscatedName("x") - @Export("__x") int[] __x; @ObfuscatedName("d") - @Export("__d") int[] __d; @ObfuscatedName("k") - @Export("__k") int[] __k; @ObfuscatedName("n") - @Export("surfaceOffsetY") int[] __n; @ObfuscatedName("y") - @Export("__y") int[] __y; @ObfuscatedName("h") - @Export("__h") int[] __h; @ObfuscatedName("b") - @Export("__b") int[] __b; @ObfuscatedName("c") - @Export("__c") int[] __c; @ObfuscatedName("r") - @Export("__r") int[] __r; @ObfuscatedName("p") - @Export("__p") int[] __p; @ObfuscatedName("v") @ObfuscatedSignature( signature = "[[Lha;" ) - @Export("__v") MusicPatchNode[][] __v; @ObfuscatedName("ag") @ObfuscatedSignature( signature = "[[Lha;" ) - @Export("__ag") MusicPatchNode[][] __ag; @ObfuscatedName("aq") @ObfuscatedSignature( @@ -89,7 +70,6 @@ public class MidiPcmStream extends PcmStream { @Export("midiFile") MidiFileReader midiFile; @ObfuscatedName("aj") - @Export("__aj") boolean __aj; @ObfuscatedName("av") @ObfuscatedGetter( @@ -107,13 +87,11 @@ public class MidiPcmStream extends PcmStream { @ObfuscatedGetter( longValue = -7547625335559871937L ) - @Export("__ac") long __ac; @ObfuscatedName("ay") @ObfuscatedGetter( longValue = 3736036110499628937L ) - @Export("__ay") long __ay; @ObfuscatedName("ah") @ObfuscatedSignature( @@ -153,7 +131,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IB)V", garbageValue = "92" ) - @Export("__m_340") public synchronized void __m_340(int var1) { this.__f = var1; } @@ -163,7 +140,6 @@ public class MidiPcmStream extends PcmStream { signature = "(I)I", garbageValue = "2067929289" ) - @Export("__f_341") public int __f_341() { return this.__f; } @@ -237,6 +213,7 @@ public class MidiPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("firstSubStream") protected synchronized PcmStream firstSubStream() { return this.patchStream; } @@ -245,6 +222,7 @@ public class MidiPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("nextSubStream") protected synchronized PcmStream nextSubStream() { return null; } @@ -351,7 +329,6 @@ public class MidiPcmStream extends PcmStream { signature = "(III)V", garbageValue = "789206119" ) - @Export("__j_342") public synchronized void __j_342(int var1, int var2) { this.__s_343(var1, var2); } @@ -361,7 +338,6 @@ public class MidiPcmStream extends PcmStream { signature = "(III)V", garbageValue = "-1475022240" ) - @Export("__s_343") void __s_343(int var1, int var2) { this.__l[var1] = var2; this.__x[var1] = var2 & -128; @@ -373,7 +349,6 @@ public class MidiPcmStream extends PcmStream { signature = "(III)V", garbageValue = "-213159072" ) - @Export("__t_344") void __t_344(int var1, int var2) { if(var2 != this.__e[var1]) { this.__e[var1] = var2; @@ -390,7 +365,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIIB)V", garbageValue = "15" ) - @Export("__y_345") void __y_345(int var1, int var2, int var3) { this.__b_347(var1, var2, 64); if((this.__y[var1] & 2) != 0) { @@ -435,7 +409,7 @@ public class MidiPcmStream extends PcmStream { } if(var9.__q[var2] < 0) { - var6.stream.__x_181(-1); + var6.stream.setNumLoops(-1); } if(var6.__o >= 0) { @@ -459,7 +433,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;ZI)V", garbageValue = "-1455849160" ) - @Export("__h_346") void __h_346(MusicPatchNode var1, boolean var2) { int var3 = var1.rawSound.samples.length; int var4; @@ -483,7 +456,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIII)V", garbageValue = "-1244653525" ) - @Export("__b_347") void __b_347(int var1, int var2, int var3) { MusicPatchNode var4 = this.__v[var1][var2]; if(var4 != null) { @@ -507,7 +479,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIII)V", garbageValue = "1055105177" ) - @Export("__c_348") void __c_348(int var1, int var2, int var3) { } @@ -516,7 +487,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIB)V", garbageValue = "-43" ) - @Export("__p_349") void __p_349(int var1, int var2) { } @@ -525,7 +495,6 @@ public class MidiPcmStream extends PcmStream { signature = "(IIB)V", garbageValue = "-1" ) - @Export("__v_350") void __v_350(int var1, int var2) { this.__d[var1] = var2; } @@ -535,7 +504,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "137929054" ) - @Export("__ah_351") void __ah_351(int var1) { for(MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { if(var1 < 0 || var2.__m == var1) { @@ -563,7 +531,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "-59494316" ) - @Export("__ab_352") void __ab_352(int var1) { if(var1 >= 0) { this.__o[var1] = 12800; @@ -592,7 +559,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "1458917637" ) - @Export("__ae_353") void __ae_353(int var1) { for(MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { if((var1 < 0 || var2.__m == var1) && var2.__a < 0) { @@ -608,7 +574,6 @@ public class MidiPcmStream extends PcmStream { signature = "(I)V", garbageValue = "808372536" ) - @Export("__at_354") void __at_354() { this.__ah_351(-1); this.__ab_352(-1); @@ -629,7 +594,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "-1934460661" ) - @Export("__ad_355") void __ad_355(int var1) { if((this.__y[var1] & 2) != 0) { for(MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { @@ -646,7 +610,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "-1305073262" ) - @Export("__ap_356") void __ap_356(int var1) { if((this.__y[var1] & 4) != 0) { for(MusicPatchNode var2 = (MusicPatchNode)this.patchStream.queue.last(); var2 != null; var2 = (MusicPatchNode)this.patchStream.queue.previous()) { @@ -663,7 +626,6 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "1168111396" ) - @Export("__au_357") void __au_357(int var1) { int var2 = var1 & 240; int var3; @@ -851,7 +813,6 @@ public class MidiPcmStream extends PcmStream { signature = "(III)V", garbageValue = "1380282032" ) - @Export("__ao_358") void __ao_358(int var1, int var2) { this.__r[var1] = var2; this.__p[var1] = (int)(2097152.0D * Math.pow(2.0D, 5.4931640625E-4D * (double)var2) + 0.5D); @@ -862,7 +823,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;I)I", garbageValue = "-1821299983" ) - @Export("__aa_359") int __aa_359(MusicPatchNode var1) { int var2 = (var1.__d * var1.__x >> 12) + var1.__e; var2 += (this.__d[var1.__m] - 8192) * this.__b[var1.__m] >> 12; @@ -889,7 +849,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;I)I", garbageValue = "24812899" ) - @Export("__ax_360") int __ax_360(MusicPatchNode var1) { MusicPatchNode2 var2 = var1.__w; int var3 = this.__o[var1.__m] * this.__g[var1.__m] + 4096 >> 13; @@ -936,7 +895,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;I)I", garbageValue = "360643400" ) - @Export("__af_361") int __af_361(MusicPatchNode var1) { int var2 = this.__u[var1.__m]; return var2 < 8192?var2 * var1.__l + 32 >> 6:16384 - ((128 - var1.__l) * (16384 - var2) + 32 >> 6); @@ -947,7 +905,6 @@ public class MidiPcmStream extends PcmStream { signature = "(B)V", garbageValue = "30" ) - @Export("__ai_367") void __ai_367() { int var1 = this.track; int var2 = this.trackLength; @@ -994,7 +951,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;I)Z", garbageValue = "1820762013" ) - @Export("__ba_368") boolean __ba_368(MusicPatchNode var1) { if(var1.stream == null) { if(var1.__a >= 0) { @@ -1015,7 +971,6 @@ public class MidiPcmStream extends PcmStream { signature = "(Lha;[IIII)Z", garbageValue = "-1605961549" ) - @Export("__bb_369") boolean __bb_369(MusicPatchNode var1, int[] var2, int var3, int var4) { var1.__y = class309.PcmPlayer_sampleRate / 100; if(var1.__a < 0 || var1.stream != null && !var1.stream.__ae_195()) { diff --git a/runescape-client/src/main/java/MilliClock.java b/runescape-client/src/main/java/MilliClock.java index 256c297e67..14f7d02a67 100644 --- a/runescape-client/src/main/java/MilliClock.java +++ b/runescape-client/src/main/java/MilliClock.java @@ -14,37 +14,31 @@ public class MilliClock extends Clock { @Export("decimator") static Decimator decimator; @ObfuscatedName("m") - @Export("__m") long[] __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 1940981129 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 1217137493 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( longValue = -8372744267470318611L ) - @Export("__w") long __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = 250272357 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 576555527 ) - @Export("__u") int __u; public MilliClock() { @@ -65,6 +59,7 @@ public class MilliClock extends Clock { signature = "(B)V", garbageValue = "61" ) + @Export("mark") public void mark() { for(int var1 = 0; var1 < 10; ++var1) { this.__m[var1] = 0L; @@ -77,6 +72,7 @@ public class MilliClock extends Clock { signature = "(III)I", garbageValue = "-126803683" ) + @Export("wait") public int wait(int var1, int var2) { int var3 = this.__f; int var4 = this.__q; diff --git a/runescape-client/src/main/java/Model.java b/runescape-client/src/main/java/Model.java index 8ed74b9e96..bd90fa306f 100644 --- a/runescape-client/src/main/java/Model.java +++ b/runescape-client/src/main/java/Model.java @@ -25,10 +25,8 @@ public class Model extends Entity { @Export("Model_sharedSpotAnimationModelFaceAlphas") static byte[] Model_sharedSpotAnimationModelFaceAlphas; @ObfuscatedName("at") - @Export("__du_at") static boolean[] __du_at; @ObfuscatedName("ad") - @Export("__du_ad") static boolean[] __du_ad; @ObfuscatedName("ap") @Export("modelViewportXs") @@ -37,46 +35,32 @@ public class Model extends Entity { @Export("modelViewportYs") static int[] modelViewportYs; @ObfuscatedName("am") - @Export("__du_am") static int[] __du_am; @ObfuscatedName("an") - @Export("__du_an") static int[] __du_an; @ObfuscatedName("az") - @Export("__du_az") static int[] __du_az; @ObfuscatedName("au") - @Export("__du_au") static int[] __du_au; @ObfuscatedName("aa") - @Export("__du_aa") static int[] __du_aa; @ObfuscatedName("ax") - @Export("__du_ax") static int[][] __du_ax; @ObfuscatedName("af") - @Export("__du_af") static int[] __du_af; @ObfuscatedName("ai") - @Export("__du_ai") static int[][] __du_ai; @ObfuscatedName("ba") - @Export("__du_ba") static int[] __du_ba; @ObfuscatedName("bb") - @Export("__du_bb") static int[] __du_bb; @ObfuscatedName("bs") - @Export("__du_bs") static int[] __du_bs; @ObfuscatedName("bq") - @Export("__du_bq") static int[] __du_bq; @ObfuscatedName("bn") - @Export("__du_bn") static int[] __du_bn; @ObfuscatedName("bk") - @Export("__du_bk") static int[] __du_bk; @ObfuscatedName("bd") @Export("Model_transformTempX") @@ -88,7 +72,6 @@ public class Model extends Entity { @Export("Model_transformTempZ") static int Model_transformTempZ; @ObfuscatedName("bx") - @Export("__du_bx") static boolean __du_bx; @ObfuscatedName("bm") @Export("Model_sine") @@ -97,10 +80,8 @@ public class Model extends Entity { @Export("Model_cosine") static int[] Model_cosine; @ObfuscatedName("br") - @Export("__du_br") static int[] __du_br; @ObfuscatedName("bj") - @Export("__du_bj") static int[] __du_bj; @ObfuscatedName("o") @Export("verticesCount") @@ -142,25 +123,19 @@ public class Model extends Entity { @Export("faceAlphas") byte[] faceAlphas; @ObfuscatedName("s") - @Export("__s") byte[] __s; @ObfuscatedName("t") @Export("faceTextures") short[] faceTextures; @ObfuscatedName("y") - @Export("__y") byte __y; @ObfuscatedName("h") - @Export("__h") int __h; @ObfuscatedName("b") - @Export("__b") int[] __b; @ObfuscatedName("c") - @Export("__c") int[] __c; @ObfuscatedName("r") - @Export("__r") int[] __r; @ObfuscatedName("p") @Export("vertexLabels") @@ -667,7 +642,6 @@ public class Model extends Entity { } @ObfuscatedName("g") - @Export("__g_232") void __g_232() { if(this.boundsType != 2) { this.boundsType = 2; @@ -690,7 +664,6 @@ public class Model extends Entity { } @ObfuscatedName("l") - @Export("__l_233") public int __l_233() { this.calculateBoundsCylinder(); return this.xzRadius; @@ -1008,7 +981,6 @@ public class Model extends Entity { } @ObfuscatedName("c") - @Export("__c_234") public final void __c_234(int var1, int var2, int var3, int var4, int var5, int var6, int var7) { __du_aa[0] = -1; if(this.boundsType != 2 && this.boundsType != 1) { @@ -1074,7 +1046,6 @@ public class Model extends Entity { } @ObfuscatedName("p") - @Export("__p_235") public final void __p_235(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { __du_aa[0] = -1; if(this.boundsType != 2 && this.boundsType != 1) { @@ -1364,7 +1335,6 @@ public class Model extends Entity { } @ObfuscatedName("ag") - @Export("__ag_236") final void __ag_236(int var1) { if(__du_ad[var1]) { this.__aq_237(var1); @@ -1409,7 +1379,6 @@ public class Model extends Entity { } @ObfuscatedName("aq") - @Export("__aq_237") final void __aq_237(int var1) { int var2 = Rasterizer3D.Rasterizer3D_clipMidX; int var3 = Rasterizer3D.Rasterizer3D_clipMidY; @@ -1577,6 +1546,7 @@ public class Model extends Entity { } @ObfuscatedName("cy") + @Export("renderDraw") void renderDraw(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, long var9) { __du_aa[0] = -1; if(this.boundsType != 1) { diff --git a/runescape-client/src/main/java/ModelData.java b/runescape-client/src/main/java/ModelData.java index 22bf1387c8..a0ce7dd443 100644 --- a/runescape-client/src/main/java/ModelData.java +++ b/runescape-client/src/main/java/ModelData.java @@ -7,13 +7,10 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("ModelData") public class ModelData extends Entity { @ObfuscatedName("aw") - @Export("__dw_aw") static int[] __dw_aw; @ObfuscatedName("al") - @Export("__dw_al") static int[] __dw_al; @ObfuscatedName("ab") - @Export("__dw_ab") static int __dw_ab; @ObfuscatedName("ae") @Export("ModelData_sine") @@ -46,10 +43,8 @@ public class ModelData extends Entity { @Export("indices3") int[] indices3; @ObfuscatedName("e") - @Export("__e") byte[] __e; @ObfuscatedName("x") - @Export("__x") byte[] __x; @ObfuscatedName("d") @Export("faceAlphas") @@ -64,10 +59,8 @@ public class ModelData extends Entity { @Export("faceTextures") short[] faceTextures; @ObfuscatedName("a") - @Export("__a") byte __a; @ObfuscatedName("z") - @Export("__z") int __z; @ObfuscatedName("j") @Export("textureRenderTypes") @@ -82,10 +75,8 @@ public class ModelData extends Entity { @Export("texTriangleZ") short[] texTriangleZ; @ObfuscatedName("h") - @Export("__h") int[] __h; @ObfuscatedName("b") - @Export("__b") int[] __b; @ObfuscatedName("c") @Export("vertexLabels") @@ -103,37 +94,28 @@ public class ModelData extends Entity { @ObfuscatedSignature( signature = "[Ldq;" ) - @Export("__v") VertexNormal[] __v; @ObfuscatedName("ag") @ObfuscatedSignature( signature = "[Ldq;" ) - @Export("__ag") VertexNormal[] __ag; @ObfuscatedName("aq") - @Export("__aq") public short __aq; @ObfuscatedName("aj") - @Export("__aj") public short __aj; @ObfuscatedName("av") @Export("isBoundsCalculated") boolean isBoundsCalculated; @ObfuscatedName("ar") - @Export("__ar") int __ar; @ObfuscatedName("ac") - @Export("__ac") int __ac; @ObfuscatedName("ay") - @Export("__ay") int __ay; @ObfuscatedName("ah") - @Export("__ah") int __ah; @ObfuscatedName("ak") - @Export("__ak") int __ak; static { @@ -390,7 +372,6 @@ public class ModelData extends Entity { } @ObfuscatedName("f") - @Export("__f_215") void __f_215(byte[] var1) { Buffer var2 = new Buffer(var1); Buffer var3 = new Buffer(var1); @@ -697,7 +678,6 @@ public class ModelData extends Entity { } @ObfuscatedName("q") - @Export("__q_216") void __q_216(byte[] var1) { boolean var2 = false; boolean var3 = false; @@ -978,7 +958,6 @@ public class ModelData extends Entity { @ObfuscatedSignature( signature = "(Ldw;I)I" ) - @Export("__w_217") final int __w_217(ModelData var1, int var2) { int var3 = -1; int var4 = var1.verticesX[var2]; @@ -1010,7 +989,6 @@ public class ModelData extends Entity { @ObfuscatedSignature( signature = "()Ldw;" ) - @Export("__o_218") public ModelData __o_218() { ModelData var1 = new ModelData(); if(this.__e != null) { @@ -1055,7 +1033,6 @@ public class ModelData extends Entity { @ObfuscatedSignature( signature = "([[IIIIZI)Ldw;" ) - @Export("__u_219") public ModelData __u_219(int[][] var1, int var2, int var3, int var4, boolean var5, int var6) { this.__c_229(); int var7 = var2 + this.__ac; @@ -1147,7 +1124,6 @@ public class ModelData extends Entity { } @ObfuscatedName("g") - @Export("__g_220") void __g_220() { int[] var1; int var2; @@ -1208,7 +1184,6 @@ public class ModelData extends Entity { } @ObfuscatedName("l") - @Export("__l_221") public void __l_221() { for(int var1 = 0; var1 < this.verticesCount; ++var1) { int var2 = this.verticesX[var1]; @@ -1220,7 +1195,6 @@ public class ModelData extends Entity { } @ObfuscatedName("x") - @Export("__x_222") public void __x_222() { for(int var1 = 0; var1 < this.verticesCount; ++var1) { this.verticesX[var1] = -this.verticesX[var1]; @@ -1231,7 +1205,6 @@ public class ModelData extends Entity { } @ObfuscatedName("d") - @Export("__d_223") public void __d_223() { for(int var1 = 0; var1 < this.verticesCount; ++var1) { int var2 = this.verticesZ[var1]; @@ -1243,7 +1216,6 @@ public class ModelData extends Entity { } @ObfuscatedName("a") - @Export("__a_224") public void __a_224(int var1) { int var2 = ModelData_sine[var1]; int var3 = ModelData_cosine[var1]; @@ -1258,7 +1230,6 @@ public class ModelData extends Entity { } @ObfuscatedName("z") - @Export("__z_225") public void __z_225(int var1, int var2, int var3) { for(int var4 = 0; var4 < this.verticesCount; ++var4) { this.verticesX[var4] += var1; @@ -1294,7 +1265,6 @@ public class ModelData extends Entity { } @ObfuscatedName("t") - @Export("__t_226") public void __t_226() { int var1; for(var1 = 0; var1 < this.verticesCount; ++var1) { @@ -1311,7 +1281,6 @@ public class ModelData extends Entity { } @ObfuscatedName("y") - @Export("__y_227") public void __y_227(int var1, int var2, int var3) { for(int var4 = 0; var4 < this.verticesCount; ++var4) { this.verticesX[var4] = this.verticesX[var4] * var1 / 128; @@ -1323,7 +1292,6 @@ public class ModelData extends Entity { } @ObfuscatedName("h") - @Export("__h_228") public void __h_228() { if(this.__v == null) { this.__v = new VertexNormal[this.verticesCount]; @@ -1408,7 +1376,6 @@ public class ModelData extends Entity { } @ObfuscatedName("c") - @Export("__c_229") void __c_229() { if(!this.isBoundsCalculated) { super.height = 0; diff --git a/runescape-client/src/main/java/MouseRecorder.java b/runescape-client/src/main/java/MouseRecorder.java index c5860d85e0..22f81c03b4 100644 --- a/runescape-client/src/main/java/MouseRecorder.java +++ b/runescape-client/src/main/java/MouseRecorder.java @@ -17,7 +17,6 @@ public class MouseRecorder implements Runnable { @ObfuscatedGetter( intValue = 1075569245 ) - @Export("__bu_hy") static int __bu_hy; @ObfuscatedName("m") @Export("isRunning") diff --git a/runescape-client/src/main/java/MouseWheelHandler.java b/runescape-client/src/main/java/MouseWheelHandler.java index 6cca354e21..62907185a1 100644 --- a/runescape-client/src/main/java/MouseWheelHandler.java +++ b/runescape-client/src/main/java/MouseWheelHandler.java @@ -46,6 +46,7 @@ public final class MouseWheelHandler implements MouseWheel, MouseWheelListener { signature = "(I)I", garbageValue = "1293035280" ) + @Export("useRotation") public synchronized int useRotation() { int var1 = this.rotation; this.rotation = 0; diff --git a/runescape-client/src/main/java/MusicPatch.java b/runescape-client/src/main/java/MusicPatch.java index d91cca4a74..a51914bfd3 100644 --- a/runescape-client/src/main/java/MusicPatch.java +++ b/runescape-client/src/main/java/MusicPatch.java @@ -11,7 +11,6 @@ public class MusicPatch extends Node { @ObfuscatedGetter( intValue = 574200865 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedSignature( @@ -20,25 +19,19 @@ public class MusicPatch extends Node { @Export("rawSounds") RawSound[] rawSounds; @ObfuscatedName("q") - @Export("__q") short[] __q; @ObfuscatedName("w") - @Export("__w") byte[] __w; @ObfuscatedName("o") - @Export("__o") byte[] __o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "[Lhd;" ) - @Export("__u") MusicPatchNode2[] __u; @ObfuscatedName("g") - @Export("__g") byte[] __g; @ObfuscatedName("l") - @Export("__l") int[] __l; MusicPatch(byte[] var1) { @@ -497,7 +490,6 @@ public class MusicPatch extends Node { signature = "(Ldt;[B[II)Z", garbageValue = "1828768318" ) - @Export("__f_373") boolean __f_373(SoundCache var1, byte[] var2, int[] var3) { boolean var4 = true; int var5 = 0; diff --git a/runescape-client/src/main/java/MusicPatchNode.java b/runescape-client/src/main/java/MusicPatchNode.java index c03f0a99ed..66f778d7ee 100644 --- a/runescape-client/src/main/java/MusicPatchNode.java +++ b/runescape-client/src/main/java/MusicPatchNode.java @@ -17,7 +17,6 @@ public class MusicPatchNode extends Node { @ObfuscatedGetter( intValue = 801157533 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedSignature( @@ -35,91 +34,76 @@ public class MusicPatchNode extends Node { @ObfuscatedSignature( signature = "Lhd;" ) - @Export("__w") MusicPatchNode2 __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -2058553171 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 62958303 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -836502917 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -308599455 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -471899285 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -1520706641 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = -852988281 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( intValue = -439388365 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = 476852577 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") @ObfuscatedGetter( intValue = -2136855685 ) - @Export("__i") int __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -2083252379 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = 1605236771 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = 173672931 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 219840779 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedSignature( @@ -131,13 +115,11 @@ public class MusicPatchNode extends Node { @ObfuscatedGetter( intValue = -666877449 ) - @Export("__y") int __y; @ObfuscatedName("b") @ObfuscatedGetter( intValue = 1359854411 ) - @Export("__b") int __b; @ObfuscatedName("m") @@ -145,7 +127,6 @@ public class MusicPatchNode extends Node { signature = "(B)V", garbageValue = "39" ) - @Export("__m_370") void __m_370() { this.patch = null; this.rawSound = null; diff --git a/runescape-client/src/main/java/MusicPatchNode2.java b/runescape-client/src/main/java/MusicPatchNode2.java index f98ddc01f9..71625b12cc 100644 --- a/runescape-client/src/main/java/MusicPatchNode2.java +++ b/runescape-client/src/main/java/MusicPatchNode2.java @@ -10,54 +10,44 @@ public class MusicPatchNode2 { @ObfuscatedGetter( longValue = -6780258776884306463L ) - @Export("__hd_fc") static long __hd_fc; @ObfuscatedName("m") - @Export("__m") byte[] __m; @ObfuscatedName("f") - @Export("__f") byte[] __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 140046797 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -249046051 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -1455145595 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 1577527995 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 391670135 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = 320761691 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 1984131473 ) - @Export("__e") int __e; } diff --git a/runescape-client/src/main/java/MusicPatchPcmStream.java b/runescape-client/src/main/java/MusicPatchPcmStream.java index 25a7e0c8fa..664d11868d 100644 --- a/runescape-client/src/main/java/MusicPatchPcmStream.java +++ b/runescape-client/src/main/java/MusicPatchPcmStream.java @@ -11,7 +11,6 @@ public class MusicPatchPcmStream extends PcmStream { @ObfuscatedGetter( intValue = -1367955455 ) - @Export("__hq_qg") static int __hq_qg; @ObfuscatedName("m") @ObfuscatedSignature( @@ -46,7 +45,6 @@ public class MusicPatchPcmStream extends PcmStream { signature = "(Lha;[IIIII)V", garbageValue = "1988628167" ) - @Export("__m_379") void __m_379(MusicPatchNode var1, int[] var2, int var3, int var4, int var5) { if((this.superStream.__y[var1.__m] & 4) != 0 && var1.__a < 0) { int var6 = this.superStream.__p[var1.__m] / class309.PcmPlayer_sampleRate; @@ -78,7 +76,7 @@ public class MusicPatchPcmStream extends PcmStream { } if(var1.patch.__q[var1.__u] < 0) { - var1.stream.__x_181(-1); + var1.stream.setNumLoops(-1); } var10.__v_192(var8); @@ -97,7 +95,6 @@ public class MusicPatchPcmStream extends PcmStream { signature = "(Lha;II)V", garbageValue = "1882591412" ) - @Export("__f_380") void __f_380(MusicPatchNode var1, int var2) { if((this.superStream.__y[var1.__m] & 4) != 0 && var1.__a < 0) { int var3 = this.superStream.__p[var1.__m] / class309.PcmPlayer_sampleRate; @@ -112,7 +109,7 @@ public class MusicPatchPcmStream extends PcmStream { } if(var1.patch.__q[var1.__u] < 0) { - var1.stream.__x_181(-1); + var1.stream.setNumLoops(-1); } var2 = var1.__b / var3; @@ -126,6 +123,7 @@ public class MusicPatchPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("firstSubStream") protected PcmStream firstSubStream() { MusicPatchNode var1 = (MusicPatchNode)this.queue.last(); return (PcmStream)(var1 == null?null:(var1.stream != null?var1.stream:this.nextSubStream())); @@ -135,6 +133,7 @@ public class MusicPatchPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("nextSubStream") protected PcmStream nextSubStream() { MusicPatchNode var1; do { diff --git a/runescape-client/src/main/java/MusicSample.java b/runescape-client/src/main/java/MusicSample.java index d3f9c83d47..7c5cb71a6a 100644 --- a/runescape-client/src/main/java/MusicSample.java +++ b/runescape-client/src/main/java/MusicSample.java @@ -7,19 +7,14 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("MusicSample") public class MusicSample extends Node { @ObfuscatedName("g") - @Export("__cd_g") static byte[] __cd_g; @ObfuscatedName("l") - @Export("__cd_l") static int __cd_l; @ObfuscatedName("e") - @Export("__cd_e") static int __cd_e; @ObfuscatedName("x") - @Export("__cd_x") static int __cd_x; @ObfuscatedName("d") - @Export("__cd_d") static int __cd_d; @ObfuscatedName("k") @ObfuscatedSignature( @@ -42,43 +37,30 @@ public class MusicSample extends Node { ) static class114[] field1326; @ObfuscatedName("z") - @Export("__cd_z") static boolean[] __cd_z; @ObfuscatedName("j") - @Export("__cd_j") static int[] __cd_j; @ObfuscatedName("s") - @Export("__cd_s") static boolean __cd_s; @ObfuscatedName("c") - @Export("__cd_c") static float[] __cd_c; @ObfuscatedName("r") - @Export("__cd_r") static float[] __cd_r; @ObfuscatedName("p") - @Export("__cd_p") static float[] __cd_p; @ObfuscatedName("v") - @Export("__cd_v") static float[] __cd_v; @ObfuscatedName("ag") - @Export("__cd_ag") static float[] __cd_ag; @ObfuscatedName("aq") - @Export("__cd_aq") static float[] __cd_aq; @ObfuscatedName("aj") - @Export("__cd_aj") static float[] __cd_aj; @ObfuscatedName("av") - @Export("__cd_av") static int[] __cd_av; @ObfuscatedName("ar") - @Export("__cd_ar") static int[] __cd_ar; @ObfuscatedName("m") - @Export("__m") byte[][] __m; @ObfuscatedName("f") @Export("sampleRate") @@ -93,28 +75,21 @@ public class MusicSample extends Node { @Export("end") int end; @ObfuscatedName("u") - @Export("__u") boolean __u; @ObfuscatedName("t") - @Export("__t") float[] __t; @ObfuscatedName("y") - @Export("__y") int __y; @ObfuscatedName("h") - @Export("__h") int __h; @ObfuscatedName("b") - @Export("__b") boolean __b; @ObfuscatedName("ac") @Export("samples") byte[] samples; @ObfuscatedName("ay") - @Export("__ay") int __ay; @ObfuscatedName("ah") - @Export("__ah") int __ah; static { @@ -158,7 +133,6 @@ public class MusicSample extends Node { } @ObfuscatedName("g") - @Export("__g_175") float[] __g_175(int var1) { method2337(this.__m[var1], 0); method2338(); diff --git a/runescape-client/src/main/java/MusicTrack.java b/runescape-client/src/main/java/MusicTrack.java index 6f340aae23..bd207d4761 100644 --- a/runescape-client/src/main/java/MusicTrack.java +++ b/runescape-client/src/main/java/MusicTrack.java @@ -336,7 +336,6 @@ public class MusicTrack extends Node { } @ObfuscatedName("f") - @Export("__f_381") void __f_381() { if(this.table == null) { this.table = new NodeHashTable(16); diff --git a/runescape-client/src/main/java/NanoClock.java b/runescape-client/src/main/java/NanoClock.java index 5abf46daf5..22fb3b32eb 100644 --- a/runescape-client/src/main/java/NanoClock.java +++ b/runescape-client/src/main/java/NanoClock.java @@ -23,6 +23,7 @@ public class NanoClock extends Clock { signature = "(B)V", garbageValue = "61" ) + @Export("mark") public void mark() { this.lastTimeNano = System.nanoTime(); } @@ -32,6 +33,7 @@ public class NanoClock extends Clock { signature = "(III)I", garbageValue = "-126803683" ) + @Export("wait") public int wait(int var1, int var2) { long var3 = 1000000L * (long)var2; long var5 = this.lastTimeNano - System.nanoTime(); diff --git a/runescape-client/src/main/java/NetCache.java b/runescape-client/src/main/java/NetCache.java index 94aac85c0a..660896990b 100644 --- a/runescape-client/src/main/java/NetCache.java +++ b/runescape-client/src/main/java/NetCache.java @@ -18,13 +18,11 @@ public class NetCache { @ObfuscatedGetter( intValue = 948359621 ) - @Export("__iq_f") public static int __iq_f; @ObfuscatedName("q") @ObfuscatedGetter( longValue = -4580427166942649525L ) - @Export("__iq_q") public static long __iq_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -90,7 +88,6 @@ public class NetCache { @ObfuscatedGetter( intValue = 840549915 ) - @Export("__iq_j") public static int __iq_j; @ObfuscatedName("t") @Export("NetCache_crc") @@ -102,7 +99,6 @@ public class NetCache { @Export("NetCache_indexCaches") public static IndexCache[] NetCache_indexCaches; @ObfuscatedName("b") - @Export("__iq_b") public static byte __iq_b; @ObfuscatedName("c") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/NetSocket.java b/runescape-client/src/main/java/NetSocket.java index fa0ad800ee..f01da8362d 100644 --- a/runescape-client/src/main/java/NetSocket.java +++ b/runescape-client/src/main/java/NetSocket.java @@ -49,13 +49,11 @@ public final class NetSocket extends AbstractSocket implements Runnable { @ObfuscatedGetter( intValue = -738185459 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 2057244853 ) - @Export("__e") int __e; @ObfuscatedName("x") @Export("exceptionWriting") @@ -64,13 +62,11 @@ public final class NetSocket extends AbstractSocket implements Runnable { @ObfuscatedGetter( intValue = -1644762957 ) - @Export("__d") final int __d; @ObfuscatedName("k") @ObfuscatedGetter( intValue = -782964015 ) - @Export("__k") final int __k; @ObfuscatedSignature( @@ -98,6 +94,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "(II)Z", garbageValue = "1765046516" ) + @Export("isAvailable") public boolean isAvailable(int var1) throws IOException { return this.isClosed?false:this.inputStream.available() >= var1; } @@ -107,6 +104,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "(I)I", garbageValue = "-1078471130" ) + @Export("available") public int available() throws IOException { return this.isClosed?0:this.inputStream.available(); } @@ -116,6 +114,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "(I)I", garbageValue = "516705222" ) + @Export("readUnsignedByte") public int readUnsignedByte() throws IOException { return this.isClosed?0:this.inputStream.read(); } @@ -125,6 +124,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "([BIII)I", garbageValue = "-1089665746" ) + @Export("read") public int read(byte[] var1, int var2, int var3) throws IOException { if(this.isClosed) { return 0; @@ -149,6 +149,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "([BIIB)V", garbageValue = "-86" ) + @Export("write") public void write(byte[] var1, int var2, int var3) throws IOException { this.write0(var1, var2, var3); } @@ -158,6 +159,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "(I)V", garbageValue = "-1252618448" ) + @Export("close") public void close() { if(!this.isClosed) { synchronized(this) { @@ -305,6 +307,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "(IIILfe;Lfy;Z[I[IB)I", garbageValue = "-98" ) + @Export("calculateRoute") public static int calculateRoute(int srcX, int srcY, int srcSize, RouteStrategy strategy, CollisionMap collisionMap, boolean var5, int[] bufferX, int[] bufferY) { int graphBaseX; for(int var8 = 0; var8 < 128; ++var8) { diff --git a/runescape-client/src/main/java/Npc.java b/runescape-client/src/main/java/Npc.java index 8d0db12d02..eb11180d3b 100644 --- a/runescape-client/src/main/java/Npc.java +++ b/runescape-client/src/main/java/Npc.java @@ -18,7 +18,6 @@ public final class Npc extends Actor { signature = "(IBI)V", garbageValue = "306250019" ) - @Export("__m_162") final void __m_162(int var1, byte var2) { int var3 = super.pathX[0]; int var4 = super.pathY[0]; @@ -82,7 +81,6 @@ public final class Npc extends Actor { signature = "(IIZI)V", garbageValue = "-1647134110" ) - @Export("__f_163") final void __f_163(int var1, int var2, boolean var3) { if(super.sequence != -1 && WorldMapAreaData.getSequenceDefinition(super.sequence).__s == 1) { super.sequence = -1; @@ -159,6 +157,7 @@ public final class Npc extends Actor { signature = "(B)Z", garbageValue = "1" ) + @Export("isVisible") final boolean isVisible() { return this.definition != null; } diff --git a/runescape-client/src/main/java/NpcDefinition.java b/runescape-client/src/main/java/NpcDefinition.java index 244c978e2b..8161c2cc1e 100644 --- a/runescape-client/src/main/java/NpcDefinition.java +++ b/runescape-client/src/main/java/NpcDefinition.java @@ -55,7 +55,6 @@ public class NpcDefinition extends DualNode { @Export("archives") int[] archives; @ObfuscatedName("e") - @Export("__e") int[] __e; @ObfuscatedName("x") @ObfuscatedGetter( @@ -142,13 +141,11 @@ public class NpcDefinition extends DualNode { @ObfuscatedGetter( intValue = -1235927151 ) - @Export("__ag") int __ag; @ObfuscatedName("aq") @ObfuscatedGetter( intValue = 1962875903 ) - @Export("__aq") int __aq; @ObfuscatedName("aj") @ObfuscatedGetter( @@ -160,7 +157,6 @@ public class NpcDefinition extends DualNode { @ObfuscatedGetter( intValue = -506638747 ) - @Export("__av") public int __av; @ObfuscatedName("ar") @Export("transforms") @@ -534,7 +530,6 @@ public class NpcDefinition extends DualNode { signature = "(I)Z", garbageValue = "853540088" ) - @Export("__e_435") public boolean __e_435() { if(this.transforms == null) { return true; diff --git a/runescape-client/src/main/java/ObjectDefinition.java b/runescape-client/src/main/java/ObjectDefinition.java index c4ec49ab44..0599790b68 100644 --- a/runescape-client/src/main/java/ObjectDefinition.java +++ b/runescape-client/src/main/java/ObjectDefinition.java @@ -20,7 +20,6 @@ public class ObjectDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jr_q") static AbstractIndexCache __jr_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -32,13 +31,11 @@ public class ObjectDefinition extends DualNode { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jr_o") public static EvictingDualNodeHashTable __jr_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jr_u") static EvictingDualNodeHashTable __jr_u; @ObfuscatedName("g") @ObfuscatedSignature( @@ -50,7 +47,6 @@ public class ObjectDefinition extends DualNode { @ObfuscatedSignature( signature = "[Ldw;" ) - @Export("__jr_l") static ModelData[] __jr_l; @ObfuscatedName("e") @ObfuscatedGetter( @@ -59,10 +55,8 @@ public class ObjectDefinition extends DualNode { @Export("id") public int id; @ObfuscatedName("x") - @Export("__x") int[] __x; @ObfuscatedName("d") - @Export("__d") int[] __d; @ObfuscatedName("k") @Export("name") @@ -251,7 +245,6 @@ public class ObjectDefinition extends DualNode { @Export("int6") public int int6; @ObfuscatedName("ax") - @Export("__ax") public int[] __ax; @ObfuscatedName("af") @ObfuscatedSignature( @@ -527,7 +520,6 @@ public class ObjectDefinition extends DualNode { signature = "(II)Z", garbageValue = "1880172029" ) - @Export("__u_421") public final boolean __u_421(int var1) { if(this.__d != null) { for(int var4 = 0; var4 < this.__d.length; ++var4) { @@ -557,7 +549,6 @@ public class ObjectDefinition extends DualNode { signature = "(I)Z", garbageValue = "-666846742" ) - @Export("__g_422") public final boolean __g_422() { if(this.__x == null) { return true; @@ -577,7 +568,6 @@ public class ObjectDefinition extends DualNode { signature = "(II[[IIIIS)Lex;", garbageValue = "-27831" ) - @Export("__l_423") public final Entity __l_423(int var1, int var2, int[][] var3, int var4, int var5, int var6) { long var7; if(this.__d == null) { @@ -897,7 +887,6 @@ public class ObjectDefinition extends DualNode { signature = "(I)Z", garbageValue = "8470625" ) - @Export("__t_424") public boolean __t_424() { if(this.transforms == null) { return this.ambientSoundId != -1 || this.__ax != null; diff --git a/runescape-client/src/main/java/ObjectSound.java b/runescape-client/src/main/java/ObjectSound.java index ba344aa439..773f32dc91 100644 --- a/runescape-client/src/main/java/ObjectSound.java +++ b/runescape-client/src/main/java/ObjectSound.java @@ -23,37 +23,31 @@ public final class ObjectSound extends Node { @ObfuscatedGetter( intValue = 647270745 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -800464493 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -85911525 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -211591209 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 512258949 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 1344558633 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( @@ -71,13 +65,11 @@ public final class ObjectSound extends Node { @ObfuscatedGetter( intValue = -1608400407 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = 1748890449 ) - @Export("__d") int __d; @ObfuscatedName("k") @Export("soundEffectIds") @@ -86,7 +78,6 @@ public final class ObjectSound extends Node { @ObfuscatedGetter( intValue = -1041508847 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/Occluder.java b/runescape-client/src/main/java/Occluder.java index 84e8db0e18..ba1f42329d 100644 --- a/runescape-client/src/main/java/Occluder.java +++ b/runescape-client/src/main/java/Occluder.java @@ -77,43 +77,36 @@ public final class Occluder { @ObfuscatedGetter( intValue = 826041747 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = -407777817 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") @ObfuscatedGetter( intValue = 1324959981 ) - @Export("__i") int __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -1527021367 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -570391007 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = -373839103 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = -1334433969 ) - @Export("__s") int __s; @ObfuscatedName("f") diff --git a/runescape-client/src/main/java/OverlayDefinition.java b/runescape-client/src/main/java/OverlayDefinition.java index 001869f336..89a966d8dc 100644 --- a/runescape-client/src/main/java/OverlayDefinition.java +++ b/runescape-client/src/main/java/OverlayDefinition.java @@ -11,13 +11,11 @@ public class OverlayDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jf_m") public static AbstractIndexCache __jf_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jf_f") public static EvictingDualNodeHashTable __jf_f; @ObfuscatedName("q") @ObfuscatedGetter( @@ -32,7 +30,6 @@ public class OverlayDefinition extends DualNode { @Export("texture") public int texture; @ObfuscatedName("o") - @Export("__o") public boolean __o; @ObfuscatedName("u") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/OwnWorldComparator.java b/runescape-client/src/main/java/OwnWorldComparator.java index 00cc8d8ca5..0c81a18929 100644 --- a/runescape-client/src/main/java/OwnWorldComparator.java +++ b/runescape-client/src/main/java/OwnWorldComparator.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("OwnWorldComparator") public class OwnWorldComparator implements Comparator { @ObfuscatedName("m") - @Export("__m") boolean __m; @ObfuscatedName("m") @@ -16,7 +15,6 @@ public class OwnWorldComparator implements Comparator { signature = "(Ll;Ll;B)I", garbageValue = "21" ) - @Export("__m_132") int __m_132(GrandExchangeEvent var1, GrandExchangeEvent var2) { if(var2.world == var1.world) { return 0; @@ -35,7 +33,6 @@ public class OwnWorldComparator implements Comparator { } } - @Export("__equals_134") @ObfuscatedName("equals") public boolean __equals_134(Object var1) { return super.equals(var1); diff --git a/runescape-client/src/main/java/PacketBuffer.java b/runescape-client/src/main/java/PacketBuffer.java index 8198487a11..308a9d2a77 100644 --- a/runescape-client/src/main/java/PacketBuffer.java +++ b/runescape-client/src/main/java/PacketBuffer.java @@ -14,7 +14,6 @@ public final class PacketBuffer extends Buffer { @ObfuscatedGetter( intValue = 701739159 ) - @Export("__hx_z") public static int __hx_z; @ObfuscatedName("e") @ObfuscatedSignature( @@ -82,7 +81,6 @@ public final class PacketBuffer extends Buffer { signature = "(B)Z", garbageValue = "101" ) - @Export("__ig_334") public boolean __ig_334() { int var1 = super.array[super.index] - this.isaacCipher0.__f_337() & 255; return var1 >= 128; @@ -104,7 +102,6 @@ public final class PacketBuffer extends Buffer { signature = "([BIII)V", garbageValue = "-1168019189" ) - @Export("__jb_335") public void __jb_335(byte[] var1, int var2, int var3) { for(int var4 = 0; var4 < var3; ++var4) { var1[var4 + var2] = (byte)(super.array[++super.index - 1] - this.isaacCipher0.__m_336()); diff --git a/runescape-client/src/main/java/PacketBufferNode.java b/runescape-client/src/main/java/PacketBufferNode.java index 15514416c1..4db93c1b8c 100644 --- a/runescape-client/src/main/java/PacketBufferNode.java +++ b/runescape-client/src/main/java/PacketBufferNode.java @@ -17,19 +17,16 @@ public class PacketBufferNode extends Node { @ObfuscatedGetter( intValue = -1583654139 ) - @Export("__gg_u") public static int __gg_u; @ObfuscatedName("m") @ObfuscatedSignature( signature = "Lgs;" ) - @Export("__m") public ClientPacket __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 1433542775 ) - @Export("__f") public int __f; @ObfuscatedName("q") @ObfuscatedSignature( @@ -41,7 +38,6 @@ public class PacketBufferNode extends Node { @ObfuscatedGetter( intValue = -2051819203 ) - @Export("__w") public int __w; static { @@ -54,7 +50,6 @@ public class PacketBufferNode extends Node { signature = "(I)V", garbageValue = "-1987685511" ) - @Export("__f_292") public void __f_292() { if(__gg_u < packetBufferNodes.length) { packetBufferNodes[++__gg_u - 1] = this; diff --git a/runescape-client/src/main/java/PacketWriter.java b/runescape-client/src/main/java/PacketWriter.java index 2f2d8a1ffd..d01f2bce26 100644 --- a/runescape-client/src/main/java/PacketWriter.java +++ b/runescape-client/src/main/java/PacketWriter.java @@ -30,7 +30,6 @@ public class PacketWriter { @ObfuscatedGetter( intValue = -1028046199 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -63,37 +62,31 @@ public class PacketWriter { @Export("serverPacket0Length") int serverPacket0Length; @ObfuscatedName("e") - @Export("__e") boolean __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = 120570975 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = 1672229609 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__k") ServerPacket __k; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lge;" ) - @Export("surfaceOffsetY") ServerPacket __n; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__i") ServerPacket __i; PacketWriter() { @@ -113,7 +106,6 @@ public class PacketWriter { signature = "(I)V", garbageValue = "1561094077" ) - @Export("__m_165") final void __m_165() { this.packetBufferNodes.clear(); this.__q = 0; @@ -124,7 +116,6 @@ public class PacketWriter { signature = "(I)V", garbageValue = "-1839929685" ) - @Export("__f_166") final void __f_166() throws IOException { if(this.socket0 != null && this.__q > 0) { this.buffer.index = 0; @@ -152,7 +143,6 @@ public class PacketWriter { signature = "(Lgg;I)V", garbageValue = "599379248" ) - @Export("__q_167") public final void __q_167(PacketBufferNode var1) { this.packetBufferNodes.addFirst(var1); var1.__w = var1.packetBuffer.index; diff --git a/runescape-client/src/main/java/ParamKeyDefinition.java b/runescape-client/src/main/java/ParamKeyDefinition.java index eb4b7f01a1..c5b54db627 100644 --- a/runescape-client/src/main/java/ParamKeyDefinition.java +++ b/runescape-client/src/main/java/ParamKeyDefinition.java @@ -11,7 +11,6 @@ public class ParamKeyDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jb_m") public static AbstractIndexCache __jb_m; @ObfuscatedName("f") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/PcmPlayer.java b/runescape-client/src/main/java/PcmPlayer.java index 14f603392f..296ae184e5 100644 --- a/runescape-client/src/main/java/PcmPlayer.java +++ b/runescape-client/src/main/java/PcmPlayer.java @@ -23,7 +23,6 @@ public class PcmPlayer { @ObfuscatedGetter( intValue = 1125788887 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( @@ -47,7 +46,6 @@ public class PcmPlayer { @ObfuscatedGetter( intValue = 1907203055 ) - @Export("__y") int __y; @ObfuscatedName("h") @ObfuscatedGetter( @@ -59,13 +57,11 @@ public class PcmPlayer { @ObfuscatedGetter( intValue = 48658021 ) - @Export("__b") int __b; @ObfuscatedName("c") @ObfuscatedGetter( intValue = 1624619697 ) - @Export("__c") int __c; @ObfuscatedName("r") @ObfuscatedGetter( @@ -77,28 +73,23 @@ public class PcmPlayer { @ObfuscatedGetter( longValue = -8188447292076890879L ) - @Export("__p") long __p; @ObfuscatedName("v") - @Export("__v") boolean __v; @ObfuscatedName("ac") @ObfuscatedGetter( intValue = -645495803 ) - @Export("__ac") int __ac; @ObfuscatedName("ay") @ObfuscatedSignature( signature = "[Ldc;" ) - @Export("__ay") PcmStream[] __ay; @ObfuscatedName("ah") @ObfuscatedSignature( signature = "[Ldc;" ) - @Export("__ah") PcmStream[] __ah; protected PcmPlayer() { @@ -120,6 +111,7 @@ public class PcmPlayer { signature = "(I)V", garbageValue = "949670609" ) + @Export("init") protected void init() throws Exception { } @@ -128,6 +120,7 @@ public class PcmPlayer { signature = "(II)V", garbageValue = "-1738349775" ) + @Export("open") protected void open(int var1) throws Exception { } @@ -136,11 +129,13 @@ public class PcmPlayer { signature = "(B)I", garbageValue = "0" ) + @Export("position") protected int position() throws Exception { return this.capacity; } @ObfuscatedName("w") + @Export("write") protected void write() throws Exception { } @@ -149,6 +144,7 @@ public class PcmPlayer { signature = "(I)V", garbageValue = "244995961" ) + @Export("close") protected void close() { } @@ -157,6 +153,7 @@ public class PcmPlayer { signature = "(I)V", garbageValue = "-191421600" ) + @Export("discard") protected void discard() throws Exception { } @@ -268,7 +265,6 @@ public class PcmPlayer { signature = "(I)V", garbageValue = "-922069005" ) - @Export("__ac_176") public final void __ac_176() { this.__v = true; } @@ -459,7 +455,6 @@ public class PcmPlayer { signature = "(Ldc;II)V", garbageValue = "-1884182540" ) - @Export("__ab_177") final void __ab_177(PcmStream var1, int var2) { int var3 = var2 >> 5; PcmStream var4 = this.__ah[var3]; diff --git a/runescape-client/src/main/java/PcmStream.java b/runescape-client/src/main/java/PcmStream.java index 5f8a04d8d4..0518a56eee 100644 --- a/runescape-client/src/main/java/PcmStream.java +++ b/runescape-client/src/main/java/PcmStream.java @@ -16,7 +16,6 @@ public abstract class PcmStream extends Node { @Export("after") PcmStream after; @ObfuscatedName("s") - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedSignature( @@ -33,12 +32,14 @@ public abstract class PcmStream extends Node { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("firstSubStream") protected abstract PcmStream firstSubStream(); @ObfuscatedName("g") @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("nextSubStream") protected abstract PcmStream nextSubStream(); @ObfuscatedName("l") diff --git a/runescape-client/src/main/java/PcmStreamMixer.java b/runescape-client/src/main/java/PcmStreamMixer.java index 0eeb230c0d..205d7ca61f 100644 --- a/runescape-client/src/main/java/PcmStreamMixer.java +++ b/runescape-client/src/main/java/PcmStreamMixer.java @@ -16,13 +16,10 @@ public class PcmStreamMixer extends PcmStream { @ObfuscatedSignature( signature = "Lje;" ) - @Export("__f") NodeDeque __f; @ObfuscatedName("q") - @Export("__q") int __q; @ObfuscatedName("o") - @Export("__o") int __o; public PcmStreamMixer() { @@ -51,7 +48,6 @@ public class PcmStreamMixer extends PcmStream { } @ObfuscatedName("q") - @Export("__q_168") void __q_168() { if(this.__q > 0) { for(PcmStreamMixerListener var1 = (PcmStreamMixerListener)this.__f.last(); var1 != null; var1 = (PcmStreamMixerListener)this.__f.previous()) { @@ -68,7 +64,6 @@ public class PcmStreamMixer extends PcmStream { @ObfuscatedSignature( signature = "(Lgw;Ldf;)V" ) - @Export("__w_169") void __w_169(Node var1, PcmStreamMixerListener var2) { while(this.__f.sentinel != var1 && ((PcmStreamMixerListener)var1).__m <= var2.__m) { var1 = var1.previous; @@ -82,7 +77,6 @@ public class PcmStreamMixer extends PcmStream { @ObfuscatedSignature( signature = "(Ldf;)V" ) - @Export("__o_170") void __o_170(PcmStreamMixerListener var1) { var1.remove(); var1.remove2(); @@ -114,13 +108,11 @@ public class PcmStreamMixer extends PcmStream { } @ObfuscatedName("l") - @Export("__l_171") protected int __l_171() { return 0; } @ObfuscatedName("e") - @Export("__e_172") public final synchronized void __e_172(int[] var1, int var2, int var3) { do { if(this.__o < 0) { @@ -165,7 +157,6 @@ public class PcmStreamMixer extends PcmStream { } @ObfuscatedName("d") - @Export("__d_173") public final synchronized void __d_173(int var1) { do { if(this.__o < 0) { diff --git a/runescape-client/src/main/java/PcmStreamMixerListener.java b/runescape-client/src/main/java/PcmStreamMixerListener.java index a87a239cc6..4e696ca7c1 100644 --- a/runescape-client/src/main/java/PcmStreamMixerListener.java +++ b/runescape-client/src/main/java/PcmStreamMixerListener.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("PcmStreamMixerListener") public abstract class PcmStreamMixerListener extends Node { @ObfuscatedName("m") - @Export("__m") int __m; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/PlatformInfo.java b/runescape-client/src/main/java/PlatformInfo.java index a94c76d1e9..6a8fa2e1dd 100644 --- a/runescape-client/src/main/java/PlatformInfo.java +++ b/runescape-client/src/main/java/PlatformInfo.java @@ -11,121 +11,96 @@ public class PlatformInfo extends Node { @ObfuscatedGetter( intValue = 1318366785 ) - @Export("__ay") int __ay; @ObfuscatedName("ah") - @Export("__ah") boolean __ah; @ObfuscatedName("ak") @ObfuscatedGetter( intValue = 703904161 ) - @Export("__ak") int __ak; @ObfuscatedName("aw") @ObfuscatedGetter( intValue = 467004305 ) - @Export("__aw") int __aw; @ObfuscatedName("al") @ObfuscatedGetter( intValue = 2097018521 ) - @Export("__al") int __al; @ObfuscatedName("ab") @ObfuscatedGetter( intValue = -1667177301 ) - @Export("__ab") int __ab; @ObfuscatedName("ae") @ObfuscatedGetter( intValue = 385109109 ) - @Export("__ae") int __ae; @ObfuscatedName("at") - @Export("__at") boolean __at; @ObfuscatedName("ad") @ObfuscatedGetter( intValue = -1765017 ) - @Export("__ad") int __ad; @ObfuscatedName("ap") @ObfuscatedGetter( intValue = -817941105 ) - @Export("__ap") int __ap; @ObfuscatedName("am") @ObfuscatedGetter( intValue = 30207059 ) - @Export("__am") int __am; @ObfuscatedName("an") @ObfuscatedGetter( intValue = 890109053 ) - @Export("__an") int __an; @ObfuscatedName("az") - @Export("__az") String __az; @ObfuscatedName("au") - @Export("__au") String __au; @ObfuscatedName("ao") - @Export("__ao") String __ao; @ObfuscatedName("aa") - @Export("__aa") String __aa; @ObfuscatedName("ax") @ObfuscatedGetter( intValue = 871094255 ) - @Export("__ax") int __ax; @ObfuscatedName("af") @ObfuscatedGetter( intValue = 1955966365 ) - @Export("__af") int __af; @ObfuscatedName("ai") @ObfuscatedGetter( intValue = 1196598207 ) - @Export("__ai") int __ai; @ObfuscatedName("ba") @ObfuscatedGetter( intValue = -170839105 ) - @Export("__ba") int __ba; @ObfuscatedName("bb") - @Export("__bb") String __bb; @ObfuscatedName("bs") - @Export("__bs") String __bs; @ObfuscatedName("bq") - @Export("__bq") int[] __bq; @ObfuscatedName("bn") @ObfuscatedGetter( intValue = 1466207635 ) - @Export("__bn") int __bn; @ObfuscatedName("bk") - @Export("__bk") String __bk; PlatformInfo(int var1, boolean var2, int var3, int var4, int var5, int var6, int var7, boolean var8, int var9, int var10, int var11, int var12, String var13, String var14, String var15, String var16, int var17, int var18, int var19, int var20, String var21, String var22, int[] var23, int var24, String var25) { diff --git a/runescape-client/src/main/java/Player.java b/runescape-client/src/main/java/Player.java index d242931c4b..54cb0e8f4d 100644 --- a/runescape-client/src/main/java/Player.java +++ b/runescape-client/src/main/java/Player.java @@ -74,7 +74,6 @@ public final class Player extends Actor { @ObfuscatedGetter( intValue = 665272587 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( @@ -86,7 +85,6 @@ public final class Player extends Actor { @ObfuscatedGetter( intValue = -1771431457 ) - @Export("__i") int __i; @ObfuscatedName("a") @ObfuscatedSignature( @@ -98,25 +96,21 @@ public final class Player extends Actor { @ObfuscatedGetter( intValue = 1610462047 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = 224552403 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 305969541 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedGetter( intValue = 892671055 ) - @Export("__t") int __t; @ObfuscatedName("y") @Export("isUnanimated") @@ -155,7 +149,6 @@ public final class Player extends Actor { @Export("isInClanChat") TriBool isInClanChat; @ObfuscatedName("ag") - @Export("__ag") boolean __ag; @ObfuscatedName("aq") @ObfuscatedGetter( @@ -451,7 +444,6 @@ public final class Player extends Actor { signature = "(IIBI)V", garbageValue = "-2066158770" ) - @Export("__x_130") final void __x_130(int var1, int var2, byte var3) { if(super.sequence != -1 && WorldMapAreaData.getSequenceDefinition(super.sequence).__s == 1) { super.sequence = -1; @@ -496,7 +488,6 @@ public final class Player extends Actor { signature = "(IIBI)V", garbageValue = "-1280043751" ) - @Export("__a_131") final void __a_131(int var1, int var2, byte var3) { if(super.pathLength < 9) { ++super.pathLength; diff --git a/runescape-client/src/main/java/PlayerAppearance.java b/runescape-client/src/main/java/PlayerAppearance.java index 378fa71777..4a360ac4ce 100644 --- a/runescape-client/src/main/java/PlayerAppearance.java +++ b/runescape-client/src/main/java/PlayerAppearance.java @@ -8,10 +8,8 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("PlayerAppearance") public class PlayerAppearance { @ObfuscatedName("g") - @Export("__hi_g") public static short[] __hi_g; @ObfuscatedName("d") - @Export("__hi_d") static final int[] __hi_d; @ObfuscatedName("k") @ObfuscatedSignature( @@ -38,13 +36,11 @@ public class PlayerAppearance { @ObfuscatedGetter( longValue = -3506189412688081513L ) - @Export("__o") long __o; @ObfuscatedName("u") @ObfuscatedGetter( longValue = 8217880921734028425L ) - @Export("__u") long __u; static { @@ -57,7 +53,6 @@ public class PlayerAppearance { signature = "([I[IZII)V", garbageValue = "727056871" ) - @Export("__m_385") public void __m_385(int[] var1, int[] var2, boolean var3, int var4) { if(var1 == null) { var1 = new int[12]; @@ -85,7 +80,6 @@ public class PlayerAppearance { signature = "(IZI)V", garbageValue = "-581016899" ) - @Export("__f_386") public void __f_386(int var1, boolean var2) { if(var1 != 1 || !this.isFemale) { int var3 = this.equipment[__hi_d[var1]]; @@ -120,7 +114,6 @@ public class PlayerAppearance { signature = "(IZI)V", garbageValue = "1416503110" ) - @Export("__q_387") public void __q_387(int var1, boolean var2) { int var3 = this.bodyColors[var1]; if(!var2) { @@ -148,7 +141,6 @@ public class PlayerAppearance { signature = "(ZB)V", garbageValue = "-90" ) - @Export("__w_388") public void __w_388(boolean var1) { if(this.isFemale != var1) { this.__m_385((int[])null, this.bodyColors, var1, -1); @@ -160,7 +152,6 @@ public class PlayerAppearance { signature = "(Lgr;I)V", garbageValue = "779254645" ) - @Export("__o_389") public void __o_389(Buffer var1) { var1.writeByte(this.isFemale?1:0); diff --git a/runescape-client/src/main/java/PlayerType.java b/runescape-client/src/main/java/PlayerType.java index 2cf176aa29..8d3c185b3e 100644 --- a/runescape-client/src/main/java/PlayerType.java +++ b/runescape-client/src/main/java/PlayerType.java @@ -45,7 +45,6 @@ public enum PlayerType implements Enumerated { @Export("PlayerType_hardcoreIronman") PlayerType_hardcoreIronman(5, 10, false, false, true); @ObfuscatedName("ak") - @Export("__ij_ak") static Image __ij_ak; @ObfuscatedName("g") @ObfuscatedGetter( @@ -78,6 +77,7 @@ public enum PlayerType implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } @@ -87,6 +87,7 @@ public enum PlayerType implements Enumerated { signature = "(II)V", garbageValue = "300731074" ) + @Export("clearItemContainer") static void clearItemContainer(int var0) { ItemContainer var1 = (ItemContainer)ItemContainer.itemContainers.get((long)var0); if(var1 != null) { diff --git a/runescape-client/src/main/java/Players.java b/runescape-client/src/main/java/Players.java index 0b8eca1f88..5a6fc3c3c4 100644 --- a/runescape-client/src/main/java/Players.java +++ b/runescape-client/src/main/java/Players.java @@ -10,16 +10,13 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Players") public class Players { @ObfuscatedName("q") - @Export("__cq_q") static byte[] __cq_q; @ObfuscatedName("w") - @Export("__cq_w") static byte[] __cq_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "[Lgr;" ) - @Export("__cq_o") static Buffer[] __cq_o; @ObfuscatedName("u") @ObfuscatedGetter( @@ -34,10 +31,8 @@ public class Players { @ObfuscatedGetter( intValue = 945250525 ) - @Export("__cq_l") static int __cq_l; @ObfuscatedName("e") - @Export("__cq_e") static int[] __cq_e; @ObfuscatedName("x") @Export("Players_regions") @@ -52,16 +47,13 @@ public class Players { @ObfuscatedGetter( intValue = -22568397 ) - @Export("__cq_n") static int __cq_n; @ObfuscatedName("i") - @Export("__cq_i") static int[] __cq_i; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lgr;" ) - @Export("__cq_a") static Buffer __cq_a; @ObfuscatedName("y") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/Projectile.java b/runescape-client/src/main/java/Projectile.java index 8d6e496e77..e3e2945ea1 100644 --- a/runescape-client/src/main/java/Projectile.java +++ b/runescape-client/src/main/java/Projectile.java @@ -231,6 +231,7 @@ public final class Projectile extends Entity { signature = "(I)Ldu;", garbageValue = "-2134947096" ) + @Export("getModel") protected final Model getModel() { SpotAnimationDefinition var1 = class50.getSpotAnimationDefinition(this.id); Model var2 = var1.getModel(this.frame); diff --git a/runescape-client/src/main/java/RasterProvider.java b/runescape-client/src/main/java/RasterProvider.java index 4961433783..1de95514a1 100644 --- a/runescape-client/src/main/java/RasterProvider.java +++ b/runescape-client/src/main/java/RasterProvider.java @@ -51,6 +51,7 @@ public final class RasterProvider extends AbstractRasterProvider { signature = "(III)V", garbageValue = "-430495007" ) + @Export("drawFull") public final void drawFull(int var1, int var2) { this.drawFull0(this.component0.getGraphics(), var1, var2); } @@ -60,6 +61,7 @@ public final class RasterProvider extends AbstractRasterProvider { signature = "(IIIIB)V", garbageValue = "18" ) + @Export("draw") public final void draw(int var1, int var2, int var3, int var4) { this.draw0(this.component0.getGraphics(), var1, var2, var3, var4); } diff --git a/runescape-client/src/main/java/Rasterizer3D.java b/runescape-client/src/main/java/Rasterizer3D.java index 1bdd13aad5..b242467b4e 100644 --- a/runescape-client/src/main/java/Rasterizer3D.java +++ b/runescape-client/src/main/java/Rasterizer3D.java @@ -7,16 +7,13 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Rasterizer3D") public class Rasterizer3D extends Rasterizer2D { @ObfuscatedName("m") - @Export("__et_m") static boolean __et_m; @ObfuscatedName("f") - @Export("__et_f") static boolean __et_f; @ObfuscatedName("q") @Export("Rasterizer3D_isLowDetailTexture") static boolean Rasterizer3D_isLowDetailTexture; @ObfuscatedName("w") - @Export("__et_w") public static boolean __et_w; @ObfuscatedName("o") @Export("Rasterizer3D_alpha") @@ -61,10 +58,8 @@ public class Rasterizer3D extends Rasterizer2D { @Export("Rasterizer3D_textureLoader") public static TextureLoader Rasterizer3D_textureLoader; @ObfuscatedName("r") - @Export("__et_r") static int[] __et_r; @ObfuscatedName("p") - @Export("__et_p") static int[] __et_p; @ObfuscatedName("v") @Export("Rasterizer3D_sine") @@ -3428,21 +3423,25 @@ public class Rasterizer3D extends Rasterizer2D { } @ObfuscatedName("p") + @Export("rot3") static final int rot3(int var0, int var1, int var2, int var3) { return var0 * var2 - var3 * var1 >> 16; } @ObfuscatedName("v") + @Export("rot4") static final int rot4(int var0, int var1, int var2, int var3) { return var3 * var0 + var2 * var1 >> 16; } @ObfuscatedName("ag") + @Export("rot1") static final int rot1(int var0, int var1, int var2, int var3) { return var0 * var2 + var3 * var1 >> 16; } @ObfuscatedName("aq") + @Export("rot2") static final int rot2(int var0, int var1, int var2, int var3) { return var2 * var1 - var3 * var0 >> 16; } diff --git a/runescape-client/src/main/java/RawPcmStream.java b/runescape-client/src/main/java/RawPcmStream.java index 5f2fda9c74..2bc138ada2 100644 --- a/runescape-client/src/main/java/RawPcmStream.java +++ b/runescape-client/src/main/java/RawPcmStream.java @@ -7,29 +7,22 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("RawPcmStream") public class RawPcmStream extends PcmStream { @ObfuscatedName("m") - @Export("__m") int __m; @ObfuscatedName("f") - @Export("__f") int __f; @ObfuscatedName("q") - @Export("__q") int __q; @ObfuscatedName("o") - @Export("__o") int __o; @ObfuscatedName("u") - @Export("__u") int __u; @ObfuscatedName("g") - @Export("__g") int __g; @ObfuscatedName("l") - @Export("__l") int __l; @ObfuscatedName("e") - @Export("__e") - int __e; + @Export("numLoops") + int numLoops; @ObfuscatedName("x") @Export("start") int start; @@ -37,19 +30,14 @@ public class RawPcmStream extends PcmStream { @Export("end") int end; @ObfuscatedName("k") - @Export("__k") boolean __k; @ObfuscatedName("n") - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") - @Export("__i") int __i; @ObfuscatedName("a") - @Export("__a") int __a; @ObfuscatedName("z") - @Export("__z") int __z; @ObfuscatedSignature( @@ -83,7 +71,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("o") - @Export("__o_180") void __o_180() { this.__u = this.__q; this.__g = method2603(this.__q, this.__o); @@ -94,6 +81,7 @@ public class RawPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("firstSubStream") protected PcmStream firstSubStream() { return null; } @@ -102,6 +90,7 @@ public class RawPcmStream extends PcmStream { @ObfuscatedSignature( signature = "()Ldc;" ) + @Export("nextSubStream") protected PcmStream nextSubStream() { return null; } @@ -122,7 +111,7 @@ public class RawPcmStream extends PcmStream { int var7 = var4.samples.length << 8; int var8 = var6 - var5; if(var8 <= 0) { - this.__e = 0; + this.numLoops = 0; } int var9 = var2; @@ -147,7 +136,7 @@ public class RawPcmStream extends PcmStream { this.__m = var7 - 1; } - if(this.__e < 0) { + if(this.numLoops < 0) { if(this.__k) { if(this.__f < 0) { var9 = this.__ap_203(var1, var2, var5, var3, var4.samples[this.start]); @@ -195,7 +184,7 @@ public class RawPcmStream extends PcmStream { } } } else { - if(this.__e > 0) { + if(this.numLoops > 0) { if(this.__k) { label140: { if(this.__f < 0) { @@ -206,7 +195,7 @@ public class RawPcmStream extends PcmStream { this.__m = var5 + var5 - 1 - this.__m; this.__f = -this.__f; - if(--this.__e == 0) { + if(--this.numLoops == 0) { break label140; } } @@ -219,7 +208,7 @@ public class RawPcmStream extends PcmStream { this.__m = var6 + var6 - 1 - this.__m; this.__f = -this.__f; - if(--this.__e == 0) { + if(--this.numLoops == 0) { break; } @@ -230,7 +219,7 @@ public class RawPcmStream extends PcmStream { this.__m = var5 + var5 - 1 - this.__m; this.__f = -this.__f; - } while(--this.__e != 0); + } while(--this.numLoops != 0); } } else { int var10; @@ -242,14 +231,14 @@ public class RawPcmStream extends PcmStream { } var10 = (var6 - 1 - this.__m) / var8; - if(var10 >= this.__e) { - this.__m += var8 * this.__e; - this.__e = 0; + if(var10 >= this.numLoops) { + this.__m += var8 * this.numLoops; + this.numLoops = 0; break; } this.__m += var8 * var10; - this.__e -= var10; + this.numLoops -= var10; } } else { while(true) { @@ -259,14 +248,14 @@ public class RawPcmStream extends PcmStream { } var10 = (this.__m - var5) / var8; - if(var10 >= this.__e) { - this.__m -= var8 * this.__e; - this.__e = 0; + if(var10 >= this.numLoops) { + this.__m -= var8 * this.numLoops; + this.numLoops = 0; break; } this.__m -= var8 * var10; - this.__e -= var10; + this.numLoops -= var10; } } } @@ -293,9 +282,9 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("x") - @Export("__x_181") - public synchronized void __x_181(int var1) { - this.__e = var1; + @Export("setNumLoops") + public synchronized void setNumLoops(int var1) { + this.numLoops = var1; } @ObfuscatedName("d") @@ -327,7 +316,7 @@ public class RawPcmStream extends PcmStream { int var5 = var2.samples.length << 8; int var6 = var4 - var3; if(var6 <= 0) { - this.__e = 0; + this.numLoops = 0; } if(this.__m < 0) { @@ -351,7 +340,7 @@ public class RawPcmStream extends PcmStream { } this.__m += this.__f * var1; - if(this.__e < 0) { + if(this.numLoops < 0) { if(!this.__k) { if(this.__f < 0) { if(this.__m >= var3) { @@ -390,7 +379,7 @@ public class RawPcmStream extends PcmStream { } } else { - if(this.__e > 0) { + if(this.numLoops > 0) { if(this.__k) { label123: { if(this.__f < 0) { @@ -400,7 +389,7 @@ public class RawPcmStream extends PcmStream { this.__m = var3 + var3 - 1 - this.__m; this.__f = -this.__f; - if(--this.__e == 0) { + if(--this.numLoops == 0) { break label123; } } @@ -412,7 +401,7 @@ public class RawPcmStream extends PcmStream { this.__m = var4 + var4 - 1 - this.__m; this.__f = -this.__f; - if(--this.__e == 0) { + if(--this.numLoops == 0) { break; } @@ -422,7 +411,7 @@ public class RawPcmStream extends PcmStream { this.__m = var3 + var3 - 1 - this.__m; this.__f = -this.__f; - } while(--this.__e != 0); + } while(--this.numLoops != 0); } } else { int var7; @@ -432,28 +421,28 @@ public class RawPcmStream extends PcmStream { } var7 = (var4 - 1 - this.__m) / var6; - if(var7 < this.__e) { + if(var7 < this.numLoops) { this.__m += var6 * var7; - this.__e -= var7; + this.numLoops -= var7; return; } - this.__m += var6 * this.__e; - this.__e = 0; + this.__m += var6 * this.numLoops; + this.numLoops = 0; } else { if(this.__m < var4) { return; } var7 = (this.__m - var3) / var6; - if(var7 < this.__e) { + if(var7 < this.numLoops) { this.__m -= var6 * var7; - this.__e -= var7; + this.numLoops -= var7; return; } - this.__m -= var6 * this.__e; - this.__e = 0; + this.__m -= var6 * this.numLoops; + this.numLoops = 0; } } } @@ -474,19 +463,16 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("a") - @Export("__a_182") public synchronized void __a_182(int var1) { this.__j_184(var1 << 6, this.__t_186()); } @ObfuscatedName("z") - @Export("__z_183") synchronized void __z_183(int var1) { this.__j_184(var1, this.__t_186()); } @ObfuscatedName("j") - @Export("__j_184") synchronized void __j_184(int var1, int var2) { this.__q = var1; this.__o = var2; @@ -495,19 +481,16 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("s") - @Export("__s_185") public synchronized int __s_185() { return this.__q == Integer.MIN_VALUE?0:this.__q; } @ObfuscatedName("t") - @Export("__t_186") public synchronized int __t_186() { return this.__o < 0?-1:this.__o; } @ObfuscatedName("y") - @Export("__y_187") public synchronized void __y_187(int var1) { int var2 = ((RawSound)super.sound).samples.length << 8; if(var1 < -1) { @@ -526,14 +509,12 @@ public class RawPcmStream extends PcmStream { signature = "(Z)V", garbageValue = "1" ) - @Export("__h_188") public synchronized void __h_188() { this.__f = (this.__f ^ this.__f >> 31) + (this.__f >>> 31); this.__f = -this.__f; } @ObfuscatedName("b") - @Export("__b_189") void __b_189() { if(this.__n != 0) { if(this.__q == Integer.MIN_VALUE) { @@ -547,13 +528,11 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("c") - @Export("__c_190") public synchronized void __c_190(int var1, int var2) { this.__p_191(var1, var2, this.__t_186()); } @ObfuscatedName("p") - @Export("__p_191") public synchronized void __p_191(int var1, int var2, int var3) { if(var1 == 0) { this.__j_184(var2, var3); @@ -599,7 +578,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("v") - @Export("__v_192") public synchronized void __v_192(int var1) { if(var1 == 0) { this.__z_183(0); @@ -644,7 +622,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("ah") - @Export("__ah_193") public synchronized void __ah_193(int var1) { if(this.__f < 0) { this.__f = -var1; @@ -655,25 +632,21 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("ab") - @Export("__ab_194") public synchronized int __ab_194() { return this.__f < 0?-this.__f:this.__f; } @ObfuscatedName("ae") - @Export("__ae_195") public boolean __ae_195() { return this.__m < 0 || this.__m >= ((RawSound)super.sound).samples.length << 8; } @ObfuscatedName("at") - @Export("__at_196") public boolean __at_196() { return this.__n != 0; } @ObfuscatedName("ad") - @Export("__ad_202") int __ad_202(int[] var1, int var2, int var3, int var4, int var5) { while(true) { if(this.__n > 0) { @@ -724,7 +697,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("ap") - @Export("__ap_203") int __ap_203(int[] var1, int var2, int var3, int var4, int var5) { while(true) { if(this.__n > 0) { @@ -775,13 +747,12 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("az") - @Export("__az_179") int __az_179() { int var1 = this.__u * 3 >> 6; var1 = (var1 ^ var1 >> 31) + (var1 >>> 31); - if(this.__e == 0) { + if(this.numLoops == 0) { var1 -= var1 * this.__m / (((RawSound)super.sound).samples.length << 8); - } else if(this.__e >= 0) { + } else if(this.numLoops >= 0) { var1 -= var1 * this.start / ((RawSound)super.sound).samples.length; } @@ -789,7 +760,6 @@ public class RawPcmStream extends PcmStream { } @ObfuscatedName("au") - @Export("__au_204") boolean __au_204() { int var1 = this.__q; int var2; @@ -872,7 +842,8 @@ public class RawPcmStream extends PcmStream { @ObfuscatedSignature( signature = "(Lcx;II)Lds;" ) - public static RawPcmStream method2497(RawSound var0, int var1, int var2) { + @Export("createRawPcmStream") + public static RawPcmStream createRawPcmStream(RawSound var0, int var1, int var2) { return var0.samples != null && var0.samples.length != 0?new RawPcmStream(var0, (int)((long)var0.sampleRate * 256L * (long)var1 / (long)(class309.PcmPlayer_sampleRate * 100)), var2 << 6):null; } diff --git a/runescape-client/src/main/java/RawSound.java b/runescape-client/src/main/java/RawSound.java index b9d8fd8a14..e746b0a448 100644 --- a/runescape-client/src/main/java/RawSound.java +++ b/runescape-client/src/main/java/RawSound.java @@ -19,7 +19,6 @@ public class RawSound extends AbstractSound { @Export("end") int end; @ObfuscatedName("o") - @Export("__o") public boolean __o; RawSound(int var1, byte[] var2, int var3, int var4) { diff --git a/runescape-client/src/main/java/RectangleMode.java b/runescape-client/src/main/java/RectangleMode.java index 4a6349f170..006557d5f8 100644 --- a/runescape-client/src/main/java/RectangleMode.java +++ b/runescape-client/src/main/java/RectangleMode.java @@ -11,19 +11,16 @@ public enum RectangleMode implements Enumerated { @ObfuscatedSignature( signature = "Llj;" ) - @Export("__lj_m") __lj_m(0, 0), @ObfuscatedName("f") @ObfuscatedSignature( signature = "Llj;" ) - @Export("__lj_f") __lj_f(1, 1), @ObfuscatedName("q") @ObfuscatedSignature( signature = "Llj;" ) - @Export("__lj_q") __lj_q(2, 2); @ObfuscatedName("d") @Export("musicTrackBoolean") @@ -51,6 +48,7 @@ public enum RectangleMode implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id2; } diff --git a/runescape-client/src/main/java/RouteStrategy.java b/runescape-client/src/main/java/RouteStrategy.java index 7e8bfe3ebd..47bf872c16 100644 --- a/runescape-client/src/main/java/RouteStrategy.java +++ b/runescape-client/src/main/java/RouteStrategy.java @@ -13,27 +13,30 @@ public abstract class RouteStrategy @Export("Interpreter_intStackSize") static int Interpreter_intStackSize; @ObfuscatedName("e") - @Export("__fe_e") static byte[][][] __fe_e; @ObfuscatedName("m") @ObfuscatedGetter( intValue = 123677543 ) + @Export("approxDestinationX") public int approxDestinationX; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -2126454535 ) + @Export("approxDestinationY") public int approxDestinationY; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -1566880917 ) + @Export("approxDestinationSizeX") public int approxDestinationSizeX; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -2126101601 ) + @Export("approxDestinationSizeY") public int approxDestinationSizeY; @ObfuscatedName("m") @@ -70,6 +73,7 @@ public abstract class RouteStrategy signature = "(Lir;II)Z", garbageValue = "-602741260" ) + @Export("loadSpriteFlat") static boolean loadSpriteFlat(AbstractIndexCache var0, int var1) { byte[] var2 = var0.takeRecordFlat(var1); if(var2 == null) { diff --git a/runescape-client/src/main/java/RunException.java b/runescape-client/src/main/java/RunException.java index 1f11fe607a..75df0eac82 100644 --- a/runescape-client/src/main/java/RunException.java +++ b/runescape-client/src/main/java/RunException.java @@ -24,7 +24,6 @@ public class RunException extends RuntimeException { @ObfuscatedGetter( intValue = 121013503 ) - @Export("__fx_w") public static int __fx_w; @ObfuscatedName("o") @Export("string") diff --git a/runescape-client/src/main/java/Scene.java b/runescape-client/src/main/java/Scene.java index c4158ec348..85a75d1337 100644 --- a/runescape-client/src/main/java/Scene.java +++ b/runescape-client/src/main/java/Scene.java @@ -82,8 +82,8 @@ public class Scene { @Export("Scene_selectedY") public static int Scene_selectedY; @ObfuscatedName("ab") - @Export("__em_ab") - static boolean __em_ab; + @Export("viewportWalking") + static boolean viewportWalking; @ObfuscatedName("ad") @Export("Scene_planesCount") static int Scene_planesCount; @@ -112,25 +112,18 @@ public class Scene { @Export("Scene_tilesDeque") static NodeDeque Scene_tilesDeque; @ObfuscatedName("au") - @Export("__em_au") static final int[] __em_au; @ObfuscatedName("ao") - @Export("__em_ao") static final int[] __em_ao; @ObfuscatedName("aa") - @Export("__em_aa") static final int[] __em_aa; @ObfuscatedName("ax") - @Export("__em_ax") static final int[] __em_ax; @ObfuscatedName("af") - @Export("__em_af") static final int[] __em_af; @ObfuscatedName("ai") - @Export("__em_ai") static final int[] __em_ai; @ObfuscatedName("ba") - @Export("__em_ba") static final int[] __em_ba; @ObfuscatedName("bc") @Export("visibilityMap") @@ -187,13 +180,10 @@ public class Scene { @Export("tempGameObjects") GameObject[] tempGameObjects; @ObfuscatedName("x") - @Export("__x") int[][][] __x; @ObfuscatedName("bk") - @Export("__bk") int[][] __bk; @ObfuscatedName("bd") - @Export("__bd") int[][] __bd; static { @@ -207,7 +197,7 @@ public class Scene { Scene_selectedScreenY = 0; Scene_selectedX = -1; Scene_selectedY = -1; - __em_ab = false; + viewportWalking = false; Scene_planesCount = 4; Scene_planeOccluderCounts = new int[Scene_planesCount]; Scene_planeOccluders = new Occluder[Scene_planesCount][500]; @@ -484,7 +474,6 @@ public class Scene { @ObfuscatedSignature( signature = "(IIIIIILex;IJI)Z" ) - @Export("__d_238") public boolean __d_238(int var1, int var2, int var3, int var4, int var5, int var6, Entity var7, int var8, long var9, int var11) { if(var7 == null) { return true; @@ -499,7 +488,6 @@ public class Scene { @ObfuscatedSignature( signature = "(IIIIILex;IJZ)Z" ) - @Export("__a_239") public boolean __a_239(int var1, int var2, int var3, int var4, int var5, Entity var6, int var7, long var8, boolean var10) { if(var6 == null) { return true; @@ -538,7 +526,6 @@ public class Scene { @ObfuscatedSignature( signature = "(IIIIILex;IJIIII)Z" ) - @Export("__z_240") public boolean __z_240(int var1, int var2, int var3, int var4, int var5, Entity var6, int var7, long var8, int var10, int var11, int var12, int var13) { return var6 == null?true:this.newGameObject(var1, var10, var11, var12 - var10 + 1, var13 - var11 + 1, var2, var3, var4, var6, var7, true, var8, 0); } @@ -666,7 +653,6 @@ public class Scene { } @ObfuscatedName("y") - @Export("__y_241") public void __y_241(int var1, int var2, int var3, int var4) { Tile var5 = this.tiles[var1][var2][var3]; if(var5 != null) { @@ -697,7 +683,6 @@ public class Scene { } @ObfuscatedName("c") - @Export("__c_242") public void __c_242(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if(var4 != null) { @@ -757,7 +742,6 @@ public class Scene { @ObfuscatedSignature( signature = "(III)Leh;" ) - @Export("__aj_243") public GameObject __aj_243(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if(var4 == null) { @@ -788,21 +772,18 @@ public class Scene { } @ObfuscatedName("ar") - @Export("__ar_244") public long __ar_244(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 != null && var4.boundaryObject != null?var4.boundaryObject.tag:0L; } @ObfuscatedName("ac") - @Export("__ac_245") public long __ac_245(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; return var4 != null && var4.wallDecoration != null?var4.wallDecoration.tag:0L; } @ObfuscatedName("ay") - @Export("__ay_246") public long __ay_246(int var1, int var2, int var3) { Tile var4 = this.tiles[var1][var2][var3]; if(var4 == null) { @@ -853,7 +834,6 @@ public class Scene { } @ObfuscatedName("aw") - @Export("__aw_247") public void __aw_247(int var1, int var2, int var3) { for(int var4 = 0; var4 < this.planes; ++var4) { for(int var5 = 0; var5 < this.xSize; ++var5) { @@ -901,7 +881,6 @@ public class Scene { @ObfuscatedSignature( signature = "(Ldw;III)V" ) - @Export("__al_248") void __al_248(ModelData var1, int var2, int var3, int var4) { Tile var5; ModelData var6; @@ -943,7 +922,6 @@ public class Scene { @ObfuscatedSignature( signature = "(Ldw;IIIII)V" ) - @Export("__ab_249") void __ab_249(ModelData var1, int var2, int var3, int var4, int var5, int var6) { boolean var7 = true; int var8 = var3; @@ -1066,7 +1044,7 @@ public class Scene { public void menuOpen(int var1, int var2, int var3, boolean var4) { if(!method3187() || var4) { checkClick = true; - __em_ab = var4; + viewportWalking = var4; Scene_selectedPlane = var1; Scene_selectedScreenX = var2; Scene_selectedScreenY = var3; @@ -1076,9 +1054,8 @@ public class Scene { } @ObfuscatedName("as") - @Export("__as_250") public void __as_250() { - __em_ab = true; + viewportWalking = true; } @ObfuscatedName("az") @@ -2148,7 +2125,6 @@ public class Scene { } @ObfuscatedName("ba") - @Export("__ba_253") boolean __ba_253(int var1, int var2, int var3) { int var4 = this.__x[var1][var2][var3]; if(var4 == -Scene_drawnCount) { @@ -2169,7 +2145,6 @@ public class Scene { } @ObfuscatedName("bb") - @Export("__bb_254") boolean __bb_254(int var1, int var2, int var3, int var4) { if(!this.__ba_253(var1, var2, var3)) { return false; @@ -2315,7 +2290,6 @@ public class Scene { } @ObfuscatedName("bs") - @Export("__bs_255") boolean __bs_255(int var1, int var2, int var3, int var4) { if(!this.__ba_253(var1, var2, var3)) { return false; @@ -2327,7 +2301,6 @@ public class Scene { } @ObfuscatedName("bq") - @Export("__bq_256") boolean __bq_256(int var1, int var2, int var3, int var4, int var5, int var6) { int var7; int var8; @@ -2372,7 +2345,6 @@ public class Scene { } @ObfuscatedName("bn") - @Export("__bn_257") boolean __bn_257(int var1, int var2, int var3) { for(int var4 = 0; var4 < Scene_currentOccludersCount; ++var4) { Occluder var5 = Scene_currentOccluders[var4]; @@ -2561,13 +2533,13 @@ public class Scene { @ObfuscatedName("am") public static boolean method3187() { - return __em_ab && Scene_selectedX != -1; + return viewportWalking && Scene_selectedX != -1; } @ObfuscatedName("an") public static void method3103() { Scene_selectedX = -1; - __em_ab = false; + viewportWalking = false; } @ObfuscatedName("ax") diff --git a/runescape-client/src/main/java/Script.java b/runescape-client/src/main/java/Script.java index 068866a0a1..585a8793b2 100644 --- a/runescape-client/src/main/java/Script.java +++ b/runescape-client/src/main/java/Script.java @@ -62,7 +62,6 @@ public class Script extends DualNode { signature = "(II)[Llh;", garbageValue = "-729647116" ) - @Export("__o_164") IterableNodeHashTable[] __o_164(int var1) { return new IterableNodeHashTable[var1]; } @@ -124,7 +123,7 @@ public class Script extends DualNode { int var6 = var4 >> 4 & 7; int var7 = var4 & 15; Client.soundEffectIds[Client.soundEffectCount] = var5; - Client.unknownSoundValues1[Client.soundEffectCount] = var6; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var6; Client.queuedSoundEffectDelays[Client.soundEffectCount] = 0; Client.soundEffects[Client.soundEffectCount] = null; int var8 = (var2 - 64) / 128; diff --git a/runescape-client/src/main/java/ScriptEvent.java b/runescape-client/src/main/java/ScriptEvent.java index 2ba2514916..a772be2e8d 100644 --- a/runescape-client/src/main/java/ScriptEvent.java +++ b/runescape-client/src/main/java/ScriptEvent.java @@ -74,7 +74,6 @@ public class ScriptEvent extends Node { @ObfuscatedGetter( intValue = -2138736593 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/SequenceDefinition.java b/runescape-client/src/main/java/SequenceDefinition.java index 2e3d8fb8bd..0223305001 100644 --- a/runescape-client/src/main/java/SequenceDefinition.java +++ b/runescape-client/src/main/java/SequenceDefinition.java @@ -17,13 +17,11 @@ public class SequenceDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jh_f") public static AbstractIndexCache __jh_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jh_q") public static AbstractIndexCache __jh_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -35,7 +33,6 @@ public class SequenceDefinition extends DualNode { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jh_o") public static EvictingDualNodeHashTable __jh_o; @ObfuscatedName("u") @Export("frameIds") @@ -47,7 +44,6 @@ public class SequenceDefinition extends DualNode { @Export("frameLengths") public int[] frameLengths; @ObfuscatedName("e") - @Export("__e") public int[] __e; @ObfuscatedName("x") @ObfuscatedGetter( @@ -56,16 +52,13 @@ public class SequenceDefinition extends DualNode { @Export("frameCount") public int frameCount; @ObfuscatedName("d") - @Export("__d") int[] __d; @ObfuscatedName("k") - @Export("__k") public boolean __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = 1309695045 ) - @Export("__n") public int __n; @ObfuscatedName("i") @ObfuscatedGetter( @@ -83,25 +76,21 @@ public class SequenceDefinition extends DualNode { @ObfuscatedGetter( intValue = -28345361 ) - @Export("__z") public int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = 1339014215 ) - @Export("__j") public int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = 2012242069 ) - @Export("__s") public int __s; @ObfuscatedName("t") @ObfuscatedGetter( intValue = 1147391369 ) - @Export("__t") public int __t; static { diff --git a/runescape-client/src/main/java/ServerBuild.java b/runescape-client/src/main/java/ServerBuild.java index 30b828ab0f..cf133ba7c4 100644 --- a/runescape-client/src/main/java/ServerBuild.java +++ b/runescape-client/src/main/java/ServerBuild.java @@ -11,25 +11,21 @@ public class ServerBuild { @ObfuscatedSignature( signature = "Liy;" ) - @Export("__iy_m") public static final ServerBuild __iy_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Liy;" ) - @Export("__iy_f") public static final ServerBuild __iy_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Liy;" ) - @Export("__iy_q") public static final ServerBuild __iy_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Liy;" ) - @Export("__iy_w") public static final ServerBuild __iy_w; @ObfuscatedName("bx") @Export("worldsUrl") @@ -38,7 +34,6 @@ public class ServerBuild { @ObfuscatedGetter( intValue = -365366303 ) - @Export("__iy_lo") static int __iy_lo; @ObfuscatedName("o") @Export("name") diff --git a/runescape-client/src/main/java/ServerPacket.java b/runescape-client/src/main/java/ServerPacket.java index 27740a02bf..c0df9ef55c 100644 --- a/runescape-client/src/main/java/ServerPacket.java +++ b/runescape-client/src/main/java/ServerPacket.java @@ -11,511 +11,426 @@ public class ServerPacket { @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_m") public static final ServerPacket __ge_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_f") public static final ServerPacket __ge_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_q") public static final ServerPacket __ge_q; @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_w") public static final ServerPacket __ge_w; @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_o") public static final ServerPacket __ge_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_u") public static final ServerPacket __ge_u; @ObfuscatedName("g") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_g") public static final ServerPacket __ge_g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_l") public static final ServerPacket __ge_l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_e") public static final ServerPacket __ge_e; @ObfuscatedName("x") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_x") public static final ServerPacket __ge_x; @ObfuscatedName("d") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_d") public static final ServerPacket __ge_d; @ObfuscatedName("k") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_k") public static final ServerPacket __ge_k; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_n") public static final ServerPacket __ge_n; @ObfuscatedName("i") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_i") public static final ServerPacket __ge_i; @ObfuscatedName("a") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_a") public static final ServerPacket __ge_a; @ObfuscatedName("z") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_z") public static final ServerPacket __ge_z; @ObfuscatedName("j") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_j") public static final ServerPacket __ge_j; @ObfuscatedName("s") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_s") public static final ServerPacket __ge_s; @ObfuscatedName("t") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_t") public static final ServerPacket __ge_t; @ObfuscatedName("y") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_y") public static final ServerPacket __ge_y; @ObfuscatedName("h") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_h") public static final ServerPacket __ge_h; @ObfuscatedName("b") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_b") public static final ServerPacket __ge_b; @ObfuscatedName("c") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_c") public static final ServerPacket __ge_c; @ObfuscatedName("r") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_r") public static final ServerPacket __ge_r; @ObfuscatedName("p") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_p") public static final ServerPacket __ge_p; @ObfuscatedName("v") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_v") public static final ServerPacket __ge_v; @ObfuscatedName("ag") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ag") public static final ServerPacket __ge_ag; @ObfuscatedName("aq") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_aq") public static final ServerPacket __ge_aq; @ObfuscatedName("aj") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_aj") public static final ServerPacket __ge_aj; @ObfuscatedName("av") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_av") public static final ServerPacket __ge_av; @ObfuscatedName("ar") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ar") public static final ServerPacket __ge_ar; @ObfuscatedName("ac") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ac") public static final ServerPacket __ge_ac; @ObfuscatedName("ay") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ay") public static final ServerPacket __ge_ay; @ObfuscatedName("ah") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ah") public static final ServerPacket __ge_ah; @ObfuscatedName("ak") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ak") public static final ServerPacket __ge_ak; @ObfuscatedName("aw") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_aw") public static final ServerPacket __ge_aw; @ObfuscatedName("al") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_al") public static final ServerPacket __ge_al; @ObfuscatedName("ab") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ab") public static final ServerPacket __ge_ab; @ObfuscatedName("ae") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ae") public static final ServerPacket __ge_ae; @ObfuscatedName("at") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_at") public static final ServerPacket __ge_at; @ObfuscatedName("ad") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ad") public static final ServerPacket __ge_ad; @ObfuscatedName("ap") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ap") public static final ServerPacket __ge_ap; @ObfuscatedName("as") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_as") public static final ServerPacket __ge_as; @ObfuscatedName("am") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_am") public static final ServerPacket __ge_am; @ObfuscatedName("an") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_an") public static final ServerPacket __ge_an; @ObfuscatedName("az") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_az") public static final ServerPacket __ge_az; @ObfuscatedName("au") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_au") public static final ServerPacket __ge_au; @ObfuscatedName("ao") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ao") public static final ServerPacket __ge_ao; @ObfuscatedName("aa") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_aa") public static final ServerPacket __ge_aa; @ObfuscatedName("ax") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ax") public static final ServerPacket __ge_ax; @ObfuscatedName("af") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_af") public static final ServerPacket __ge_af; @ObfuscatedName("ai") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ai") public static final ServerPacket __ge_ai; @ObfuscatedName("ba") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ba") public static final ServerPacket __ge_ba; @ObfuscatedName("bb") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bb") public static final ServerPacket __ge_bb; @ObfuscatedName("bs") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bs") public static final ServerPacket __ge_bs; @ObfuscatedName("bq") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bq") public static final ServerPacket __ge_bq; @ObfuscatedName("bn") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bn") public static final ServerPacket __ge_bn; @ObfuscatedName("bk") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bk") public static final ServerPacket __ge_bk; @ObfuscatedName("bd") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bd") public static final ServerPacket __ge_bd; @ObfuscatedName("bc") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bc") public static final ServerPacket __ge_bc; @ObfuscatedName("bo") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bo") public static final ServerPacket __ge_bo; @ObfuscatedName("bx") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bx") public static final ServerPacket __ge_bx; @ObfuscatedName("by") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_by") public static final ServerPacket __ge_by; @ObfuscatedName("bu") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bu") public static final ServerPacket __ge_bu; @ObfuscatedName("bm") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bm") public static final ServerPacket __ge_bm; @ObfuscatedName("bl") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bl") public static final ServerPacket __ge_bl; @ObfuscatedName("br") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_br") public static final ServerPacket __ge_br; @ObfuscatedName("bj") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bj") public static final ServerPacket __ge_bj; @ObfuscatedName("bi") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bi") public static final ServerPacket __ge_bi; @ObfuscatedName("bz") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bz") public static final ServerPacket __ge_bz; @ObfuscatedName("bg") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bg") public static final ServerPacket __ge_bg; @ObfuscatedName("bt") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bt") public static final ServerPacket __ge_bt; @ObfuscatedName("bp") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bp") public static final ServerPacket __ge_bp; @ObfuscatedName("bf") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bf") public static final ServerPacket __ge_bf; @ObfuscatedName("bh") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bh") public static final ServerPacket __ge_bh; @ObfuscatedName("be") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_be") public static final ServerPacket __ge_be; @ObfuscatedName("bv") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bv") public static final ServerPacket __ge_bv; @ObfuscatedName("bw") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_bw") public static final ServerPacket __ge_bw; @ObfuscatedName("cr") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cr") public static final ServerPacket __ge_cr; @ObfuscatedName("cv") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cv") public static final ServerPacket __ge_cv; @ObfuscatedName("ce") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_ce") public static final ServerPacket __ge_ce; @ObfuscatedName("cy") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cy") public static final ServerPacket __ge_cy; @ObfuscatedName("cs") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cs") public static final ServerPacket __ge_cs; @ObfuscatedName("cm") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cm") public static final ServerPacket __ge_cm; @ObfuscatedName("cj") @ObfuscatedSignature( signature = "Lge;" ) - @Export("__ge_cj") public static final ServerPacket __ge_cj; @ObfuscatedName("ix") @ObfuscatedGetter( @@ -634,6 +549,7 @@ public class ServerPacket { signature = "(I)Llq;", garbageValue = "2048918805" ) + @Export("createIndexedSprite") static IndexedSprite createIndexedSprite() { IndexedSprite var0 = new IndexedSprite(); var0.width = class328.indexedSpriteWidth; diff --git a/runescape-client/src/main/java/Skeleton.java b/runescape-client/src/main/java/Skeleton.java index eb49ea8c5a..5fc72906be 100644 --- a/runescape-client/src/main/java/Skeleton.java +++ b/runescape-client/src/main/java/Skeleton.java @@ -11,7 +11,6 @@ public class Skeleton extends Node { @ObfuscatedGetter( intValue = 2096389021 ) - @Export("__ek_x") static int __ek_x; @ObfuscatedName("dc") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/Skills.java b/runescape-client/src/main/java/Skills.java index 469999c36d..ae1e7c6b0a 100644 --- a/runescape-client/src/main/java/Skills.java +++ b/runescape-client/src/main/java/Skills.java @@ -13,7 +13,6 @@ public class Skills { @Export("Skills_experienceTable") public static int[] Skills_experienceTable; @ObfuscatedName("ef") - @Export("__hc_ef") static int[] __hc_ef; static { diff --git a/runescape-client/src/main/java/SoftWrapper.java b/runescape-client/src/main/java/SoftWrapper.java index ce8bf940a1..5c1c0cc0ed 100644 --- a/runescape-client/src/main/java/SoftWrapper.java +++ b/runescape-client/src/main/java/SoftWrapper.java @@ -16,11 +16,13 @@ public class SoftWrapper extends Wrapper { } @ObfuscatedName("m") + @Export("get") Object get() { return this.ref.get(); } @ObfuscatedName("f") + @Export("isSoft") boolean isSoft() { return true; } diff --git a/runescape-client/src/main/java/SoundEffect.java b/runescape-client/src/main/java/SoundEffect.java index 79e06ab3c7..f443c3306f 100644 --- a/runescape-client/src/main/java/SoundEffect.java +++ b/runescape-client/src/main/java/SoundEffect.java @@ -49,7 +49,6 @@ public class SoundEffect { } @ObfuscatedName("q") - @Export("__q_174") public final int __q_174() { int var1 = 9999999; diff --git a/runescape-client/src/main/java/SpotAnimationDefinition.java b/runescape-client/src/main/java/SpotAnimationDefinition.java index b690fbb072..84807ce61c 100644 --- a/runescape-client/src/main/java/SpotAnimationDefinition.java +++ b/runescape-client/src/main/java/SpotAnimationDefinition.java @@ -83,13 +83,11 @@ public class SpotAnimationDefinition extends DualNode { @ObfuscatedGetter( intValue = -20619847 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = 1866148625 ) - @Export("__z") int __z; static { diff --git a/runescape-client/src/main/java/Sprite.java b/runescape-client/src/main/java/Sprite.java index 5a94baf1d4..d56f907f4a 100644 --- a/runescape-client/src/main/java/Sprite.java +++ b/runescape-client/src/main/java/Sprite.java @@ -108,7 +108,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("o") - @Export("__o_499") public void __o_499(int var1) { if(this.subWidth != this.width || this.subHeight != this.height) { int var2 = var1; @@ -150,7 +149,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("u") - @Export("__u_500") public void __u_500() { int[] var1 = new int[this.subWidth * this.subHeight]; int var2 = 0; @@ -166,7 +164,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("g") - @Export("__g_501") public void __g_501() { int[] var1 = new int[this.subWidth * this.subHeight]; int var2 = 0; @@ -182,7 +179,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("l") - @Export("__l_502") public void __l_502(int var1) { int[] var2 = new int[this.subWidth * this.subHeight]; int var3 = 0; @@ -210,7 +206,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("e") - @Export("__e_503") public void __e_503(int var1) { for(int var2 = this.subHeight - 1; var2 > 0; --var2) { int var3 = var2 * this.subWidth; @@ -317,7 +312,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("j") - @Export("__j_506") public void __j_506(int var1, int var2, int var3, int var4) { if(var3 > 0 && var4 > 0) { int var5 = this.subWidth; @@ -432,7 +426,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("h") - @Export("__h_508") public void __h_508(int var1, int var2, int var3) { var1 += this.yOffset; var2 += this.xOffset; @@ -478,7 +471,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("c") - @Export("__c_509") public void __c_509(int var1, int var2, int var3, int var4, int var5) { if(var3 > 0 && var4 > 0) { int var6 = this.subWidth; @@ -543,7 +535,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("v") - @Export("__v_510") public void __v_510(int var1, int var2, int var3) { var1 += this.yOffset; var2 += this.xOffset; @@ -594,7 +585,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("aj") - @Export("__aj_511") public void __aj_511(int var1, int var2, int var3, int var4, int var5) { if(var3 > 0 && var4 > 0) { int var6 = this.subWidth; @@ -664,7 +654,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("ac") - @Export("__ac_512") public void __ac_512(int var1, int var2, int var3, int var4, int var5, int var6, int[] var7, int[] var8) { int var9 = var2 < 0?-var2:0; int var10 = var2 + this.subHeight <= var6?this.subHeight:var6 - var2; @@ -713,7 +702,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("ay") - @Export("__ay_513") public void __ay_513(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int[] var9, int[] var10) { try { int var11 = -var3 / 2; @@ -749,7 +737,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("ah") - @Export("__ah_514") public void __ah_514(int var1, int var2, int var3, int var4, int var5, int var6, double var7, int var9) { try { int var10 = -var3 / 2; @@ -790,13 +777,11 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("ak") - @Export("__ak_515") public void __ak_515(int var1, int var2, int var3, int var4) { this.__aw_516(this.width << 3, this.height << 3, var1 << 4, var2 << 4, var3, var4); } @ObfuscatedName("aw") - @Export("__aw_516") void __aw_516(int var1, int var2, int var3, int var4, int var5, int var6) { if(var6 != 0) { var1 -= this.yOffset << 4; @@ -1266,7 +1251,6 @@ public final class Sprite extends Rasterizer2D { } @ObfuscatedName("al") - @Export("__al_517") public void __al_517(int var1, int var2, int var3, int var4) { if(var3 <= this.width && var4 <= this.height) { int var5 = var3 * this.yOffset / this.width + var1; diff --git a/runescape-client/src/main/java/SpriteIds.java b/runescape-client/src/main/java/SpriteIds.java index 2fba5062e2..e0db3df86e 100644 --- a/runescape-client/src/main/java/SpriteIds.java +++ b/runescape-client/src/main/java/SpriteIds.java @@ -11,13 +11,11 @@ public class SpriteIds { @ObfuscatedGetter( intValue = 1673796151 ) - @Export("__m") public int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 159591367 ) - @Export("__f") public int __f; @ObfuscatedName("q") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/SpriteMask.java b/runescape-client/src/main/java/SpriteMask.java index f6e81e2c1b..abcc91283c 100644 --- a/runescape-client/src/main/java/SpriteMask.java +++ b/runescape-client/src/main/java/SpriteMask.java @@ -95,6 +95,7 @@ public class SpriteMask extends DualNode { signature = "(Lir;IIB)Z", garbageValue = "1" ) + @Export("loadSprite") public static boolean loadSprite(AbstractIndexCache var0, int var1, int var2) { byte[] var3 = var0.takeRecord(var1, var2); if(var3 == null) { diff --git a/runescape-client/src/main/java/Strings.java b/runescape-client/src/main/java/Strings.java index 25f84bfa89..a0c5f48aac 100644 --- a/runescape-client/src/main/java/Strings.java +++ b/runescape-client/src/main/java/Strings.java @@ -7,19 +7,14 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("Strings") public class Strings { @ObfuscatedName("bq") - @Export("__id_bq") public static String __id_bq; @ObfuscatedName("cp") - @Export("__id_cp") public static String __id_cp; @ObfuscatedName("jr") - @Export("__id_jr") public static String __id_jr; @ObfuscatedName("jv") - @Export("__id_jv") public static String __id_jv; @ObfuscatedName("ju") - @Export("__id_ju") public static String __id_ju; static { diff --git a/runescape-client/src/main/java/StructDefinition.java b/runescape-client/src/main/java/StructDefinition.java index 21848a13cd..898e0a5a9c 100644 --- a/runescape-client/src/main/java/StructDefinition.java +++ b/runescape-client/src/main/java/StructDefinition.java @@ -10,13 +10,11 @@ public class StructDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__jq_m") public static AbstractIndexCache __jq_m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Ler;" ) - @Export("__jq_f") public static EvictingDualNodeHashTable __jq_f; @ObfuscatedName("q") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/StudioGame.java b/runescape-client/src/main/java/StudioGame.java index 6f03e0a231..4e175febd8 100644 --- a/runescape-client/src/main/java/StudioGame.java +++ b/runescape-client/src/main/java/StudioGame.java @@ -11,37 +11,31 @@ public enum StudioGame implements Enumerated { @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_m") __is_m("runescape", "RuneScape", 0), @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_f") __is_f("stellardawn", "Stellar Dawn", 1), @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_q") __is_q("game3", "Game 3", 2), @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_w") __is_w("game4", "Game 4", 3), @ObfuscatedName("o") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_o") __is_o("game5", "Game 5", 4), @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lis;" ) - @Export("__is_u") __is_u("oldscape", "RuneScape 2007", 5); @ObfuscatedName("g") @@ -64,7 +58,7 @@ public enum StudioGame implements Enumerated { signature = "(B)I", garbageValue = "83" ) - @Export("ordinal") + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } diff --git a/runescape-client/src/main/java/Texture.java b/runescape-client/src/main/java/Texture.java index ee59d8609c..b17f92e690 100644 --- a/runescape-client/src/main/java/Texture.java +++ b/runescape-client/src/main/java/Texture.java @@ -13,19 +13,15 @@ public class Texture extends Node { @Export("int1") int int1; @ObfuscatedName("u") - @Export("__u") boolean __u; @ObfuscatedName("g") @Export("records") int[] records; @ObfuscatedName("l") - @Export("__l") int[] __l; @ObfuscatedName("e") - @Export("__e") int[] __e; @ObfuscatedName("x") - @Export("__x") int[] __x; @ObfuscatedName("d") @Export("animationDirection") @@ -90,7 +86,6 @@ public class Texture extends Node { @ObfuscatedSignature( signature = "(DILir;)Z" ) - @Export("__m_230") boolean __m_230(double var1, int var3, AbstractIndexCache var4) { int var5; for(var5 = 0; var5 < this.records.length; ++var5) { diff --git a/runescape-client/src/main/java/TextureLoader.java b/runescape-client/src/main/java/TextureLoader.java index 7f200191c0..7656d33409 100644 --- a/runescape-client/src/main/java/TextureLoader.java +++ b/runescape-client/src/main/java/TextureLoader.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.Implements; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -10,6 +11,7 @@ public interface TextureLoader { signature = "(II)[I", garbageValue = "-905309626" ) + @Export("load") int[] load(int var1); @ObfuscatedName("w") @@ -31,5 +33,6 @@ public interface TextureLoader { signature = "(II)Z", garbageValue = "-1427873761" ) + @Export("isLowDetail") boolean isLowDetail(int var1); } diff --git a/runescape-client/src/main/java/TextureProvider.java b/runescape-client/src/main/java/TextureProvider.java index ace01a418a..da771e9d17 100644 --- a/runescape-client/src/main/java/TextureProvider.java +++ b/runescape-client/src/main/java/TextureProvider.java @@ -82,7 +82,6 @@ public class TextureProvider implements TextureLoader { signature = "(I)I", garbageValue = "-1996487053" ) - @Export("__m_212") public int __m_212() { int var1 = 0; int var2 = 0; @@ -155,7 +154,6 @@ public class TextureProvider implements TextureLoader { signature = "(II)I", garbageValue = "-1641984961" ) - @Export("__w_213") public int __w_213(int var1) { return this.textures[var1] != null?this.textures[var1].int1:0; } @@ -165,7 +163,6 @@ public class TextureProvider implements TextureLoader { signature = "(IB)Z", garbageValue = "14" ) - @Export("__o_214") public boolean __o_214(int var1) { return this.textures[var1].__u; } diff --git a/runescape-client/src/main/java/Tile.java b/runescape-client/src/main/java/Tile.java index 267f110068..8a2336572e 100644 --- a/runescape-client/src/main/java/Tile.java +++ b/runescape-client/src/main/java/Tile.java @@ -113,19 +113,16 @@ public final class Tile extends Node { @ObfuscatedGetter( intValue = 1724493981 ) - @Export("__y") int __y; @ObfuscatedName("h") @ObfuscatedGetter( intValue = -172066661 ) - @Export("__h") int __h; @ObfuscatedName("b") @ObfuscatedGetter( intValue = 2030010491 ) - @Export("__b") int __b; @ObfuscatedName("c") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/TileLocation.java b/runescape-client/src/main/java/TileLocation.java index acb6f0c94a..35e6007294 100644 --- a/runescape-client/src/main/java/TileLocation.java +++ b/runescape-client/src/main/java/TileLocation.java @@ -82,19 +82,16 @@ public class TileLocation { return this.plane + var1 + (this.x >> 6) + var1 + (this.y >> 6) + var1 + (this.x & 63) + var1 + (this.y & 63); } - @Export("__equals_382") @ObfuscatedName("equals") public boolean __equals_382(Object var1) { return this == var1?true:(!(var1 instanceof TileLocation)?false:this.equals0((TileLocation)var1)); } - @Export("__hashCode_383") @ObfuscatedName("hashCode") public int __hashCode_383() { return this.packed(); } - @Export("__toString_384") @ObfuscatedName("toString") public String __toString_384() { return this.toString0(","); diff --git a/runescape-client/src/main/java/TileModel.java b/runescape-client/src/main/java/TileModel.java index 5f6589ce02..43694cdb9b 100644 --- a/runescape-client/src/main/java/TileModel.java +++ b/runescape-client/src/main/java/TileModel.java @@ -6,25 +6,18 @@ import net.runelite.mapping.ObfuscatedName; @Implements("TileModel") public final class TileModel { @ObfuscatedName("z") - @Export("__dv_z") static int[] __dv_z; @ObfuscatedName("j") - @Export("__dv_j") static int[] __dv_j; @ObfuscatedName("s") - @Export("__dv_s") static int[] __dv_s; @ObfuscatedName("t") - @Export("__dv_t") static int[] __dv_t; @ObfuscatedName("y") - @Export("__dv_y") static int[] __dv_y; @ObfuscatedName("h") - @Export("__dv_h") static final int[][] __dv_h; @ObfuscatedName("b") - @Export("__dv_b") static final int[][] __dv_b; @ObfuscatedName("m") @Export("vertexX") diff --git a/runescape-client/src/main/java/TilePaint.java b/runescape-client/src/main/java/TilePaint.java index 0a2baa9bb2..e63ed8340a 100644 --- a/runescape-client/src/main/java/TilePaint.java +++ b/runescape-client/src/main/java/TilePaint.java @@ -11,7 +11,6 @@ public final class TilePaint { @ObfuscatedSignature( signature = "Lla;" ) - @Export("__eb_ah") static Bounds __eb_ah; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/Tiles.java b/runescape-client/src/main/java/Tiles.java index 4800cf2d76..2c80cd3d1a 100644 --- a/runescape-client/src/main/java/Tiles.java +++ b/runescape-client/src/main/java/Tiles.java @@ -20,43 +20,32 @@ public final class Tiles { @Export("Tiles_minPlane") static int Tiles_minPlane; @ObfuscatedName("w") - @Export("__bq_w") static byte[][][] __bq_w; @ObfuscatedName("l") - @Export("__bq_l") static byte[][][] __bq_l; @ObfuscatedName("a") - @Export("__bq_a") static int[][][] __bq_a; @ObfuscatedName("t") - @Export("__bq_t") static final int[] __bq_t; @ObfuscatedName("y") - @Export("__bq_y") static final int[] __bq_y; @ObfuscatedName("h") - @Export("__bq_h") static final int[] __bq_h; @ObfuscatedName("b") - @Export("__bq_b") static final int[] __bq_b; @ObfuscatedName("c") - @Export("__bq_c") static final int[] __bq_c; @ObfuscatedName("r") - @Export("__bq_r") static final int[] __bq_r; @ObfuscatedName("p") @ObfuscatedGetter( intValue = -2142579405 ) - @Export("__bq_p") static int __bq_p; @ObfuscatedName("v") @ObfuscatedGetter( intValue = 834543729 ) - @Export("__bq_v") static int __bq_v; static { @@ -93,6 +82,7 @@ public final class Tiles { signature = "(Ljava/lang/String;Ljava/lang/String;IIIII)V", garbageValue = "-1525245246" ) + @Export("insertMenuItemNoShift") public static final void insertMenuItemNoShift(String var0, String var1, int var2, int var3, int var4, int var5) { class16.insertMenuItem(var0, var1, var2, var3, var4, var5, false); } diff --git a/runescape-client/src/main/java/Timer.java b/runescape-client/src/main/java/Timer.java index 31fecfa510..97088532cc 100644 --- a/runescape-client/src/main/java/Timer.java +++ b/runescape-client/src/main/java/Timer.java @@ -11,58 +11,48 @@ public class Timer { @ObfuscatedGetter( longValue = 6181704275746246665L ) - @Export("__m") long __m; @ObfuscatedName("f") @ObfuscatedGetter( longValue = -8166664055136527097L ) - @Export("__f") long __f; @ObfuscatedName("q") - @Export("__q") public boolean __q; @ObfuscatedName("w") @ObfuscatedGetter( longValue = -6206176920376957899L ) - @Export("__w") long __w; @ObfuscatedName("o") @ObfuscatedGetter( longValue = -5820022560321695785L ) - @Export("__o") long __o; @ObfuscatedName("u") @ObfuscatedGetter( longValue = -7044840680232740733L ) - @Export("__u") long __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -500639955 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = 2043109577 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 978183419 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = 1684916659 ) - @Export("__x") int __x; public Timer() { @@ -83,7 +73,6 @@ public class Timer { signature = "(I)V", garbageValue = "2027048361" ) - @Export("__m_453") public void __m_453() { this.__m = class203.currentTimeMs(); } @@ -93,7 +82,6 @@ public class Timer { signature = "(B)V", garbageValue = "3" ) - @Export("__f_454") public void __f_454() { if(-1L != this.__m) { this.__o = class203.currentTimeMs() - this.__m; @@ -107,7 +95,6 @@ public class Timer { signature = "(II)V", garbageValue = "-1162738177" ) - @Export("__q_455") public void __q_455(int var1) { this.__f = class203.currentTimeMs(); this.__g = var1; @@ -118,7 +105,6 @@ public class Timer { signature = "(I)V", garbageValue = "-1855026926" ) - @Export("__w_456") public void __w_456() { if(this.__f != -1L) { this.__w = class203.currentTimeMs() - this.__f; @@ -134,7 +120,6 @@ public class Timer { signature = "(S)V", garbageValue = "-30171" ) - @Export("__o_457") public void __o_457() { this.__q = false; this.__l = 0; @@ -145,7 +130,6 @@ public class Timer { signature = "(I)V", garbageValue = "-812012402" ) - @Export("__u_458") public void __u_458() { this.__w_456(); } diff --git a/runescape-client/src/main/java/TotalQuantityComparator.java b/runescape-client/src/main/java/TotalQuantityComparator.java index 2d67699986..14da8aef2c 100644 --- a/runescape-client/src/main/java/TotalQuantityComparator.java +++ b/runescape-client/src/main/java/TotalQuantityComparator.java @@ -12,7 +12,6 @@ final class TotalQuantityComparator implements Comparator { signature = "(Ll;Ll;I)I", garbageValue = "-573736433" ) - @Export("__m_5") int __m_5(GrandExchangeEvent var1, GrandExchangeEvent var2) { return var1.grandExchangeOffer.totalQuantity < var2.grandExchangeOffer.totalQuantity?-1:(var2.grandExchangeOffer.totalQuantity == var1.grandExchangeOffer.totalQuantity?0:1); } @@ -23,7 +22,6 @@ final class TotalQuantityComparator implements Comparator { return this.__m_5((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); } - @Export("__equals_7") @ObfuscatedName("equals") public boolean __equals_7(Object var1) { return super.equals(var1); diff --git a/runescape-client/src/main/java/UnitPriceComparator.java b/runescape-client/src/main/java/UnitPriceComparator.java index 915d54d60f..57e4706f23 100644 --- a/runescape-client/src/main/java/UnitPriceComparator.java +++ b/runescape-client/src/main/java/UnitPriceComparator.java @@ -25,7 +25,6 @@ final class UnitPriceComparator implements Comparator { signature = "(Ll;Ll;I)I", garbageValue = "-120071238" ) - @Export("__m_11") int __m_11(GrandExchangeEvent var1, GrandExchangeEvent var2) { return var1.grandExchangeOffer.unitPrice < var2.grandExchangeOffer.unitPrice?-1:(var2.grandExchangeOffer.unitPrice == var1.grandExchangeOffer.unitPrice?0:1); } @@ -36,7 +35,6 @@ final class UnitPriceComparator implements Comparator { return this.__m_11((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); } - @Export("__equals_13") @ObfuscatedName("equals") public boolean __equals_13(Object var1) { return super.equals(var1); diff --git a/runescape-client/src/main/java/UrlRequester.java b/runescape-client/src/main/java/UrlRequester.java index 0c8feaf05e..f34eb61bc9 100644 --- a/runescape-client/src/main/java/UrlRequester.java +++ b/runescape-client/src/main/java/UrlRequester.java @@ -18,13 +18,11 @@ public class UrlRequester implements Runnable { @ObfuscatedGetter( intValue = -883931753 ) - @Export("__eo_u") static int __eo_u; @ObfuscatedName("ak") @ObfuscatedSignature( signature = "Lla;" ) - @Export("__eo_ak") static Bounds __eo_ak; @ObfuscatedName("m") @Export("thread") diff --git a/runescape-client/src/main/java/UserComparator1.java b/runescape-client/src/main/java/UserComparator1.java index f7cbf2af65..a289a2a733 100644 --- a/runescape-client/src/main/java/UserComparator1.java +++ b/runescape-client/src/main/java/UserComparator1.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator1") public class UserComparator1 implements Comparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator1(boolean var1) { @@ -20,7 +19,6 @@ public class UserComparator1 implements Comparator { signature = "(Ljs;Ljs;B)I", garbageValue = "68" ) - @Export("__m_476") int __m_476(User var1, User var2) { return this.__m?var1.compareTo0(var2):var2.compareTo0(var1); } @@ -31,7 +29,6 @@ public class UserComparator1 implements Comparator { return this.__m_476((User)var1, (User)var2); } - @Export("__equals_478") @ObfuscatedName("equals") public boolean __equals_478(Object var1) { return super.equals(var1); diff --git a/runescape-client/src/main/java/UserComparator10.java b/runescape-client/src/main/java/UserComparator10.java index a0b5d7b61c..693298d8ab 100644 --- a/runescape-client/src/main/java/UserComparator10.java +++ b/runescape-client/src/main/java/UserComparator10.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator10") public class UserComparator10 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator10(boolean var1) { @@ -20,7 +19,6 @@ public class UserComparator10 extends AbstractUserComparator { signature = "(Lke;Lke;B)I", garbageValue = "-15" ) - @Export("__m_268") int __m_268(Buddy var1, Buddy var2) { return Client.worldId == var1.world0 && var2.world0 == Client.worldId?(this.__m?var1.int2 - var2.int2:var2.int2 - var1.int2):this.__x_461(var1, var2); } diff --git a/runescape-client/src/main/java/UserComparator2.java b/runescape-client/src/main/java/UserComparator2.java index dd5f73e97d..cf58e0cd5c 100644 --- a/runescape-client/src/main/java/UserComparator2.java +++ b/runescape-client/src/main/java/UserComparator2.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator2") public class UserComparator2 implements Comparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator2(boolean var1) { @@ -20,12 +19,10 @@ public class UserComparator2 implements Comparator { signature = "(Ljs;Ljs;I)I", garbageValue = "-2069683911" ) - @Export("__m_479") int __m_479(User var1, User var2) { return this.__m?var1.username().compareTo0(var2.username()):var2.username().compareTo0(var1.username()); } - @Export("__equals_481") @ObfuscatedName("equals") public boolean __equals_481(Object var1) { return super.equals(var1); diff --git a/runescape-client/src/main/java/UserComparator3.java b/runescape-client/src/main/java/UserComparator3.java index a965353599..f6e38ee6bf 100644 --- a/runescape-client/src/main/java/UserComparator3.java +++ b/runescape-client/src/main/java/UserComparator3.java @@ -19,7 +19,6 @@ public class UserComparator3 extends AbstractUserComparator { @Export("socketTask") static Task socketTask; @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator3(boolean var1) { @@ -31,7 +30,6 @@ public class UserComparator3 extends AbstractUserComparator { signature = "(Lke;Lke;I)I", garbageValue = "-1157645406" ) - @Export("__m_274") int __m_274(Buddy var1, Buddy var2) { return var2.world0 != var1.world0?(this.__m?var1.world0 - var2.world0:var2.world0 - var1.world0):this.__x_461(var1, var2); } diff --git a/runescape-client/src/main/java/UserComparator4.java b/runescape-client/src/main/java/UserComparator4.java index 54977070b0..b6b05a509f 100644 --- a/runescape-client/src/main/java/UserComparator4.java +++ b/runescape-client/src/main/java/UserComparator4.java @@ -15,7 +15,6 @@ public class UserComparator4 implements Comparator { @Export("WorldMapElement_count") public static int WorldMapElement_count; @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator4(boolean var1) { @@ -27,12 +26,10 @@ public class UserComparator4 implements Comparator { signature = "(Lke;Lke;I)I", garbageValue = "950234237" ) - @Export("__m_261") int __m_261(Buddy var1, Buddy var2) { return this.__m?var1.int2 - var2.int2:var2.int2 - var1.int2; } - @Export("__equals_263") @ObfuscatedName("equals") public boolean __equals_263(Object var1) { return super.equals(var1); diff --git a/runescape-client/src/main/java/UserComparator5.java b/runescape-client/src/main/java/UserComparator5.java index 5a90abe58e..0ee89e85f2 100644 --- a/runescape-client/src/main/java/UserComparator5.java +++ b/runescape-client/src/main/java/UserComparator5.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator5") public class UserComparator5 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator5(boolean var1) { @@ -19,7 +18,6 @@ public class UserComparator5 extends AbstractUserComparator { signature = "(Lke;Lke;B)I", garbageValue = "-22" ) - @Export("__m_272") int __m_272(Buddy var1, Buddy var2) { if(var1.world0 != 0) { if(var2.world0 == 0) { diff --git a/runescape-client/src/main/java/UserComparator6.java b/runescape-client/src/main/java/UserComparator6.java index 7f362451fc..90761a877b 100644 --- a/runescape-client/src/main/java/UserComparator6.java +++ b/runescape-client/src/main/java/UserComparator6.java @@ -16,10 +16,8 @@ public class UserComparator6 extends AbstractUserComparator { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__fg_jh") static Widget __fg_jh; @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator6(boolean var1) { @@ -31,7 +29,6 @@ public class UserComparator6 extends AbstractUserComparator { signature = "(Lke;Lke;I)I", garbageValue = "750521759" ) - @Export("__m_276") int __m_276(Buddy var1, Buddy var2) { return var1.world0 != 0 && var2.world0 != 0?(this.__m?var1.username().compareTo0(var2.username()):var2.username().compareTo0(var1.username())):this.__x_461(var1, var2); } diff --git a/runescape-client/src/main/java/UserComparator7.java b/runescape-client/src/main/java/UserComparator7.java index fb9a9a7e5f..f5387fbc87 100644 --- a/runescape-client/src/main/java/UserComparator7.java +++ b/runescape-client/src/main/java/UserComparator7.java @@ -10,7 +10,6 @@ import net.runelite.rs.Reflection; @Implements("UserComparator7") public class UserComparator7 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator7(boolean var1) { @@ -22,7 +21,6 @@ public class UserComparator7 extends AbstractUserComparator { signature = "(Lke;Lke;I)I", garbageValue = "-9252550" ) - @Export("__m_270") int __m_270(Buddy var1, Buddy var2) { return var1.world0 != 0 && var2.world0 != 0?(this.__m?var1.int2 - var2.int2:var2.int2 - var1.int2):this.__x_461(var1, var2); } diff --git a/runescape-client/src/main/java/UserComparator8.java b/runescape-client/src/main/java/UserComparator8.java index 439854532e..ae6288a967 100644 --- a/runescape-client/src/main/java/UserComparator8.java +++ b/runescape-client/src/main/java/UserComparator8.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator8") public class UserComparator8 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator8(boolean var1) { @@ -19,7 +18,6 @@ public class UserComparator8 extends AbstractUserComparator { signature = "(Lke;Lke;B)I", garbageValue = "0" ) - @Export("__m_266") int __m_266(Buddy var1, Buddy var2) { if(Client.worldId == var1.world0) { if(var2.world0 != Client.worldId) { diff --git a/runescape-client/src/main/java/UserComparator9.java b/runescape-client/src/main/java/UserComparator9.java index dc1f5654ff..b44d9086e3 100644 --- a/runescape-client/src/main/java/UserComparator9.java +++ b/runescape-client/src/main/java/UserComparator9.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("UserComparator9") public class UserComparator9 extends AbstractUserComparator { @ObfuscatedName("m") - @Export("__m") final boolean __m; public UserComparator9(boolean var1) { @@ -20,7 +19,6 @@ public class UserComparator9 extends AbstractUserComparator { signature = "(Lke;Lke;I)I", garbageValue = "1966780392" ) - @Export("__m_264") int __m_264(Buddy var1, Buddy var2) { return Client.worldId == var1.world0 && var2.world0 == Client.worldId?(this.__m?var1.username().compareTo0(var2.username()):var2.username().compareTo0(var1.username())):this.__x_461(var1, var2); } @@ -62,6 +60,7 @@ public class UserComparator9 extends AbstractUserComparator { signature = "(I)[Lln;", garbageValue = "-1724028611" ) + @Export("createSpriteArray") public static Sprite[] createSpriteArray() { Sprite[] var0 = new Sprite[class328.indexedSpriteCount]; diff --git a/runescape-client/src/main/java/Username.java b/runescape-client/src/main/java/Username.java index 30871f2254..bbcdaf3dee 100644 --- a/runescape-client/src/main/java/Username.java +++ b/runescape-client/src/main/java/Username.java @@ -72,13 +72,11 @@ public class Username implements Comparable { } } - @Export("__hashCode_467") @ObfuscatedName("hashCode") public int __hashCode_467() { return this.cleanName == null?0:this.cleanName.hashCode(); } - @Export("__toString_468") @ObfuscatedName("toString") public String __toString_468() { return this.getName(); diff --git a/runescape-client/src/main/java/VarcInt.java b/runescape-client/src/main/java/VarcInt.java index 14b5f1d557..4734f53ee8 100644 --- a/runescape-client/src/main/java/VarcInt.java +++ b/runescape-client/src/main/java/VarcInt.java @@ -11,7 +11,6 @@ public class VarcInt extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__iw_m") static AbstractIndexCache __iw_m; @ObfuscatedName("f") @ObfuscatedSignature( @@ -36,7 +35,6 @@ public class VarcInt extends DualNode { signature = "(Lgr;I)V", garbageValue = "1023420886" ) - @Export("__q_411") void __q_411(Buffer var1) { while(true) { int var2 = var1.readUnsignedByte(); @@ -53,7 +51,6 @@ public class VarcInt extends DualNode { signature = "(Lgr;II)V", garbageValue = "-202810982" ) - @Export("__w_412") void __w_412(Buffer var1, int var2) { if(var2 == 2) { this.persist = true; @@ -76,6 +73,7 @@ public class VarcInt extends DualNode { signature = "(CI)Z", garbageValue = "1367119425" ) + @Export("isAlphaNumeric") public static boolean isAlphaNumeric(char var0) { return var0 >= '0' && var0 <= '9' || var0 >= 'A' && var0 <= 'Z' || var0 >= 'a' && var0 <= 'z'; } diff --git a/runescape-client/src/main/java/VarpDefinition.java b/runescape-client/src/main/java/VarpDefinition.java index f313cd4d68..1fb5900843 100644 --- a/runescape-client/src/main/java/VarpDefinition.java +++ b/runescape-client/src/main/java/VarpDefinition.java @@ -11,13 +11,11 @@ public class VarpDefinition extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ix_m") public static AbstractIndexCache __ix_m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 510774535 ) - @Export("__ix_f") public static int __ix_f; @ObfuscatedName("q") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/VertexNormal.java b/runescape-client/src/main/java/VertexNormal.java index bcd9172342..05c9b9616c 100644 --- a/runescape-client/src/main/java/VertexNormal.java +++ b/runescape-client/src/main/java/VertexNormal.java @@ -8,37 +8,31 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("VertexNormal") public class VertexNormal { @ObfuscatedName("pe") - @Export("__dq_pe") static boolean __dq_pe; @ObfuscatedName("rq") @ObfuscatedGetter( intValue = 1351620693 ) - @Export("__dq_rq") static int __dq_rq; @ObfuscatedName("m") @ObfuscatedGetter( intValue = 1414310131 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -1493845293 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 1575149515 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -487323631 ) - @Export("__w") int __w; VertexNormal() { diff --git a/runescape-client/src/main/java/ViewportMouse.java b/runescape-client/src/main/java/ViewportMouse.java index 67bde74f63..c1ff7b8b25 100644 --- a/runescape-client/src/main/java/ViewportMouse.java +++ b/runescape-client/src/main/java/ViewportMouse.java @@ -29,25 +29,21 @@ public class ViewportMouse { @ObfuscatedGetter( intValue = 1135175963 ) - @Export("__dm_u") static int __dm_u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 262104267 ) - @Export("__dm_g") static int __dm_g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -2071972829 ) - @Export("__dm_l") static int __dm_l; @ObfuscatedName("k") @ObfuscatedGetter( intValue = -852671813 ) - @Export("__dm_k") static int __dm_k; @ObfuscatedName("i") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/Widget.java b/runescape-client/src/main/java/Widget.java index 0fa2775b3e..afda76d29b 100644 --- a/runescape-client/src/main/java/Widget.java +++ b/runescape-client/src/main/java/Widget.java @@ -32,7 +32,6 @@ public class Widget extends Node { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ho_d") public static AbstractIndexCache __ho_d; @ObfuscatedName("n") @ObfuscatedSignature( @@ -56,10 +55,8 @@ public class Widget extends Node { @ObfuscatedSignature( signature = "Ler;" ) - @Export("__ho_z") static EvictingDualNodeHashTable __ho_z; @ObfuscatedName("j") - @Export("__ho_j") public static boolean __ho_j; @ObfuscatedName("s") @Export("isIf3") @@ -170,13 +167,11 @@ public class Widget extends Node { @ObfuscatedGetter( intValue = 206556853 ) - @Export("__aw") public int __aw; @ObfuscatedName("al") @ObfuscatedGetter( intValue = -1047989223 ) - @Export("__al") public int __al; @ObfuscatedName("ab") @ObfuscatedGetter( @@ -254,7 +249,6 @@ public class Widget extends Node { @ObfuscatedGetter( intValue = -1853255291 ) - @Export("__af") public int __af; @ObfuscatedName("ai") @ObfuscatedGetter( @@ -263,7 +257,6 @@ public class Widget extends Node { @Export("lineWid") public int lineWid; @ObfuscatedName("ba") - @Export("__ba") public boolean __ba; @ObfuscatedName("bb") @ObfuscatedGetter( @@ -380,19 +373,16 @@ public class Widget extends Node { @ObfuscatedGetter( intValue = -1692331135 ) - @Export("__bf") public int __bf; @ObfuscatedName("bh") @ObfuscatedGetter( intValue = 727421593 ) - @Export("__bh") public int __bh; @ObfuscatedName("be") @Export("modelOrthog") public boolean modelOrthog; @ObfuscatedName("bv") - @Export("__bv") public boolean __bv; @ObfuscatedName("bw") @ObfuscatedGetter( @@ -464,19 +454,14 @@ public class Widget extends Node { @Export("clickMask") public int clickMask; @ObfuscatedName("cg") - @Export("__cg") public boolean __cg; @ObfuscatedName("cf") - @Export("__cf") public byte[][] __cf; @ObfuscatedName("cp") - @Export("__cp") public byte[][] __cp; @ObfuscatedName("cc") - @Export("__cc") public int[] __cc; @ObfuscatedName("ci") - @Export("__ci") public int[] __ci; @ObfuscatedName("de") @Export("dataText") @@ -575,34 +560,26 @@ public class Widget extends Node { @Export("onScroll") public Object[] onScroll; @ObfuscatedName("em") - @Export("__em") public Object[] __em; @ObfuscatedName("ed") @Export("onKeyListener") public Object[] onKeyListener; @ObfuscatedName("ex") - @Export("__ex") public Object[] __ex; @ObfuscatedName("ej") - @Export("__ej") public Object[] __ej; @ObfuscatedName("el") - @Export("__el") public Object[] __el; @ObfuscatedName("en") @Export("onDialogAbortListener") public Object[] onDialogAbortListener; @ObfuscatedName("ei") - @Export("__ei") public Object[] __ei; @ObfuscatedName("ee") - @Export("__ee") public Object[] __ee; @ObfuscatedName("eq") - @Export("__eq") public Object[] __eq; @ObfuscatedName("eh") - @Export("__eh") public Object[] __eh; @ObfuscatedName("eo") @Export("cs1Instructions") @@ -662,34 +639,28 @@ public class Widget extends Node { @Export("children") public Widget[] children; @ObfuscatedName("fq") - @Export("__fq") public boolean __fq; @ObfuscatedName("fw") - @Export("__fw") public boolean __fw; @ObfuscatedName("fg") @ObfuscatedGetter( intValue = -1520351537 ) - @Export("__fg") public int __fg; @ObfuscatedName("fc") @ObfuscatedGetter( intValue = 209458049 ) - @Export("__fc") public int __fc; @ObfuscatedName("fl") @ObfuscatedGetter( intValue = -672198209 ) - @Export("__fl") public int __fl; @ObfuscatedName("fj") @ObfuscatedGetter( intValue = 876695207 ) - @Export("__fj") public int __fj; @ObfuscatedName("fp") @ObfuscatedGetter( @@ -704,7 +675,6 @@ public class Widget extends Node { @Export("cycle") public int cycle; @ObfuscatedName("fh") - @Export("__fh") public int[] __fh; @ObfuscatedName("fx") @Export("noClickThrough") @@ -713,7 +683,6 @@ public class Widget extends Node { @Export("noScrollThrough") public boolean noScrollThrough; @ObfuscatedName("fz") - @Export("__fz") public boolean __fz; static { diff --git a/runescape-client/src/main/java/WidgetGroupParent.java b/runescape-client/src/main/java/WidgetGroupParent.java index 0039676529..491c7b8343 100644 --- a/runescape-client/src/main/java/WidgetGroupParent.java +++ b/runescape-client/src/main/java/WidgetGroupParent.java @@ -17,7 +17,6 @@ public class WidgetGroupParent extends Node { @ObfuscatedGetter( intValue = -992379173 ) - @Export("__bx_o") static int __bx_o; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/World.java b/runescape-client/src/main/java/World.java index f34c1ef220..17297fb7e8 100644 --- a/runescape-client/src/main/java/World.java +++ b/runescape-client/src/main/java/World.java @@ -17,7 +17,6 @@ public class World { @ObfuscatedGetter( intValue = 1143875805 ) - @Export("__bt_g") static int __bt_g; @ObfuscatedName("l") @Export("sortOption2") @@ -84,7 +83,6 @@ public class World { signature = "(B)Z", garbageValue = "0" ) - @Export("__x_145") boolean __x_145() { return (2 & this.properties) != 0; } @@ -104,7 +102,6 @@ public class World { signature = "(I)Z", garbageValue = "-1662622660" ) - @Export("__a_147") boolean __a_147() { return (8 & this.properties) != 0; } diff --git a/runescape-client/src/main/java/WorldComparator.java b/runescape-client/src/main/java/WorldComparator.java index 77538cc0e7..1f284bc1a2 100644 --- a/runescape-client/src/main/java/WorldComparator.java +++ b/runescape-client/src/main/java/WorldComparator.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("WorldComparator") final class WorldComparator implements Comparator { @ObfuscatedName("n") - @Export("__u_n") public static boolean __u_n; @ObfuscatedName("m") @@ -16,7 +15,6 @@ final class WorldComparator implements Comparator { signature = "(Ll;Ll;I)I", garbageValue = "707844889" ) - @Export("__m_0") int __m_0(GrandExchangeEvent var1, GrandExchangeEvent var2) { return var1.world < var2.world?-1:(var2.world == var1.world?0:1); } @@ -27,7 +25,6 @@ final class WorldComparator implements Comparator { return this.__m_0((GrandExchangeEvent)var1, (GrandExchangeEvent)var2); } - @Export("__equals_2") @ObfuscatedName("equals") public boolean __equals_2(Object var1) { return super.equals(var1); diff --git a/runescape-client/src/main/java/WorldMap.java b/runescape-client/src/main/java/WorldMap.java index abff754e79..13b495ddb3 100644 --- a/runescape-client/src/main/java/WorldMap.java +++ b/runescape-client/src/main/java/WorldMap.java @@ -35,19 +35,16 @@ public class WorldMap { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__g") AbstractIndexCache __g; @ObfuscatedName("l") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__l") AbstractIndexCache __l; @ObfuscatedName("e") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__e") AbstractIndexCache __e; @ObfuscatedName("n") @ObfuscatedSignature( @@ -83,7 +80,6 @@ public class WorldMap { @ObfuscatedSignature( signature = "Lag;" ) - @Export("__t") WorldMapArea __t; @ObfuscatedName("y") @ObfuscatedSignature( @@ -155,13 +151,11 @@ public class WorldMap { @ObfuscatedGetter( intValue = -1653084915 ) - @Export("__ac") int __ac; @ObfuscatedName("ay") @ObfuscatedGetter( intValue = 1664740569 ) - @Export("__ay") int __ay; @ObfuscatedName("ah") @Export("perpetualFlash0") @@ -173,58 +167,48 @@ public class WorldMap { @ObfuscatedGetter( intValue = -1683910031 ) - @Export("__aw") int __aw; @ObfuscatedName("al") @ObfuscatedGetter( intValue = 2064651113 ) - @Export("__al") int __al; @ObfuscatedName("ab") @ObfuscatedGetter( intValue = -1979665983 ) - @Export("__ab") int __ab; @ObfuscatedName("ae") @ObfuscatedGetter( intValue = 547126547 ) - @Export("__ae") int __ae; @ObfuscatedName("at") @ObfuscatedGetter( intValue = -815748997 ) - @Export("__at") int __at; @ObfuscatedName("ad") @ObfuscatedGetter( intValue = -988933407 ) - @Export("__ad") int __ad; @ObfuscatedName("ap") @ObfuscatedGetter( longValue = -4747643242047040283L ) - @Export("__ap") long __ap; @ObfuscatedName("as") @ObfuscatedGetter( intValue = -969094439 ) - @Export("__as") int __as; @ObfuscatedName("am") @ObfuscatedGetter( intValue = -869889187 ) - @Export("__am") int __am; @ObfuscatedName("an") - @Export("__an") boolean __an; @ObfuscatedName("ao") @Export("enabledElements") @@ -233,10 +217,8 @@ public class WorldMap { @Export("enabledCategories") HashSet enabledCategories; @ObfuscatedName("ax") - @Export("__ax") HashSet __ax; @ObfuscatedName("af") - @Export("__af") HashSet __af; @ObfuscatedName("ai") @Export("elementsDisabled") @@ -245,19 +227,15 @@ public class WorldMap { @ObfuscatedGetter( intValue = -237734529 ) - @Export("__ba") int __ba; @ObfuscatedName("bs") - @Export("__bs") final int[] __bs; @ObfuscatedName("bq") - @Export("__bq") List __bq; @ObfuscatedName("bn") @Export("iconIterator") Iterator iconIterator; @ObfuscatedName("bk") - @Export("__bk") HashSet __bk; @ObfuscatedName("bd") @ObfuscatedSignature( @@ -278,25 +256,21 @@ public class WorldMap { @ObfuscatedGetter( intValue = 2031417343 ) - @Export("__bx") int __bx; @ObfuscatedName("by") @ObfuscatedGetter( intValue = 754899959 ) - @Export("__by") int __by; @ObfuscatedName("bu") @ObfuscatedGetter( intValue = 2064728623 ) - @Export("__bu") int __bu; @ObfuscatedName("bm") @ObfuscatedGetter( intValue = -1774424249 ) - @Export("__bm") int __bm; static { @@ -378,7 +352,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "-1144390092" ) - @Export("__f_518") public void __f_518() { WorldMapRegion.__av_o.demote(5); } @@ -439,7 +412,6 @@ public class WorldMap { signature = "(IIZZS)V", garbageValue = "18431" ) - @Export("__w_519") public void __w_519(int var1, int var2, boolean var3, boolean var4) { long var5 = class203.currentTimeMs(); this.__o_520(var1, var2, var4, var5); @@ -469,7 +441,6 @@ public class WorldMap { } @ObfuscatedName("o") - @Export("__o_520") void __o_520(int var1, int var2, boolean var3, long var4) { if(this.currentMapArea0 != null) { int var6 = (int)((float)this.worldMapX + ((float)(var1 - this.worldMapDisplayX) - (float)this.__ap_537() * this.zoom / 2.0F) / this.zoom); @@ -538,7 +509,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "2075446341" ) - @Export("__g_521") void __g_521() { if(this.__x_524()) { int var1 = this.worldMapTargetX - this.worldMapX; @@ -581,7 +551,6 @@ public class WorldMap { signature = "(B)V", garbageValue = "35" ) - @Export("__e_523") final void __e_523() { this.__ad = -1; this.__at = -1; @@ -594,7 +563,6 @@ public class WorldMap { signature = "(I)Z", garbageValue = "1444745621" ) - @Export("__x_524") boolean __x_524() { return this.worldMapTargetX != -1 && this.worldMapTargetY != -1; } @@ -625,7 +593,6 @@ public class WorldMap { signature = "(IIIZI)V", garbageValue = "469045892" ) - @Export("__a_525") public void __a_525(int var1, int var2, int var3, boolean var4) { WorldMapArea var5 = this.mapAreaAtCoord(var1, var2, var3); if(var5 == null) { @@ -713,7 +680,6 @@ public class WorldMap { signature = "(Lag;Lhu;Lhu;ZI)V", garbageValue = "-1430939646" ) - @Export("__h_526") public void __h_526(WorldMapArea var1, TileLocation var2, TileLocation var3, boolean var4) { if(var1 != null) { if(this.currentMapArea0 == null || var1 != this.currentMapArea0) { @@ -818,7 +784,6 @@ public class WorldMap { signature = "(IIIIIII)Z", garbageValue = "-1561237851" ) - @Export("__p_527") boolean __p_527(int var1, int var2, int var3, int var4, int var5, int var6) { return this.sprite == null?true:(this.sprite.subWidth == var1 && this.sprite.subHeight == var2?(this.worldMapManager.__z != this.__bx?true:(this.__bm != Client.__client_ss?true:(var3 <= 0 && var4 <= 0?var3 + var1 < var5 || var2 + var4 < var6:true))):true); } @@ -828,7 +793,6 @@ public class WorldMap { signature = "(IIIIIII)V", garbageValue = "-2090965249" ) - @Export("__v_528") void __v_528(int var1, int var2, int var3, int var4, int var5, int var6) { if(ClientParameter.field3645 != null) { int var7 = 512 / (this.worldMapManager.__z * 2); @@ -917,7 +881,6 @@ public class WorldMap { signature = "(IB)F", garbageValue = "56" ) - @Export("__av_529") float __av_529(int var1) { return var1 == 25?1.0F:(var1 == 37?1.5F:(var1 == 50?2.0F:(var1 == 75?3.0F:(var1 == 100?4.0F:8.0F)))); } @@ -991,7 +954,6 @@ public class WorldMap { signature = "(III)V", garbageValue = "-2147142500" ) - @Export("__aw_531") public void __aw_531(int var1, int var2) { if(this.currentMapArea0 != null) { this.setWorldMapPosition(var1 - this.currentMapArea0.minX() * 64, var2 - this.currentMapArea0.minY() * 64, true); @@ -1005,7 +967,6 @@ public class WorldMap { signature = "(IIIB)V", garbageValue = "-40" ) - @Export("__al_532") public void __al_532(int var1, int var2, int var3) { if(this.currentMapArea0 != null) { int[] var4 = this.currentMapArea0.position(var1, var2, var3); @@ -1021,7 +982,6 @@ public class WorldMap { signature = "(IIII)V", garbageValue = "1808854561" ) - @Export("__ab_533") public void __ab_533(int var1, int var2, int var3) { if(this.currentMapArea0 != null) { int[] var4 = this.currentMapArea0.position(var1, var2, var3); @@ -1037,7 +997,6 @@ public class WorldMap { signature = "(I)I", garbageValue = "-659556919" ) - @Export("__ae_534") public int __ae_534() { return this.currentMapArea0 == null?-1:this.worldMapX + this.currentMapArea0.minX() * 64; } @@ -1047,7 +1006,6 @@ public class WorldMap { signature = "(I)I", garbageValue = "1893257871" ) - @Export("__at_535") public int __at_535() { return this.currentMapArea0 == null?-1:this.worldMapY + this.currentMapArea0.minY() * 64; } @@ -1057,7 +1015,6 @@ public class WorldMap { signature = "(I)Lhu;", garbageValue = "-2005824064" ) - @Export("__ad_536") public TileLocation __ad_536() { return this.currentMapArea0 == null?null:this.currentMapArea0.coord(this.__ae_534(), this.__at_535()); } @@ -1067,7 +1024,6 @@ public class WorldMap { signature = "(I)I", garbageValue = "442119278" ) - @Export("__ap_537") public int __ap_537() { return this.worldMapDisplayWidth; } @@ -1077,7 +1033,6 @@ public class WorldMap { signature = "(I)I", garbageValue = "-2065910749" ) - @Export("__as_538") public int __as_538() { return this.worldMapDisplayHeight; } @@ -1087,7 +1042,6 @@ public class WorldMap { signature = "(II)V", garbageValue = "2017050927" ) - @Export("__am_539") public void __am_539(int var1) { if(var1 >= 1) { this.__ac = var1; @@ -1100,7 +1054,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "-1568631080" ) - @Export("__an_540") public void __an_540() { this.__ac = 3; } @@ -1110,7 +1063,6 @@ public class WorldMap { signature = "(II)V", garbageValue = "107295139" ) - @Export("__az_541") public void __az_541(int var1) { if(var1 >= 1) { this.__ay = var1; @@ -1123,7 +1075,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "2023118274" ) - @Export("__au_542") public void __au_542() { this.__ay = 50; } @@ -1268,7 +1219,6 @@ public class WorldMap { signature = "(I)V", garbageValue = "758731634" ) - @Export("__bk_543") void __bk_543() { this.__af.clear(); this.__af.addAll(this.enabledElements); @@ -1280,7 +1230,6 @@ public class WorldMap { signature = "(IIIIIIB)V", garbageValue = "-73" ) - @Export("__bd_544") public void __bd_544(int var1, int var2, int var3, int var4, int var5, int var6) { if(this.cacheLoader.isLoaded()) { int var7 = (int)Math.ceil((double)((float)var3 / this.zoom)); @@ -1316,7 +1265,6 @@ public class WorldMap { signature = "(ILhu;I)Lhu;", garbageValue = "333454230" ) - @Export("__bc_545") public TileLocation __bc_545(int var1, TileLocation var2) { if(!this.cacheLoader.isLoaded()) { return null; diff --git a/runescape-client/src/main/java/WorldMapArea.java b/runescape-client/src/main/java/WorldMapArea.java index afbfcdb8e0..2a3d27d961 100644 --- a/runescape-client/src/main/java/WorldMapArea.java +++ b/runescape-client/src/main/java/WorldMapArea.java @@ -37,7 +37,6 @@ public class WorldMapArea { @ObfuscatedGetter( intValue = 986239133 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( @@ -306,7 +305,6 @@ public class WorldMapArea { signature = "(I)I", garbageValue = "-1657905623" ) - @Export("__a_39") int __a_39() { return this.__w; } diff --git a/runescape-client/src/main/java/WorldMapAreaData.java b/runescape-client/src/main/java/WorldMapAreaData.java index 96db746df5..eeacab73f6 100644 --- a/runescape-client/src/main/java/WorldMapAreaData.java +++ b/runescape-client/src/main/java/WorldMapAreaData.java @@ -10,13 +10,10 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("WorldMapAreaData") public class WorldMapAreaData extends WorldMapArea { @ObfuscatedName("n") - @Export("surfaceOffsetY") HashSet __n; @ObfuscatedName("i") - @Export("__i") HashSet __i; @ObfuscatedName("a") - @Export("__a") List __a; @ObfuscatedName("ce") @@ -24,7 +21,6 @@ public class WorldMapAreaData extends WorldMapArea { signature = "(Lgr;Lgr;IZI)V", garbageValue = "-1999841505" ) - @Export("__ce_76") void __ce_76(Buffer var1, Buffer var2, int var3, boolean var4) { this.read(var1, var3); int var5 = var2.__ag_302(); @@ -66,7 +62,6 @@ public class WorldMapAreaData extends WorldMapArea { signature = "(Lgr;ZB)V", garbageValue = "48" ) - @Export("__cy_77") void __cy_77(Buffer var1, boolean var2) { this.__a = new LinkedList(); int var3 = var1.__ag_302(); diff --git a/runescape-client/src/main/java/WorldMapElement.java b/runescape-client/src/main/java/WorldMapElement.java index 906ec39875..04d541e9df 100644 --- a/runescape-client/src/main/java/WorldMapElement.java +++ b/runescape-client/src/main/java/WorldMapElement.java @@ -11,7 +11,6 @@ public class WorldMapElement extends DualNode { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__ic_m") public static AbstractIndexCache __ic_m; @ObfuscatedName("w") @ObfuscatedSignature( @@ -29,7 +28,6 @@ public class WorldMapElement extends DualNode { @ObfuscatedGetter( intValue = -1579051565 ) - @Export("__o") public final int __o; @ObfuscatedName("u") @ObfuscatedGetter( @@ -44,13 +42,11 @@ public class WorldMapElement extends DualNode { @Export("sprite2") int sprite2; @ObfuscatedName("l") - @Export("__l") public String __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -231067 ) - @Export("__e") public int __e; @ObfuscatedName("x") @ObfuscatedGetter( @@ -65,31 +61,26 @@ public class WorldMapElement extends DualNode { @Export("string1") public String string1; @ObfuscatedName("i") - @Export("__i") int[] __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = 1336803515 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1825795359 ) - @Export("__z") int __z; @ObfuscatedName("j") @ObfuscatedGetter( intValue = -1007121521 ) - @Export("__j") int __j; @ObfuscatedName("s") @ObfuscatedGetter( intValue = -1209054101 ) - @Export("__s") int __s; @ObfuscatedName("t") @ObfuscatedSignature( @@ -102,10 +93,8 @@ public class WorldMapElement extends DualNode { ) public class249 field3301; @ObfuscatedName("h") - @Export("__h") int[] __h; @ObfuscatedName("b") - @Export("__b") byte[] __b; @ObfuscatedName("c") @ObfuscatedGetter( @@ -245,7 +234,6 @@ public class WorldMapElement extends DualNode { signature = "(I)V", garbageValue = "1799485224" ) - @Export("__w_409") public void __w_409() { if(this.__i != null) { for(int var1 = 0; var1 < this.__i.length; var1 += 2) { @@ -305,7 +293,6 @@ public class WorldMapElement extends DualNode { signature = "(I)I", garbageValue = "821701099" ) - @Export("__g_410") public int __g_410() { return this.__o; } diff --git a/runescape-client/src/main/java/WorldMapIcon1.java b/runescape-client/src/main/java/WorldMapIcon1.java index 6d3253c553..0e1f232744 100644 --- a/runescape-client/src/main/java/WorldMapIcon1.java +++ b/runescape-client/src/main/java/WorldMapIcon1.java @@ -12,7 +12,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__t_i") static Widget __t_i; @ObfuscatedName("db") @ObfuscatedSignature( @@ -33,7 +32,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { @ObfuscatedGetter( intValue = -1722323621 ) - @Export("__m") final int __m; @ObfuscatedName("f") @ObfuscatedSignature( @@ -45,13 +43,11 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { @ObfuscatedGetter( intValue = 364253793 ) - @Export("__q") final int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -362031241 ) - @Export("__w") final int __w; @ObfuscatedSignature( @@ -78,7 +74,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { signature = "(I)I", garbageValue = "1990181988" ) - @Export("__m_15") public int __m_15() { return this.__m; } @@ -88,7 +83,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { signature = "(I)Laj;", garbageValue = "1159446036" ) - @Export("__f_16") WorldMapLabel __f_16() { return this.label0; } @@ -98,7 +92,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { signature = "(B)I", garbageValue = "75" ) - @Export("__q_17") int __q_17() { return this.__q; } @@ -108,7 +101,6 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { signature = "(I)I", garbageValue = "-1558233611" ) - @Export("__w_18") int __w_18() { return this.__w; } @@ -171,13 +163,13 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { var2 = (var3 - var8) * Client.__client_qc / var3; } else { - var2 = Client.__client_qp; + var2 = Client.soundEffectVolume; } if(var2 > 0) { RawSound var10 = var9.toRawSound().resample(MilliClock.decimator); - RawPcmStream var11 = RawPcmStream.method2497(var10, 100, var2); - var11.__x_181(Client.unknownSoundValues1[var0] - 1); + RawPcmStream var11 = RawPcmStream.createRawPcmStream(var10, 100, var2); + var11.setNumLoops(Client.queuedSoundEffectLoops[var0] - 1); TaskHandler.pcmStreamMixer.addSubStream(var11); } @@ -189,7 +181,7 @@ public class WorldMapIcon1 extends AbstractWorldMapIcon { for(int var1 = var0; var1 < Client.soundEffectCount; ++var1) { Client.soundEffectIds[var1] = Client.soundEffectIds[var1 + 1]; Client.soundEffects[var1] = Client.soundEffects[var1 + 1]; - Client.unknownSoundValues1[var1] = Client.unknownSoundValues1[var1 + 1]; + Client.queuedSoundEffectLoops[var1] = Client.queuedSoundEffectLoops[var1 + 1]; Client.queuedSoundEffectDelays[var1] = Client.queuedSoundEffectDelays[var1 + 1]; Client.soundLocations[var1] = Client.soundLocations[var1 + 1]; } diff --git a/runescape-client/src/main/java/WorldMapIcon2.java b/runescape-client/src/main/java/WorldMapIcon2.java index 5a6b13156c..4ed41ff111 100644 --- a/runescape-client/src/main/java/WorldMapIcon2.java +++ b/runescape-client/src/main/java/WorldMapIcon2.java @@ -13,19 +13,16 @@ public class WorldMapIcon2 extends AbstractWorldMapIcon { @ObfuscatedGetter( intValue = -985436813 ) - @Export("__m") final int __m; @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lav;" ) - @Export("__f") final WorldMapRegion __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -25914375 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -37,13 +34,11 @@ public class WorldMapIcon2 extends AbstractWorldMapIcon { @ObfuscatedGetter( intValue = 927871683 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -1431936619 ) - @Export("__u") int __u; @ObfuscatedSignature( @@ -97,7 +92,6 @@ public class WorldMapIcon2 extends AbstractWorldMapIcon { signature = "(I)V", garbageValue = "-806344204" ) - @Export("__z_27") void __z_27() { this.__q = class50.getObjectDefinition(this.__m).transform().mapIconId; this.label0 = this.__f.__ab_56(ViewportMouse.getWorldMapElement(this.__q)); diff --git a/runescape-client/src/main/java/WorldMapLabel.java b/runescape-client/src/main/java/WorldMapLabel.java index 01bb187020..2aa8c12cc7 100644 --- a/runescape-client/src/main/java/WorldMapLabel.java +++ b/runescape-client/src/main/java/WorldMapLabel.java @@ -21,7 +21,6 @@ public class WorldMapLabel { @ObfuscatedGetter( intValue = -1536028937 ) - @Export("__aj_e") public static int __aj_e; @ObfuscatedName("m") @Export("text") @@ -169,6 +168,7 @@ public class WorldMapLabel { signature = "(I)[Llq;", garbageValue = "-1374541046" ) + @Export("createIndexedSpriteArray") public static IndexedSprite[] createIndexedSpriteArray() { IndexedSprite[] var0 = new IndexedSprite[class328.indexedSpriteCount]; diff --git a/runescape-client/src/main/java/WorldMapLabelSize.java b/runescape-client/src/main/java/WorldMapLabelSize.java index 43ffdb668a..3730917588 100644 --- a/runescape-client/src/main/java/WorldMapLabelSize.java +++ b/runescape-client/src/main/java/WorldMapLabelSize.java @@ -35,31 +35,26 @@ public class WorldMapLabelSize { @ObfuscatedSignature( signature = "Lit;" ) - @Export("__s_dq") static IndexCache __s_dq; @ObfuscatedName("fi") @ObfuscatedGetter( intValue = 1577759565 ) - @Export("__s_fi") static int __s_fi; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 1252293513 ) - @Export("__w") final int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = 707828941 ) - @Export("__o") final int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -422937451 ) - @Export("__u") final int __u; static { @@ -79,7 +74,6 @@ public class WorldMapLabelSize { signature = "(FI)Z", garbageValue = "2107231705" ) - @Export("__f_14") boolean __f_14(float var1) { return var1 >= (float)this.__u; } diff --git a/runescape-client/src/main/java/WorldMapManager.java b/runescape-client/src/main/java/WorldMapManager.java index cab85b879f..7388645bbb 100644 --- a/runescape-client/src/main/java/WorldMapManager.java +++ b/runescape-client/src/main/java/WorldMapManager.java @@ -40,7 +40,6 @@ public final class WorldMapManager { @Export("regions") WorldMapRegion[][] regions; @ObfuscatedName("g") - @Export("__g") HashMap __g; @ObfuscatedName("l") @ObfuscatedSignature( @@ -52,13 +51,11 @@ public final class WorldMapManager { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__e") final AbstractIndexCache __e; @ObfuscatedName("x") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__x") final AbstractIndexCache __x; @ObfuscatedName("d") @Export("fonts") @@ -79,19 +76,16 @@ public final class WorldMapManager { @ObfuscatedGetter( intValue = 1729323633 ) - @Export("__i") int __i; @ObfuscatedName("a") @ObfuscatedGetter( intValue = -395718741 ) - @Export("__a") int __a; @ObfuscatedName("z") @ObfuscatedGetter( intValue = 1085359673 ) - @Export("__z") public int __z; @ObfuscatedSignature( @@ -196,7 +190,6 @@ public final class WorldMapManager { signature = "(IIIIIIIII)V", garbageValue = "1619301748" ) - @Export("__q_72") public final void __q_72(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { int[] var9 = Rasterizer2D.Rasterizer2D_pixels; int var10 = Rasterizer2D.Rasterizer2D_width; @@ -243,7 +236,6 @@ public final class WorldMapManager { signature = "(IIIIIIIILjava/util/HashSet;Ljava/util/HashSet;IIZB)V", garbageValue = "-71" ) - @Export("__w_73") public final void __w_73(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, HashSet var9, HashSet var10, int var11, int var12, boolean var13) { class22 var14 = this.method643(var1, var2, var3, var4); float var15 = this.getPixelsPerTile(var7 - var5, var3 - var1); @@ -318,7 +310,6 @@ public final class WorldMapManager { signature = "(IIIIIIIIIII)Ljava/util/List;", garbageValue = "1185703832" ) - @Export("__u_74") public List __u_74(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10) { LinkedList var11 = new LinkedList(); if(!this.isLoaded0) { @@ -514,6 +505,7 @@ public final class WorldMapManager { signature = "(II)Z", garbageValue = "-1344882321" ) + @Export("isWidgetMenuOpcode") static boolean isWidgetMenuOpcode(int var0) { return var0 == 57 || var0 == 58 || var0 == 1007 || var0 == 25 || var0 == 30; } diff --git a/runescape-client/src/main/java/WorldMapRegion.java b/runescape-client/src/main/java/WorldMapRegion.java index 12258d07ae..9df1dc4a80 100644 --- a/runescape-client/src/main/java/WorldMapRegion.java +++ b/runescape-client/src/main/java/WorldMapRegion.java @@ -17,7 +17,6 @@ public class WorldMapRegion { @ObfuscatedSignature( signature = "Lec;" ) - @Export("__av_o") public static DemotingHashTable __av_o; @ObfuscatedName("u") @ObfuscatedGetter( @@ -37,19 +36,16 @@ public class WorldMapRegion { ) class15 field239; @ObfuscatedName("e") - @Export("__e") LinkedList __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -120515153 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = 415972873 ) - @Export("__d") int __d; @ObfuscatedName("k") @Export("iconsList") @@ -80,7 +76,6 @@ public class WorldMapRegion { signature = "(IIIB)V", garbageValue = "-87" ) - @Export("__w_40") void __w_40(int var1, int var2, int var3) { Sprite var4 = class13.method164(this.x, this.y, this.__d); if(var4 != null) { @@ -109,7 +104,6 @@ public class WorldMapRegion { signature = "(Ljava/util/HashSet;Ljava/util/List;B)V", garbageValue = "-47" ) - @Export("__u_41") void __u_41(HashSet var1, List var2) { this.iconsMap.clear(); Iterator var3 = var1.iterator(); @@ -208,7 +202,6 @@ public class WorldMapRegion { signature = "(B)V", garbageValue = "5" ) - @Export("__e_42") void __e_42() { Iterator var1 = this.iconsMap.values().iterator(); @@ -226,7 +219,6 @@ public class WorldMapRegion { signature = "(Ljava/util/List;I)V", garbageValue = "128876606" ) - @Export("__x_43") void __x_43(List var1) { Iterator var2 = var1.iterator(); @@ -245,7 +237,6 @@ public class WorldMapRegion { signature = "(I)V", garbageValue = "1543354181" ) - @Export("__d_44") void __d_44() { if(this.field239 != null) { this.field239.method282(); @@ -265,7 +256,6 @@ public class WorldMapRegion { signature = "(Lir;B)Z", garbageValue = "2" ) - @Export("__a_45") boolean __a_45(AbstractIndexCache var1) { if(this.field239 != null) { this.field239.method263(var1); @@ -343,7 +333,6 @@ public class WorldMapRegion { signature = "(IIILjava/util/HashSet;I)V", garbageValue = "893970699" ) - @Export("__j_46") void __j_46(int var1, int var2, int var3, HashSet var4) { if(var4 == null) { var4 = new HashSet(); @@ -358,7 +347,6 @@ public class WorldMapRegion { signature = "(Ljava/util/HashSet;IIB)V", garbageValue = "-70" ) - @Export("__s_47") void __s_47(HashSet var1, int var2, int var3) { Iterator var4 = this.iconsMap.values().iterator(); @@ -757,7 +745,6 @@ public class WorldMapRegion { signature = "(IILjava/util/HashSet;IB)V", garbageValue = "0" ) - @Export("__aq_48") void __aq_48(int var1, int var2, HashSet var3, int var4) { float var5 = (float)var4 / 64.0F; float var6 = var5 / 2.0F; @@ -786,7 +773,6 @@ public class WorldMapRegion { signature = "(Ljava/util/HashSet;III)V", garbageValue = "781854370" ) - @Export("__aj_49") void __aj_49(HashSet var1, int var2, int var3) { Iterator var4 = this.iconsList.iterator(); @@ -807,7 +793,6 @@ public class WorldMapRegion { signature = "(Lic;IIIIB)V", garbageValue = "92" ) - @Export("__av_50") void __av_50(WorldMapElement var1, int var2, int var3, int var4, int var5) { Sprite var6 = var1.getSprite(false); if(var6 != null) { @@ -825,7 +810,6 @@ public class WorldMapRegion { signature = "(Lak;IIFI)V", garbageValue = "-1283733783" ) - @Export("__ar_51") void __ar_51(AbstractWorldMapIcon var1, int var2, int var3, float var4) { WorldMapElement var5 = ViewportMouse.getWorldMapElement(var1.__m_15()); this.__ac_52(var5, var2, var3); @@ -837,7 +821,6 @@ public class WorldMapRegion { signature = "(Lic;III)V", garbageValue = "423173487" ) - @Export("__ac_52") void __ac_52(WorldMapElement var1, int var2, int var3) { Sprite var4 = var1.getSprite(false); if(var4 != null) { @@ -853,7 +836,6 @@ public class WorldMapRegion { signature = "(Lak;Lic;IIFI)V", garbageValue = "-1237576843" ) - @Export("__ay_53") void __ay_53(AbstractWorldMapIcon var1, WorldMapElement var2, int var3, int var4, float var5) { WorldMapLabel var6 = var1.__f_16(); if(var6 != null) { @@ -869,7 +851,6 @@ public class WorldMapRegion { signature = "(IILjava/util/HashSet;IB)V", garbageValue = "-17" ) - @Export("__ah_54") void __ah_54(int var1, int var2, HashSet var3, int var4) { float var5 = (float)var4 / 64.0F; Iterator var6 = this.iconsList.iterator(); @@ -926,7 +907,6 @@ public class WorldMapRegion { signature = "(II)Laj;", garbageValue = "598030754" ) - @Export("__al_55") WorldMapLabel __al_55(int var1) { WorldMapElement var2 = ViewportMouse.getWorldMapElement(var1); return this.__ab_56(var2); @@ -937,7 +917,6 @@ public class WorldMapRegion { signature = "(Lic;B)Laj;", garbageValue = "59" ) - @Export("__ab_56") WorldMapLabel __ab_56(WorldMapElement var1) { if(var1.__l != null && this.fonts != null && this.fonts.get(WorldMapLabelSize.WorldMapLabelSize_small) != null) { WorldMapLabelSize var2 = WorldMapLabelSize.method195(var1.textSize); @@ -976,7 +955,6 @@ public class WorldMapRegion { signature = "(IIIIII)Ljava/util/List;", garbageValue = "-1237576843" ) - @Export("__ae_57") List __ae_57(int var1, int var2, int var3, int var4, int var5) { LinkedList var6 = new LinkedList(); if(var4 >= var1 && var5 >= var2) { @@ -1027,7 +1005,6 @@ public class WorldMapRegion { signature = "(IIIII)V", garbageValue = "-1516512827" ) - @Export("__ad_58") void __ad_58(int var1, int var2, int var3, int var4) { var3 %= 4; if(var3 == 0) { diff --git a/runescape-client/src/main/java/WorldMapSection0.java b/runescape-client/src/main/java/WorldMapSection0.java index da7aa7b568..6f10a54e08 100644 --- a/runescape-client/src/main/java/WorldMapSection0.java +++ b/runescape-client/src/main/java/WorldMapSection0.java @@ -11,94 +11,78 @@ public class WorldMapSection0 implements WorldMapSection { @ObfuscatedGetter( intValue = -1946112139 ) - @Export("__y_sn") static int __y_sn; @ObfuscatedName("p") - @Export("__y_p") static int[] __y_p; @ObfuscatedName("m") @ObfuscatedGetter( intValue = -2011838881 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 1299225715 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 82600709 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -477370575 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -671345527 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = 529427495 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = -150870205 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = 1009718107 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -1022177315 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -1397517463 ) - @Export("__x") int __x; @ObfuscatedName("d") @ObfuscatedGetter( intValue = -799353317 ) - @Export("__d") int __d; @ObfuscatedName("k") @ObfuscatedGetter( intValue = -1388959491 ) - @Export("__k") int __k; @ObfuscatedName("n") @ObfuscatedGetter( intValue = -1657956317 ) - @Export("surfaceOffsetY") int __n; @ObfuscatedName("i") @ObfuscatedGetter( intValue = 1345061881 ) - @Export("__i") int __i; @ObfuscatedName("m") @@ -106,6 +90,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(Lag;I)V", garbageValue = "1384899025" ) + @Export("expandBounds") public void expandBounds(WorldMapArea var1) { if(var1.minX0 > this.__o) { var1.minX0 = this.__o; @@ -130,6 +115,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(IIIB)Z", garbageValue = "93" ) + @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { return var1 >= this.__m && var1 < this.__m + this.__f?var2 >= (this.__q << 6) + (this.__g << 3) && var2 <= (this.__q << 6) + (this.__e << 3) + 7 && var3 >= (this.__w << 6) + (this.__l << 3) && var3 <= (this.__w << 6) + (this.__x << 3) + 7:false; } @@ -139,6 +125,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(IIB)Z", garbageValue = "4" ) + @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >= (this.__o << 6) + (this.__d << 3) && var1 <= (this.__o << 6) + (this.__n << 3) + 7 && var2 >= (this.__u << 6) + (this.__k << 3) && var2 <= (this.__u << 6) + (this.__i << 3) + 7; } @@ -148,6 +135,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(IIII)[I", garbageValue = "1545934424" ) + @Export("position") public int[] position(int var1, int var2, int var3) { if(!this.containsCoord(var1, var2, var3)) { return null; @@ -162,6 +150,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(III)Lhu;", garbageValue = "-1916486802" ) + @Export("coord") public TileLocation coord(int var1, int var2) { if(!this.containsPosition(var1, var2)) { return null; @@ -177,6 +166,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(Lgr;B)V", garbageValue = "-113" ) + @Export("read") public void read(Buffer var1) { this.__m = var1.readUnsignedByte(); this.__f = var1.readUnsignedByte(); @@ -200,7 +190,6 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(I)V", garbageValue = "1967186894" ) - @Export("__g_25") void __g_25() { } @@ -209,6 +198,7 @@ public class WorldMapSection0 implements WorldMapSection { signature = "(I)V", garbageValue = "-2102591569" ) + @Export("savePreferences") static void savePreferences() { AccessFile var0 = null; diff --git a/runescape-client/src/main/java/WorldMapSection1.java b/runescape-client/src/main/java/WorldMapSection1.java index 5e531807a7..8661c099e2 100644 --- a/runescape-client/src/main/java/WorldMapSection1.java +++ b/runescape-client/src/main/java/WorldMapSection1.java @@ -20,7 +20,6 @@ public class WorldMapSection1 implements WorldMapSection { @ObfuscatedGetter( intValue = -1516124929 ) - @Export("__as_ey") static int __as_ey; @ObfuscatedName("ha") @ObfuscatedGetter( @@ -32,61 +31,51 @@ public class WorldMapSection1 implements WorldMapSection { @ObfuscatedGetter( intValue = -1971304641 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = 1483447179 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -1875803617 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 284566685 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = -1513010233 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -1383826035 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 1526007343 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = -890169045 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = -1797724181 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = 325777555 ) - @Export("__x") int __x; @ObfuscatedName("m") @@ -94,6 +83,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(Lag;I)V", garbageValue = "1384899025" ) + @Export("expandBounds") public void expandBounds(WorldMapArea var1) { if(var1.minX0 > this.__o) { var1.minX0 = this.__o; @@ -118,6 +108,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(IIIB)Z", garbageValue = "93" ) + @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { return var1 >= this.__m && var1 < this.__m + this.__f?var2 >= (this.__q << 6) + (this.__g << 3) && var2 <= (this.__q << 6) + (this.__g << 3) + 7 && var3 >= (this.__w << 6) + (this.__l << 3) && var3 <= (this.__w << 6) + (this.__l << 3) + 7:false; } @@ -127,6 +118,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(IIB)Z", garbageValue = "4" ) + @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >= (this.__o << 6) + (this.__e << 3) && var1 <= (this.__o << 6) + (this.__e << 3) + 7 && var2 >= (this.__u << 6) + (this.__x << 3) && var2 <= (this.__u << 6) + (this.__x << 3) + 7; } @@ -136,6 +128,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(IIII)[I", garbageValue = "1545934424" ) + @Export("position") public int[] position(int var1, int var2, int var3) { if(!this.containsCoord(var1, var2, var3)) { return null; @@ -150,6 +143,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(III)Lhu;", garbageValue = "-1916486802" ) + @Export("coord") public TileLocation coord(int var1, int var2) { if(!this.containsPosition(var1, var2)) { return null; @@ -165,6 +159,7 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(Lgr;B)V", garbageValue = "-113" ) + @Export("read") public void read(Buffer var1) { this.__m = var1.readUnsignedByte(); this.__f = var1.readUnsignedByte(); @@ -184,7 +179,6 @@ public class WorldMapSection1 implements WorldMapSection { signature = "(I)V", garbageValue = "2026323437" ) - @Export("__g_84") void __g_84() { } diff --git a/runescape-client/src/main/java/WorldMapSection2.java b/runescape-client/src/main/java/WorldMapSection2.java index 63347180aa..ce26f97738 100644 --- a/runescape-client/src/main/java/WorldMapSection2.java +++ b/runescape-client/src/main/java/WorldMapSection2.java @@ -8,7 +8,6 @@ import net.runelite.mapping.ObfuscatedSignature; @Implements("WorldMapSection2") public class WorldMapSection2 implements WorldMapSection { @ObfuscatedName("l") - @Export("__ah_l") static int[] __ah_l; @ObfuscatedName("j") @Export("cacheDirectoryLocations") @@ -17,37 +16,31 @@ public class WorldMapSection2 implements WorldMapSection { @ObfuscatedGetter( intValue = -1561552223 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -245382089 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = -1024859679 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = 40495485 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = 982234927 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -1272330125 ) - @Export("__u") int __u; @ObfuscatedName("m") @@ -55,6 +48,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(Lag;I)V", garbageValue = "1384899025" ) + @Export("expandBounds") public void expandBounds(WorldMapArea var1) { if(var1.minX0 > this.__o) { var1.minX0 = this.__o; @@ -79,6 +73,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(IIIB)Z", garbageValue = "93" ) + @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { return var1 >= this.__m && var1 < this.__m + this.__f?var2 >> 6 == this.__q && var3 >> 6 == this.__w:false; } @@ -88,6 +83,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(IIB)Z", garbageValue = "4" ) + @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >> 6 == this.__o && var2 >> 6 == this.__u; } @@ -97,6 +93,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(IIII)[I", garbageValue = "1545934424" ) + @Export("position") public int[] position(int var1, int var2, int var3) { if(!this.containsCoord(var1, var2, var3)) { return null; @@ -111,6 +108,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(III)Lhu;", garbageValue = "-1916486802" ) + @Export("coord") public TileLocation coord(int var1, int var2) { if(!this.containsPosition(var1, var2)) { return null; @@ -126,6 +124,7 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(Lgr;B)V", garbageValue = "-113" ) + @Export("read") public void read(Buffer var1) { this.__m = var1.readUnsignedByte(); this.__f = var1.readUnsignedByte(); @@ -141,7 +140,6 @@ public class WorldMapSection2 implements WorldMapSection { signature = "(I)V", garbageValue = "-1602858772" ) - @Export("__g_65") void __g_65() { } diff --git a/runescape-client/src/main/java/WorldMapSection3.java b/runescape-client/src/main/java/WorldMapSection3.java index 41bd777ed2..77c5862ad7 100644 --- a/runescape-client/src/main/java/WorldMapSection3.java +++ b/runescape-client/src/main/java/WorldMapSection3.java @@ -20,67 +20,56 @@ public class WorldMapSection3 implements WorldMapSection { @ObfuscatedGetter( intValue = -948290091 ) - @Export("__p_go") static int __p_go; @ObfuscatedName("m") @ObfuscatedGetter( intValue = 1389733201 ) - @Export("__m") int __m; @ObfuscatedName("f") @ObfuscatedGetter( intValue = -1622972483 ) - @Export("__f") int __f; @ObfuscatedName("q") @ObfuscatedGetter( intValue = 702057599 ) - @Export("__q") int __q; @ObfuscatedName("w") @ObfuscatedGetter( intValue = -1068088609 ) - @Export("__w") int __w; @ObfuscatedName("o") @ObfuscatedGetter( intValue = 1257151629 ) - @Export("__o") int __o; @ObfuscatedName("u") @ObfuscatedGetter( intValue = -1351623663 ) - @Export("__u") int __u; @ObfuscatedName("g") @ObfuscatedGetter( intValue = 1016557381 ) - @Export("__g") int __g; @ObfuscatedName("l") @ObfuscatedGetter( intValue = 884736611 ) - @Export("__l") int __l; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 395786901 ) - @Export("__e") int __e; @ObfuscatedName("x") @ObfuscatedGetter( intValue = -627081155 ) - @Export("__x") int __x; @ObfuscatedName("m") @@ -88,6 +77,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(Lag;I)V", garbageValue = "1384899025" ) + @Export("expandBounds") public void expandBounds(WorldMapArea var1) { if(var1.minX0 > this.__g) { var1.minX0 = this.__g; @@ -112,6 +102,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(IIIB)Z", garbageValue = "93" ) + @Export("containsCoord") public boolean containsCoord(int var1, int var2, int var3) { return var1 >= this.__m && var1 < this.__m + this.__f?var2 >> 6 >= this.__q && var2 >> 6 <= this.__o && var3 >> 6 >= this.__w && var3 >> 6 <= this.__u:false; } @@ -121,6 +112,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(IIB)Z", garbageValue = "4" ) + @Export("containsPosition") public boolean containsPosition(int var1, int var2) { return var1 >> 6 >= this.__g && var1 >> 6 <= this.__e && var2 >> 6 >= this.__l && var2 >> 6 <= this.__x; } @@ -130,6 +122,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(IIII)[I", garbageValue = "1545934424" ) + @Export("position") public int[] position(int var1, int var2, int var3) { if(!this.containsCoord(var1, var2, var3)) { return null; @@ -144,6 +137,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(III)Lhu;", garbageValue = "-1916486802" ) + @Export("coord") public TileLocation coord(int var1, int var2) { if(!this.containsPosition(var1, var2)) { return null; @@ -159,6 +153,7 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(Lgr;B)V", garbageValue = "-113" ) + @Export("read") public void read(Buffer var1) { this.__m = var1.readUnsignedByte(); this.__f = var1.readUnsignedByte(); @@ -178,7 +173,6 @@ public class WorldMapSection3 implements WorldMapSection { signature = "(B)V", garbageValue = "-126" ) - @Export("__g_38") void __g_38() { } diff --git a/runescape-client/src/main/java/WorldMapSectionType.java b/runescape-client/src/main/java/WorldMapSectionType.java index 1a2ecc9c35..25bac17559 100644 --- a/runescape-client/src/main/java/WorldMapSectionType.java +++ b/runescape-client/src/main/java/WorldMapSectionType.java @@ -12,25 +12,21 @@ public enum WorldMapSectionType implements Enumerated { @ObfuscatedSignature( signature = "Lh;" ) - @Export("__h_m") __h_m(1, (byte)0), @ObfuscatedName("f") @ObfuscatedSignature( signature = "Lh;" ) - @Export("__h_f") __h_f(0, (byte)1), @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lh;" ) - @Export("__h_q") __h_q(3, (byte)2), @ObfuscatedName("w") @ObfuscatedSignature( signature = "Lh;" ) - @Export("__h_w") __h_w(2, (byte)3); @ObfuscatedName("e") @ObfuscatedSignature( @@ -39,7 +35,6 @@ public enum WorldMapSectionType implements Enumerated { @Export("logoSprite") static IndexedSprite logoSprite; @ObfuscatedName("n") - @Export("__h_n") static int[] __h_n; @ObfuscatedName("gc") @ObfuscatedSignature( @@ -67,6 +62,7 @@ public enum WorldMapSectionType implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } diff --git a/runescape-client/src/main/java/class1.java b/runescape-client/src/main/java/class1.java index 9a5afd50a3..7e78c1a9c0 100644 --- a/runescape-client/src/main/java/class1.java +++ b/runescape-client/src/main/java/class1.java @@ -8,7 +8,6 @@ final class class1 implements class0 { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__f_m") public static AbstractIndexCache __f_m; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/class102.java b/runescape-client/src/main/java/class102.java index 0d10655c77..5099b3aa94 100644 --- a/runescape-client/src/main/java/class102.java +++ b/runescape-client/src/main/java/class102.java @@ -4,19 +4,14 @@ import net.runelite.mapping.ObfuscatedName; @ObfuscatedName("ca") public class class102 { @ObfuscatedName("m") - @Export("__ca_m") static final int[] __ca_m; @ObfuscatedName("f") - @Export("__ca_f") static final float[] __ca_f; @ObfuscatedName("x") - @Export("__ca_x") static int[] __ca_x; @ObfuscatedName("d") - @Export("__ca_d") static int[] __ca_d; @ObfuscatedName("k") - @Export("__ca_k") static boolean[] __ca_k; @ObfuscatedName("q") int[] field1353; diff --git a/runescape-client/src/main/java/class12.java b/runescape-client/src/main/java/class12.java index 7447f2a24c..f3808368eb 100644 --- a/runescape-client/src/main/java/class12.java +++ b/runescape-client/src/main/java/class12.java @@ -9,7 +9,6 @@ final class class12 implements Comparator { @ObfuscatedSignature( signature = "Lho;" ) - @Export("__n_n") static Widget __n_n; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/class13.java b/runescape-client/src/main/java/class13.java index 4b67531628..bd6ef3a987 100644 --- a/runescape-client/src/main/java/class13.java +++ b/runescape-client/src/main/java/class13.java @@ -6,7 +6,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("i") public class class13 { @ObfuscatedName("x") - @Export("__i_x") static int[] __i_x; @ObfuscatedName("k") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/class15.java b/runescape-client/src/main/java/class15.java index 5bb42bfc02..0bcb48c166 100644 --- a/runescape-client/src/main/java/class15.java +++ b/runescape-client/src/main/java/class15.java @@ -9,7 +9,6 @@ public class class15 extends class21 { @ObfuscatedGetter( longValue = 3423502126894795079L ) - @Export("__z_si") static long __z_si; @ObfuscatedName("j") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/class157.java b/runescape-client/src/main/java/class157.java index c4948607bb..4f2d436c49 100644 --- a/runescape-client/src/main/java/class157.java +++ b/runescape-client/src/main/java/class157.java @@ -9,7 +9,6 @@ public class class157 extends AbstractUserComparator { @ObfuscatedGetter( intValue = 1006519291 ) - @Export("__fw_nm") static int __fw_nm; @ObfuscatedName("m") final boolean field1969; diff --git a/runescape-client/src/main/java/class159.java b/runescape-client/src/main/java/class159.java index 8018fc0c88..f38ef0ffc0 100644 --- a/runescape-client/src/main/java/class159.java +++ b/runescape-client/src/main/java/class159.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -46,6 +47,7 @@ public enum class159 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field1981; } diff --git a/runescape-client/src/main/java/class16.java b/runescape-client/src/main/java/class16.java index 7557082153..ad03754107 100644 --- a/runescape-client/src/main/java/class16.java +++ b/runescape-client/src/main/java/class16.java @@ -14,6 +14,7 @@ public class class16 { @ObfuscatedSignature( signature = "Lbp;" ) + @Export("loginScreenRunesAnimation") static LoginScreenAnimation loginScreenRunesAnimation; @ObfuscatedName("dv") @ObfuscatedSignature( @@ -208,7 +209,7 @@ public class class16 { var10 = var7 + 1; if(Canvas.localPlayer.pathX[0] >= var3 - var10 && Canvas.localPlayer.pathX[0] <= var10 + var3 && Canvas.localPlayer.pathY[0] >= var38 - var10 && Canvas.localPlayer.pathY[0] <= var10 + var38 && Client.__client_qc != 0 && var8 > 0 && Client.soundEffectCount < 50) { Client.soundEffectIds[Client.soundEffectCount] = var9; - Client.unknownSoundValues1[Client.soundEffectCount] = var8; + Client.queuedSoundEffectLoops[Client.soundEffectCount] = var8; Client.queuedSoundEffectDelays[Client.soundEffectCount] = var5; Client.soundEffects[Client.soundEffectCount] = null; Client.soundLocations[Client.soundEffectCount] = var7 + (var38 << 8) + (var3 << 16); diff --git a/runescape-client/src/main/java/class168.java b/runescape-client/src/main/java/class168.java index a5fe73d5bc..4b534460d2 100644 --- a/runescape-client/src/main/java/class168.java +++ b/runescape-client/src/main/java/class168.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("fs") public class class168 { @ObfuscatedName("o") - @Export("__fs_o") public static File __fs_o; @ObfuscatedName("u") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/class171.java b/runescape-client/src/main/java/class171.java index fb214f2738..e097229418 100644 --- a/runescape-client/src/main/java/class171.java +++ b/runescape-client/src/main/java/class171.java @@ -11,16 +11,12 @@ public class class171 { @ObfuscatedGetter( intValue = -852697585 ) - @Export("__fo_ro") static int __fo_ro; @ObfuscatedName("m") - @Export("__fo_m") public static boolean __fo_m; @ObfuscatedName("f") - @Export("__fo_f") public static File __fo_f; @ObfuscatedName("q") - @Export("__fo_q") static Hashtable __fo_q; static { @@ -547,14 +543,14 @@ public class class171 { signature = "(IIIILjava/lang/String;I)V", garbageValue = "49247882" ) - static void method3494(int var0, int var1, int var2, int var3, String var4) { - Widget var5 = class204.getWidgetChild(var1, var2); + static void method3494(int opIndex, int parentID, int childID, int itemID, String target) { + Widget var5 = class204.getWidgetChild(parentID, childID); if(var5 != null) { if(var5.onOp != null) { ScriptEvent var6 = new ScriptEvent(); var6.widget = var5; - var6.opIndex = var0; - var6.targetName = var4; + var6.opIndex = opIndex; + var6.targetName = target; var6.args0 = var5.onOp; AbstractIndexCache.runScript(var6); } @@ -566,87 +562,87 @@ public class class171 { if(var11) { int var8 = class1.getWidgetClickMask(var5); - int var9 = var0 - 1; + int var9 = opIndex - 1; boolean var7 = (var8 >> var9 + 1 & 1) != 0; if(var7) { PacketBufferNode var10; - if(var0 == 1) { + if(opIndex == 1) { var10 = Interpreter.method1915(ClientPacket.__gs_bi, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 2) { + if(opIndex == 2) { var10 = Interpreter.method1915(ClientPacket.__gs_b, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 3) { + if(opIndex == 3) { var10 = Interpreter.method1915(ClientPacket.__gs_aa, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 4) { + if(opIndex == 4) { var10 = Interpreter.method1915(ClientPacket.__gs_y, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 5) { + if(opIndex == 5) { var10 = Interpreter.method1915(ClientPacket.__gs_ad, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 6) { + if(opIndex == 6) { var10 = Interpreter.method1915(ClientPacket.__gs_br, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 7) { + if(opIndex == 7) { var10 = Interpreter.method1915(ClientPacket.__gs_cu, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 8) { + if(opIndex == 8) { var10 = Interpreter.method1915(ClientPacket.__gs_a, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 9) { + if(opIndex == 9) { var10 = Interpreter.method1915(ClientPacket.__gs_cj, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } - if(var0 == 10) { + if(opIndex == 10) { var10 = Interpreter.method1915(ClientPacket.__gs_m, Client.packetWriter.isaacCipher); - var10.packetBuffer.writeInt(var1); - var10.packetBuffer.writeShort(var2); - var10.packetBuffer.writeShort(var3); + var10.packetBuffer.writeInt(parentID); + var10.packetBuffer.writeShort(childID); + var10.packetBuffer.writeShort(itemID); Client.packetWriter.__q_167(var10); } diff --git a/runescape-client/src/main/java/class204.java b/runescape-client/src/main/java/class204.java index f648d1f2b2..191a9e79af 100644 --- a/runescape-client/src/main/java/class204.java +++ b/runescape-client/src/main/java/class204.java @@ -5,16 +5,13 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("gx") public class class204 { @ObfuscatedName("x") - @Export("__gx_x") static final int[] __gx_x; @ObfuscatedName("d") - @Export("__gx_d") static final int[] __gx_d; @ObfuscatedName("n") @ObfuscatedSignature( signature = "Lkk;" ) - @Export("__gx_n") public static Font __gx_n; static { diff --git a/runescape-client/src/main/java/class21.java b/runescape-client/src/main/java/class21.java index 259d966766..6aa5d7d036 100644 --- a/runescape-client/src/main/java/class21.java +++ b/runescape-client/src/main/java/class21.java @@ -7,7 +7,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("b") public abstract class class21 { @ObfuscatedName("by") - @Export("__b_by") static String __b_by; @ObfuscatedName("m") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/class211.java b/runescape-client/src/main/java/class211.java index 8840cdf5b5..73bb469301 100644 --- a/runescape-client/src/main/java/class211.java +++ b/runescape-client/src/main/java/class211.java @@ -8,13 +8,10 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("hg") public class class211 { @ObfuscatedName("m") - @Export("__hg_m") static final String[][] __hg_m; @ObfuscatedName("f") - @Export("__hg_f") static final String[] __hg_f; @ObfuscatedName("q") - @Export("__hg_q") static Calendar __hg_q; @ObfuscatedName("em") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/class214.java b/runescape-client/src/main/java/class214.java index fb35600fda..c5924e20a2 100644 --- a/runescape-client/src/main/java/class214.java +++ b/runescape-client/src/main/java/class214.java @@ -9,13 +9,11 @@ public class class214 { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__hf_f") public static AbstractIndexCache __hf_f; @ObfuscatedName("q") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__hf_q") public static AbstractIndexCache __hf_q; @ObfuscatedName("w") @ObfuscatedSignature( @@ -27,16 +25,13 @@ public class class214 { @ObfuscatedGetter( intValue = -848833001 ) - @Export("__hf_o") public static int __hf_o; @ObfuscatedName("u") @ObfuscatedSignature( signature = "Lir;" ) - @Export("__hf_u") public static AbstractIndexCache __hf_u; @ObfuscatedName("k") - @Export("__hf_k") static int[] __hf_k; @ObfuscatedName("ko") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/class226.java b/runescape-client/src/main/java/class226.java index c4c22c4f78..6ae0e4e5b4 100644 --- a/runescape-client/src/main/java/class226.java +++ b/runescape-client/src/main/java/class226.java @@ -5,16 +5,12 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("ht") public class class226 { @ObfuscatedName("m") - @Export("__ht_m") public static final short[] __ht_m; @ObfuscatedName("f") - @Export("__ht_f") public static final short[][] __ht_f; @ObfuscatedName("q") - @Export("__ht_q") public static final short[] __ht_q; @ObfuscatedName("w") - @Export("__ht_w") public static final short[][] __ht_w; static { diff --git a/runescape-client/src/main/java/class227.java b/runescape-client/src/main/java/class227.java index 9b08e368b6..55b596870c 100644 --- a/runescape-client/src/main/java/class227.java +++ b/runescape-client/src/main/java/class227.java @@ -5,7 +5,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("hj") public class class227 { @ObfuscatedName("e") - @Export("__hj_e") public static short[] __hj_e; @ObfuscatedName("l") diff --git a/runescape-client/src/main/java/class229.java b/runescape-client/src/main/java/class229.java index a3db606284..3ee3edf4e1 100644 --- a/runescape-client/src/main/java/class229.java +++ b/runescape-client/src/main/java/class229.java @@ -5,7 +5,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("hz") public class class229 { @ObfuscatedName("l") - @Export("__hz_l") public static short[][] __hz_l; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/class230.java b/runescape-client/src/main/java/class230.java index 45abced5f0..320164629a 100644 --- a/runescape-client/src/main/java/class230.java +++ b/runescape-client/src/main/java/class230.java @@ -5,7 +5,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("hy") public class class230 { @ObfuscatedName("az") - @Export("__hy_az") protected static boolean __hy_az; @ObfuscatedName("q") diff --git a/runescape-client/src/main/java/class231.java b/runescape-client/src/main/java/class231.java index edbdbf067b..a448e63e70 100644 --- a/runescape-client/src/main/java/class231.java +++ b/runescape-client/src/main/java/class231.java @@ -125,10 +125,8 @@ public enum class231 implements Enumerated { @ObfuscatedGetter( intValue = -745071109 ) - @Export("__hb_sg") static int __hb_sg; @ObfuscatedName("av") - @Export("__hb_av") static java.awt.Font __hb_av; @ObfuscatedName("r") @ObfuscatedGetter( @@ -149,6 +147,7 @@ public enum class231 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field2820; } @@ -179,7 +178,8 @@ public enum class231 implements Enumerated { signature = "(Lcs;IIB)V", garbageValue = "1" ) - static final void method4520(MenuAction var0, int var1, int var2) { + @Export("processTempMenuAction") + static final void processTempMenuAction(MenuAction var0, int var1, int var2) { Actor.menuAction(var0.argument1, var0.argument2, var0.opcode, var0.argument0, var0.action, var0.action, var1, var2); } diff --git a/runescape-client/src/main/java/class248.java b/runescape-client/src/main/java/class248.java index 4e6b7a3c66..7d529fbf77 100644 --- a/runescape-client/src/main/java/class248.java +++ b/runescape-client/src/main/java/class248.java @@ -7,13 +7,11 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("iu") public class class248 { @ObfuscatedName("e") - @Export("__iu_e") static int[] __iu_e; @ObfuscatedName("n") @ObfuscatedGetter( intValue = 662119345 ) - @Export("__iu_n") static int __iu_n; @ObfuscatedName("m") final HashMap field3267; diff --git a/runescape-client/src/main/java/class249.java b/runescape-client/src/main/java/class249.java index e6ba48a937..05f3efda01 100644 --- a/runescape-client/src/main/java/class249.java +++ b/runescape-client/src/main/java/class249.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -41,6 +42,7 @@ public enum class249 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field3276; } diff --git a/runescape-client/src/main/java/class266.java b/runescape-client/src/main/java/class266.java index 7881dd6794..72071e4fc6 100644 --- a/runescape-client/src/main/java/class266.java +++ b/runescape-client/src/main/java/class266.java @@ -45,6 +45,7 @@ public enum class266 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field3530; } diff --git a/runescape-client/src/main/java/class27.java b/runescape-client/src/main/java/class27.java index b752bea56b..56f35f4e9d 100644 --- a/runescape-client/src/main/java/class27.java +++ b/runescape-client/src/main/java/class27.java @@ -13,7 +13,6 @@ public final class class27 { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__aq_k") public static AbstractIndexCache __aq_k; @ObfuscatedName("f") final int[] field225; @@ -49,6 +48,7 @@ public final class class27 { signature = "([BI)Lln;", garbageValue = "-143338910" ) + @Export("convertJpgToSprite") public static final Sprite convertJpgToSprite(byte[] var0) { BufferedImage var1 = null; diff --git a/runescape-client/src/main/java/class277.java b/runescape-client/src/main/java/class277.java index 2a92e19d7a..4842816eaa 100644 --- a/runescape-client/src/main/java/class277.java +++ b/runescape-client/src/main/java/class277.java @@ -8,7 +8,6 @@ public class class277 { @ObfuscatedSignature( signature = "Llq;" ) - @Export("__jn_by") static IndexedSprite __jn_by; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/class279.java b/runescape-client/src/main/java/class279.java index 2f80b4c89c..d04cc4cf14 100644 --- a/runescape-client/src/main/java/class279.java +++ b/runescape-client/src/main/java/class279.java @@ -8,7 +8,6 @@ public class class279 { @ObfuscatedSignature( signature = "[Lho;" ) - @Export("__jx_ne") static Widget[] __jx_ne; @ObfuscatedName("e") diff --git a/runescape-client/src/main/java/class3.java b/runescape-client/src/main/java/class3.java index 65dabeb01f..897fa6c136 100644 --- a/runescape-client/src/main/java/class3.java +++ b/runescape-client/src/main/java/class3.java @@ -9,7 +9,6 @@ public class class3 implements Enumerated { @ObfuscatedGetter( intValue = 1608439891 ) - @Export("__w_qs") static int __w_qs; @ObfuscatedName("m") @ObfuscatedSignature( @@ -65,6 +64,7 @@ public class class3 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.id; } diff --git a/runescape-client/src/main/java/class30.java b/runescape-client/src/main/java/class30.java index 04ce1a6141..77772fbde5 100644 --- a/runescape-client/src/main/java/class30.java +++ b/runescape-client/src/main/java/class30.java @@ -9,7 +9,6 @@ public class class30 { @ObfuscatedGetter( intValue = -1555836449 ) - @Export("__ar_qw") static int __ar_qw; @ObfuscatedName("m") @ObfuscatedSignature( @@ -65,6 +64,7 @@ public class class30 { signature = "(B)V", garbageValue = "49" ) + @Export("resetMenuEntries") static void resetMenuEntries() { Client.menuOptionsCount = 0; Client.isMenuOpen = false; diff --git a/runescape-client/src/main/java/class305.java b/runescape-client/src/main/java/class305.java index b28a55c0b0..c3c1e965b5 100644 --- a/runescape-client/src/main/java/class305.java +++ b/runescape-client/src/main/java/class305.java @@ -4,10 +4,8 @@ import net.runelite.mapping.ObfuscatedName; @ObfuscatedName("kb") public class class305 { @ObfuscatedName("q") - @Export("__kb_q") static final char[] __kb_q; @ObfuscatedName("w") - @Export("__kb_w") static final char[] __kb_w; static { diff --git a/runescape-client/src/main/java/class307.java b/runescape-client/src/main/java/class307.java index 060ec01941..dd819cd054 100644 --- a/runescape-client/src/main/java/class307.java +++ b/runescape-client/src/main/java/class307.java @@ -5,19 +5,14 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("kc") public class class307 { @ObfuscatedName("m") - @Export("__kc_m") public static char[] __kc_m; @ObfuscatedName("f") - @Export("__kc_f") static char[] __kc_f; @ObfuscatedName("q") - @Export("__kc_q") static char[] __kc_q; @ObfuscatedName("w") - @Export("__kc_w") static int[] __kc_w; @ObfuscatedName("g") - @Export("__kc_g") static byte[][][] __kc_g; @ObfuscatedName("n") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/class311.java b/runescape-client/src/main/java/class311.java index da433a2eab..e5f27d2836 100644 --- a/runescape-client/src/main/java/class311.java +++ b/runescape-client/src/main/java/class311.java @@ -14,7 +14,6 @@ public class class311 { @ObfuscatedGetter( intValue = -2077113503 ) - @Export("__ka_e") static int __ka_e; @ObfuscatedName("f") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/class313.java b/runescape-client/src/main/java/class313.java index 5dd381a8f5..1b7fea7a37 100644 --- a/runescape-client/src/main/java/class313.java +++ b/runescape-client/src/main/java/class313.java @@ -1,3 +1,4 @@ +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -71,6 +72,7 @@ public enum class313 implements Enumerated { signature = "(B)I", garbageValue = "83" ) + @Export("rsOrdinal") public int rsOrdinal() { return this.field3827; } diff --git a/runescape-client/src/main/java/class32.java b/runescape-client/src/main/java/class32.java index a5b80e69af..95bd7cf314 100644 --- a/runescape-client/src/main/java/class32.java +++ b/runescape-client/src/main/java/class32.java @@ -5,7 +5,6 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("ay") public class class32 { @ObfuscatedName("u") - @Export("__ay_u") static byte[][][] __ay_u; @ObfuscatedName("gj") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/class4.java b/runescape-client/src/main/java/class4.java index 325b6bbf36..bdc7d67388 100644 --- a/runescape-client/src/main/java/class4.java +++ b/runescape-client/src/main/java/class4.java @@ -8,7 +8,6 @@ final class class4 implements class0 { @ObfuscatedSignature( signature = "Lir;" ) - @Export("__o_m") public static AbstractIndexCache __o_m; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/class50.java b/runescape-client/src/main/java/class50.java index 41a84cb467..b88da2916a 100644 --- a/runescape-client/src/main/java/class50.java +++ b/runescape-client/src/main/java/class50.java @@ -7,10 +7,8 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("af") public class class50 { @ObfuscatedName("m") - @Export("__af_m") public static Applet __af_m; @ObfuscatedName("f") - @Export("__af_f") public static String __af_f; @ObfuscatedName("ei") @Export("worldHost") diff --git a/runescape-client/src/main/java/class54.java b/runescape-client/src/main/java/class54.java index 7f70234cea..75a8e68f79 100644 --- a/runescape-client/src/main/java/class54.java +++ b/runescape-client/src/main/java/class54.java @@ -9,7 +9,6 @@ public final class class54 { @ObfuscatedGetter( intValue = -1247107945 ) - @Export("__bs_nb") static int __bs_nb; @ObfuscatedName("q") diff --git a/runescape-client/src/main/java/class60.java b/runescape-client/src/main/java/class60.java index f35817664d..9eeaa4ca44 100644 --- a/runescape-client/src/main/java/class60.java +++ b/runescape-client/src/main/java/class60.java @@ -12,7 +12,6 @@ public class class60 { @Export("worldMap0") static WorldMap worldMap0; @ObfuscatedName("ar") - @Export("__bo_ar") static FontMetrics __bo_ar; @ObfuscatedName("m") diff --git a/runescape-client/src/main/java/class80.java b/runescape-client/src/main/java/class80.java index 49d74e779f..3c671e174b 100644 --- a/runescape-client/src/main/java/class80.java +++ b/runescape-client/src/main/java/class80.java @@ -6,10 +6,8 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("ce") public class class80 { @ObfuscatedName("o") - @Export("__ce_o") static final BigInteger __ce_o; @ObfuscatedName("u") - @Export("__ce_u") static final BigInteger __ce_u; static { diff --git a/runescape-client/src/main/java/class83.java b/runescape-client/src/main/java/class83.java index c112879d60..e9198a0915 100644 --- a/runescape-client/src/main/java/class83.java +++ b/runescape-client/src/main/java/class83.java @@ -9,16 +9,13 @@ import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("cm") public class class83 { @ObfuscatedName("m") - @Export("__cm_m") static final BigInteger __cm_m; @ObfuscatedName("f") - @Export("__cm_f") static final BigInteger __cm_f; @ObfuscatedName("e") @ObfuscatedGetter( intValue = 533653621 ) - @Export("__cm_e") public static int __cm_e; static {